(*
* Hedgewars, a free turn based strategy game
* Copyright (c) 2004-2012 Andrey Korotaev <unC0Rr@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*)
procedure internalStartGameWithParameters();
var tmp: LongInt;
begin
UserPathPrefix:= ParamStr(1);
cScreenWidth:= StrToInt(ParamStr(2));
cScreenHeight:= StrToInt(ParamStr(3));
cBits:= StrToInt(ParamStr(4));
ipcPort:= StrToInt(ParamStr(5));
cFullScreen:= ParamStr(6) = '1';
SetSound(ParamStr(7) = '1');
SetMusic(ParamStr(8) = '1');
SetVolume(StrToInt(ParamStr(9)));
cTimerInterval:= StrToInt(ParamStr(10));
PathPrefix:= ParamStr(11);
cShowFPS:= ParamStr(12) = '1';
cAltDamage:= ParamStr(13) = '1';
UserNick:= DecodeBase64(ParamStr(14));
cReducedQuality:= StrToInt(ParamStr(15));
tmp:= StrToInt(ParamStr(16));
GrayScale:= false;
if (tmp > 9) and (tmp < 16) then
begin
GrayScale:= true;
cStereoMode:= TStereoMode(max(0, min(ord(high(TStereoMode)), tmp-9)))
end
else if tmp <= 9 then
cStereoMode:= TStereoMode(max(0, min(ord(high(TStereoMode)), tmp)))
else
cStereoMode:= TStereoMode(max(0, min(ord(high(TStereoMode)), tmp-6)));
cLocaleFName:= ParamStr(17);
end;
{$IFDEF USE_VIDEO_RECORDING}
procedure internalStartVideoRecordingWithParameters();
begin
internalStartGameWithParameters();
GameType:= gmtRecord;
cVideoFramerateNum:= StrToInt(ParamStr(18));
cVideoFramerateDen:= StrToInt(ParamStr(19));
RecPrefix:= ParamStr(20);
cAVFormat:= ParamStr(21);
cVideoCodec:= ParamStr(22);
cVideoQuality:= StrToInt(ParamStr(23));
cAudioCodec:= ParamStr(24);
end;
{$ENDIF}
procedure DisplayUsage;
begin
WriteLn(stdout, 'Usage:');
WriteLn(stdout, '');
WriteLn(stdout, ' hwengine <path to user hedgewars folder> <path to global data folder> <path to replay file> [options]');
WriteLn(stdout, '');
WriteLn(stdout, 'where [options] are any of the following:');
WriteLn(stdout, ' --locale [path to language file]');
WriteLn(stdout, ' --width [screen width in pixels]');
WriteLn(stdout, ' --height [screen height in pixels]');
WriteLn(stdout, ' --depth [color depth]');
WriteLn(stdout, ' --volume [sound level]');
WriteLn(stdout, ' --time [number of seconds]');
WriteLn(stdout, ' --nomusic');
WriteLn(stdout, ' --nosound');
WriteLn(stdout, ' --fullscreen');
WriteLn(stdout, ' --showfps');
WriteLn(stdout, ' --altdmg');
WriteLn(stdout, ' --lowquality');
WriteLn(stdout, ' --stats-only');
WriteLn(stdout, ' --help');
WriteLn(stdout, '');
WriteLn(stdout, 'Deprecated options:');
WriteLn(stdout, ' --set-video [screen width] [screen height] [color dept]');
WriteLn(stdout, ' --set-audio [volume] [enable music] [enable sounds]');
WriteLn(stdout, ' --set-other [language file] [full screen] [show FPS]');
WriteLn(stdout, ' --set-multimedia [screen width] [screen height] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen]');
WriteLn(stdout, ' --set-everything [screen width] [screen height] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen] [show FPS] [alternate damage] [timer value] [reduced quality]');
WriteLn(stdout, '');
WriteLn(stdout, 'For a more detailed help and examples go to:');
WriteLn(stdout, 'http://code.google.com/p/hedgewars/wiki/CommandLineOptions');
end;
function getLongIntParameter(str:String; var paramIndex:LongInt; var wrongParameter:Boolean): LongInt;
var tmpInt, c: LongInt;
begin
paramIndex:= paramIndex + 1;
val(str, tmpInt, c);
wrongParameter:= c <> 0;
if wrongParameter then
WriteLn(stderr, 'ERROR: '+ParamStr(paramIndex-1)+' expects a number, you passed "'+str+'"');
getLongIntParameter:= tmpInt;
end;
function getStringParameter(str:String; var paramIndex:LongInt): String;
begin
paramIndex:= paramIndex + 1;
getStringParameter:= str;
end;
procedure parseClassicParameter(cmdArray: Array of String; size:LongInt; var paramIndex:LongInt); Forward;
function parseParameter(cmd:String; arg:String; var paramIndex:LongInt): Boolean;
const videoArray: Array [1..3] of String = ('--width','--height','--depth');
const audioArray: Array [1..3] of String = ('--volume','--nomusic','--nosound');
const otherArray: Array [1..3] of String = ('--locale','--fullscreen','--showfps');
const mediaArray: Array [1..8] of String = ('--width','--height','--depth','--volume','--nomusic','--nosound','--locale','--fullscreen');
const allArray: Array [1..12] of String = ('--width','--height','--depth','--volume','--nomusic','--nosound','--locale','--fullscreen','--showfps','--altdmg','--time','--lowquality');
begin
parseParameter:= false;
case cmd of
'--locale' : cLocaleFName := getStringParameter (arg, paramIndex);
'--width' : cScreenWidth := getLongIntParameter(arg, paramIndex, parseParameter);
'--height' : cScreenHeight := getLongIntParameter(arg, paramIndex, parseParameter);
'--depth' : cBits := getLongIntParameter(arg, paramIndex, parseParameter);
'--time' : cTimerInterval := getLongIntParameter(arg, paramIndex, parseParameter);
'--volume' : SetVolume ( getLongIntParameter(arg, paramIndex, parseParameter) );
'--nomusic' : SetMusic ( false );
'--nosound' : SetSound ( false );
'--fullscreen' : cFullScreen := true;
'--showfps' : cShowFPS := true;
'--altdmg' : cAltDamage := true;
'--lowquality' : cReducedQuality:= ($FFFFFFFF * getLongIntParameter(arg, paramIndex, parseParameter)) xor rqLowRes; //HACK!
'--set-video' : parseClassicParameter(videoArray,3,paramIndex);
'--set-audio' : parseClassicParameter(audioArray,3,paramIndex);
'--set-other' : parseClassicParameter(otherArray,3,paramIndex);
'--set-multimedia' : parseClassicParameter(mediaArray,8,paramIndex);
'--set-everything' : parseClassicParameter(allArray,12,paramIndex);
'--stats-only' : begin
cOnlyStats:= true;
SetSound(false);
SetMusic(false);
cReducedQuality:= $FFFFFFFF xor rqLowRes;
end;
'--gci' : begin // We had to make up all this saved space some how... \\
WriteLn(stdout, ' ');
WriteLn(stdout, ' /\\\\\\\\\\\\ /\\\\\\\\\ /\\\\\\\\\\\ ');
WriteLn(stdout, ' /\\\////////// /\\\//////// \/////\\\/// ');
WriteLn(stdout, ' /\\\ /\\\/ \/\\\ ');
WriteLn(stdout, ' \/\\\ /\\\\\\\ /\\\ \/\\\ ');
WriteLn(stdout, ' \/\\\ \/////\\\ \/\\\ \/\\\ ');
WriteLn(stdout, ' \/\\\ \/\\\ \//\\\ \/\\\ ');
WriteLn(stdout, ' \/\\\ \/\\\ \///\\\ \/\\\ ');
WriteLn(stdout, ' \//\\\\\\\\\\\\/ \////\\\\\\\\\ /\\\\\\\\\\\ ');
WriteLn(stdout, ' \//////////// \///////// \/////////// ');
WriteLn(stdout, ' ');
WriteLn(stdout, ' Command Line Parser Implementation by a Google Code-In Student ');
WriteLn(stdout, ' ASCII Art easter egg idea by @sheepluva ');
WriteLn(stdout, ' ');
end;
'--help' : begin
DisplayUsage();
GameType:= gmtSyntax;
end;
else
begin
WriteLn(stderr, 'ERROR: '+cmd+' is not a valid argument');
parseParameter:= true;
end
end;
end;
procedure parseClassicParameter(cmdArray: Array of String; size:LongInt; var paramIndex:LongInt);
var index, tmpInt: LongInt;
isBool: Boolean;
begin
index:= 0;
tmpInt:= 1;
while (index < size) do
begin
paramIndex:= paramIndex+1;
//This next line is a really strange (but short), way to check if the parameter is a boolean one
isBool:= true; case cmdArray[index] of '--nomusic':;'--nosound':;'--fullscreen':;'--showfps':;'--altdmg':;'--lowquality':; else isBool:= false; end;
if (not isBool) or ((ParamStr(paramIndex)='1') and (cmdArray[index]<>'--nomusic') and (cmdArray[index]<>'--nosound')) then
parseParameter(cmdArray[index], ParamStr(paramIndex), tmpInt);
//if isBool then
// paramIndex:= paramIndex+1;
index:= index+1;
end;
end;
procedure playReplayFileWithParameters();
var paramIndex, tmpInt: LongInt;
wrongParameter: boolean;
begin
UserPathPrefix:= ParamStr(1);
PathPrefix:= ParamStr(2);
recordFileName:= ParamStr(3);
paramIndex:= 4;
wrongParameter:= false;
while (paramIndex <= ParamCount) do
begin
if parseParameter( ParamStr(paramIndex), ParamStr(paramIndex+1), paramIndex) then
wrongParameter:= true;
paramIndex:= paramIndex+1;
end;
if wrongParameter = true then
begin
WriteLn(stderr, 'Please use --help to see possible arguments and their usage');
GameType:= gmtSyntax;
end
end;