diff -r 50fe80adbfcb -r 0b4ac686fc44 hedgewars/ArgParsers.inc --- a/hedgewars/ArgParsers.inc Tue Dec 18 20:48:37 2012 +0400 +++ b/hedgewars/ArgParsers.inc Fri Jan 04 21:44:40 2013 +0400 @@ -16,74 +16,40 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA *) - -procedure internalStartGameWithParameters(); -var tmp: LongInt; +procedure GciEasterEgg; 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; -{$IFDEF USE_S3D_RENDERING} - if (tmp > 9) and (tmp < 16) then - begin - // set the gray anaglyph rendering - GrayScale:= true; - cStereoMode:= TStereoMode(max(0, min(ord(high(TStereoMode)), tmp-9))) - end - else if tmp <= 9 then - // set the fullcolor anaglyph - cStereoMode:= TStereoMode(max(0, min(ord(high(TStereoMode)), tmp))) - else - // any other mode - cStereoMode:= TStereoMode(max(0, min(ord(high(TStereoMode)), tmp-6))); -{$ELSE} - cStereoMode:= smNone; -{$ENDIF} - cLocaleFName:= ParamStr(17); + 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; -{$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 [options]'); + WriteLn(stdout, 'Usage: hwengine [options]'); WriteLn(stdout, ''); - WriteLn(stdout, 'where [options] are any of the following:'); - WriteLn(stdout, ' --user-dir [path to user data folder]'); + WriteLn(stdout, 'where [options] can be any of the following:'); + WriteLn(stdout, ' --prefix [path to folder]'); + WriteLn(stdout, ' --user-prefix [path to folder]'); WriteLn(stdout, ' --locale [name of language file]'); - WriteLn(stdout, ' --width [screen width in pixels]'); - WriteLn(stdout, ' --height [screen height in pixels]'); + WriteLn(stdout, ' --nick [string]'); + WriteLn(stdout, ' --fullscreen-width [fullscreen width in pixels]'); + WriteLn(stdout, ' --fullscreen-height [fullscreen height in pixels]'); + WriteLn(stdout, ' --width [window width in pixels]'); + WriteLn(stdout, ' --height [window height in pixels]'); WriteLn(stdout, ' --volume [sound level]'); WriteLn(stdout, ' --frame-interval [milliseconds]'); + Writeln(stdout, ' --stereo [value]'); WriteLn(stdout, ' --raw-quality [flags]'); WriteLn(stdout, ' --low-quality'); WriteLn(stdout, ' --nomusic'); @@ -96,12 +62,85 @@ WriteLn(stdout, ''); WriteLn(stdout, 'For more detailed help and examples go to:'); WriteLn(stdout, 'http://code.google.com/p/hedgewars/wiki/CommandLineOptions'); + GameType:= gmtSyntax; +end; + +procedure setDepth(var paramIndex: LongInt); +begin + WriteLn(stdout, 'WARNING: --depth is a deprecated command, which could be removed in a future version!'); + WriteLn(stdout, ' This option no longer does anything, please consider removing it'); + WriteLn(stdout, ''); + inc(ParamIndex); +end; + +procedure statsOnlyGame; +begin + cOnlyStats:= true; + cReducedQuality:= $FFFFFFFF xor rqLowRes; + SetSound(false); + SetMusic(false); + SetVolume(0); +end; + +procedure setIpcPort(port: LongInt; var wrongParameter:Boolean); +begin + if isInternal then + ipcPort := port + else + begin + WriteLn(stderr, 'ERROR: use of --port is not allowed'); + wrongParameter := true; + end +end; + +function parseNick(nick: String): String; +begin + if isInternal then + parseNick:= DecodeBase64(nick) + else + parseNick:= nick; +end; + +procedure setStereoMode(tmp: LongInt); +begin + GrayScale:= false; +{$IFDEF USE_S3D_RENDERING} + if (tmp > 6) and (tmp < 13) then + begin + // set the gray anaglyph rendering + GrayScale:= true; + cStereoMode:= TStereoMode(max(0, min(ord(high(TStereoMode)), tmp-6))) + end + else if tmp <= 6 then + // set the fullcolor anaglyph + cStereoMode:= TStereoMode(max(0, min(ord(high(TStereoMode)), tmp))) + else + // any other mode + cStereoMode:= TStereoMode(max(0, min(ord(high(TStereoMode)), tmp-6))); +{$ELSE} + cStereoMode:= smNone; +{$ENDIF} +end; + +procedure startVideoRecording(var paramIndex: LongInt); +begin +{$IFDEF USE_VIDEO_RECORDING} + GameType:= gmtRecord; + inc(paramIndex); + cVideoFramerateNum:= StrToInt(ParamStr(paramIndex)); inc(paramIndex); + cVideoFramerateDen:= StrToInt(ParamStr(paramIndex)); inc(paramIndex); + RecPrefix:= ParamStr(paramIndex); inc(paramIndex); + cAVFormat:= ParamStr(paramIndex); inc(paramIndex); + cVideoCodec:= ParamStr(paramIndex); inc(paramIndex); + cVideoQuality:= StrToInt(ParamStr(paramIndex)); inc(paramIndex); + cAudioCodec:= ParamStr(paramIndex); inc(paramIndex); +{$ENDIF} end; function getLongIntParameter(str:String; var paramIndex:LongInt; var wrongParameter:Boolean): LongInt; var tmpInt, c: LongInt; begin - paramIndex:= paramIndex + 1; + inc(paramIndex); val(str, tmpInt, c); wrongParameter:= c <> 0; if wrongParameter then @@ -111,7 +150,7 @@ function getStringParameter(str:String; var paramIndex:LongInt; var wrongParameter:Boolean): String; begin - paramIndex:= paramIndex + 1; + inc(paramIndex); wrongParameter:= (str='') or (Copy(str,1,2) = '--'); if wrongParameter then WriteLn(stderr, 'ERROR: '+ParamStr(paramIndex-1)+' expects a string, you passed "'+str+'"'); @@ -122,16 +161,18 @@ 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'); -const reallyAll: array[0..21] of shortstring = ( - '--user-dir', '--locale', '--width', '--height', '--frame-interval', '--volume','--nomusic', '--nosound', - '--fullscreen', '--showfps', '--altdmg', '--low-quality', '--raw-quality', +const videoArray: Array [1..5] of String = ('--fullscreen-width','--fullscreen-height', '--width', '--height', '--depth'); + audioArray: Array [1..3] of String = ('--volume','--nomusic','--nosound'); + otherArray: Array [1..3] of String = ('--locale','--fullscreen','--showfps'); + mediaArray: Array [1..10] of String = ('--fullscreen-width', '--fullscreen-height', '--width', '--height', '--depth', '--volume','--nomusic','--nosound','--locale','--fullscreen'); + allArray: Array [1..14] of String = ('--fullscreen-width','--fullscreen-height', '--width', '--height', '--depth','--volume','--nomusic','--nosound','--locale','--fullscreen','--showfps','--altdmg','--frame-interval','--low-quality'); + reallyAll: array[0..30] of shortstring = ( + '--prefix', '--user-prefix', '--locale', '--fullscreen-width', '--fullscreen-height', '--width', + '--height', '--frame-interval', '--volume','--nomusic', '--nosound', + '--fullscreen', '--showfps', '--altdmg', '--low-quality', '--raw-quality', '--stereo', '--nick', {deprecated} '--depth', '--set-video', '--set-audio', '--set-other', '--set-multimedia', '--set-everything', - '--stats-only', '--gci', '--help'); + {internal} '--internal', '--port', '--recorder', '--landpreview', + {misc} '--stats-only', '--gci', '--help'); var cmdIndex: byte; begin parseParameter:= false; @@ -142,96 +183,157 @@ while (cmdIndex <= High(reallyAll)) and (cmd <> reallyAll[cmdIndex]) do inc(cmdIndex); case cmdIndex of - {--user-dir} 0 : UserPathPrefix := getStringParameter (arg, paramIndex, parseParameter); - {--locale} 1 : cLocaleFName := getStringParameter (arg, paramIndex, parseParameter); - {--width} 2 : cScreenWidth := getLongIntParameter(arg, paramIndex, parseParameter); - {--height} 3 : cScreenHeight := getLongIntParameter(arg, paramIndex, parseParameter); - {--frame-interval} 4 : cTimerInterval := getLongIntParameter(arg, paramIndex, parseParameter); - {--volume} 5 : SetVolume ( getLongIntParameter(arg, paramIndex, parseParameter) ); - {--nomusic} 6 : SetMusic ( false ); - {--nosound} 7 : SetSound ( false ); - {--fullscreen} 8 : cFullScreen := true; - {--showfps} 9 : cShowFPS := true; - {--altdmg} 10 : cAltDamage := true; - {--low-quality} 11 : cReducedQuality:= $FFFFFFFF xor rqLowRes; - {--raw-quality} 12 : cReducedQuality:= getLongIntParameter(arg, paramIndex, parseParameter); + {--prefix} 0 : PathPrefix := getStringParameter (arg, paramIndex, parseParameter); + {--user-prefix} 1 : UserPathPrefix := getStringParameter (arg, paramIndex, parseParameter); + {--locale} 2 : cLocaleFName := getStringParameter (arg, paramIndex, parseParameter); + {--fullscreen-width} 3 : cFullscreenWidth := getLongIntParameter(arg, paramIndex, parseParameter); + {--fullscreen-height} 4 : cFullscreenHeight := getLongIntParameter(arg, paramIndex, parseParameter); + {--width} 5 : cWindowedWidth := getLongIntParameter(arg, paramIndex, parseParameter); + {--height} 6 : cWindowedHeight := getLongIntParameter(arg, paramIndex, parseParameter); + {--frame-interval} 7 : cTimerInterval := getLongIntParameter(arg, paramIndex, parseParameter); + {--volume} 8 : SetVolume ( getLongIntParameter(arg, paramIndex, parseParameter) ); + {--nomusic} 9 : SetMusic ( false ); + {--nosound} 10 : SetSound ( false ); + {--fullscreen} 11 : cFullScreen := true; + {--showfps} 12 : cShowFPS := true; + {--altdmg} 13 : cAltDamage := true; + {--low-quality} 14 : cReducedQuality := $FFFFFFFF xor rqLowRes; + {--raw-quality} 15 : cReducedQuality := getLongIntParameter(arg, paramIndex, parseParameter); + {--stereo} 16 : setStereoMode ( getLongIntParameter(arg, paramIndex, parseParameter) ); + {--nick} 17 : UserNick := parseNick( getStringParameter(arg, paramIndex, parseParameter) ); {deprecated options} - {--depth} 13 : cBits := getLongIntParameter(arg, paramIndex, parseParameter); - {--set-video} 14 : parseClassicParameter(videoArray,3,paramIndex); - {--set-audio} 15 : parseClassicParameter(audioArray,3,paramIndex); - {--set-other} 16 : parseClassicParameter(otherArray,3,paramIndex); - {--set-multimedia} 17 : parseClassicParameter(mediaArray,8,paramIndex); - {--set-everything} 18 : parseClassicParameter(allArray,12,paramIndex); + {--depth} 18 : setDepth(paramIndex); + {--set-video} 19 : parseClassicParameter(videoArray,5,paramIndex); + {--set-audio} 20 : parseClassicParameter(audioArray,3,paramIndex); + {--set-other} 21 : parseClassicParameter(otherArray,3,paramIndex); + {--set-multimedia} 22 : parseClassicParameter(mediaArray,10,paramIndex); + {--set-everything} 23 : parseClassicParameter(allArray,14,paramIndex); + {"internal" options} + {--internal} 24 : {note it, but do nothing}; + {--port} 25 : setIpcPort( getLongIntParameter(arg, paramIndex, parseParameter), parseParameter ); + {--recorder} 26 : startVideoRecording(paramIndex); + {--landpreview} 27 : GameType := gmtLandPreview; {anything else} - {--stats-only} 19 : begin - cOnlyStats:= true; - cReducedQuality:= $FFFFFFFF xor rqLowRes; - SetSound(false); - end; - {--gci} 20 : 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} 21 : begin - DisplayUsage(); - GameType:= gmtSyntax; - end; + {--stats-only} 28 : statsOnlyGame(); + {--gci} 29 : GciEasterEgg(); + {--help} 30 : DisplayUsage(); else begin - WriteLn(stderr, 'ERROR: '+cmd+' is not a valid argument'); - parseParameter:= true; - end + //Asusme the first "non parameter" is the replay file, anything else is invalid + if (recordFileName = '') and (Copy(cmd,1,2) <> '--') then + recordFileName := cmd + else + begin + WriteLn(stderr, '"'+cmd+'" is not a valid option'); + parseParameter:= true; + end; + end; end; end; procedure parseClassicParameter(cmdArray: Array of String; size:LongInt; var paramIndex:LongInt); var index, tmpInt: LongInt; - isBool: Boolean; + isBool, isValid: Boolean; + cmd, arg, newSyntax: String; begin + WriteLn(stdout, 'WARNING: you are using a deprecated command, which could be removed in a future version!'); + WriteLn(stdout, ' Consider updating to the latest syntax, which is much more flexible!'); + WriteLn(stdout, ' Run `hwegine --help` to learn it!'); + WriteLn(stdout, ''); + index:= 0; tmpInt:= 1; while (index < size) do begin - paramIndex:= paramIndex+1; + inc(paramIndex); + cmd:= cmdArray[index]; + arg:= ParamStr(paramIndex); + isValid:= (cmd<>'--depth'); + // check if the parameter is a boolean one - isBool:= (cmdArray[index] = '--nomusic') - or (cmdArray[index] = '--nosound') - or (cmdArray[index] = '--fullscreen') - or (cmdArray[index] = '--showfps') - or (cmdArray[index] = '--altdmg') - or (cmdArray[index] = '--low-quality'); - if (not isBool) or ((ParamStr(paramIndex)='1') and (cmdArray[index]<>'--nomusic') and (cmdArray[index]<>'--nosound')) then - parseParameter(cmdArray[index], ParamStr(paramIndex), tmpInt); - index:= index+1; + isBool:= (cmd = '--nomusic') or (cmd = '--nosound') or (cmd = '--fullscreen') or (cmd = '--showfps') or (cmd = '--altdmg'); + if isBool and (arg='0') then + isValid:= false; + if (cmd='--nomusic') or (cmd='--nosound') then + isValid:= not isValid; + + if isValid then + begin + parseParameter(cmd, arg, tmpInt); + newSyntax := newSyntax + cmd + ' '; + if not isBool then + newSyntax := newSyntax + arg + ' '; + end; + inc(index); end; + + WriteLn(stdout, 'Attempted to automatically convert to the new syntax:'); + WriteLn(stdout, newSyntax); + WriteLn(stdout, ''); end; -procedure playReplayFileWithParameters(paramIndex: LongInt); -var tmpInt: LongInt; +procedure parseCommandLine{$IFDEF HWLIBRARY}(argc: LongInt; argv: PPChar){$ENDIF}; +var paramIndex: LongInt; + paramTotal: LongInt; wrongParameter: boolean; begin + paramIndex:= 1; + paramTotal:={$IFDEF HWLIBRARY}argc{$ELSE}ParamCount{$ENDIF}; wrongParameter:= false; - while (paramIndex <= ParamCount) do + while (paramIndex <= paramTotal) do begin - if parseParameter( ParamStr(paramIndex), ParamStr(paramIndex+1), paramIndex) then - wrongParameter:= true; - paramIndex:= paramIndex+1; + {$IFDEF HWLIBRARY} + wrongParameter:= parseParameter( argv[paramIndex], argv[paramIndex+1], paramIndex); + {$ELSE} + wrongParameter:= parseParameter( ParamStr(paramIndex), ParamStr(paramIndex+1), paramIndex); + {$ENDIF} + inc(paramIndex); end; if wrongParameter = true then + GameType:= gmtSyntax; +end; + +{$IFNDEF HWLIBRARY} +procedure GetParams; +//var tmpInt: LongInt; +begin + (* + tmpInt:=0; + while (tmpInt <= ParamCount) do begin + WriteLn(stdout, inttostr(tmpInt) + ': ' + ParamStr(tmpInt)); + inc(tmpInt); + end; + *) + + isInternal:= (ParamStr(1) = '--internal'); + + UserPathPrefix := '.'; + PathPrefix := cDefaultPathPrefix; + recordFileName := ''; + parseCommandLine(); + + if (isInternal) and (ParamCount<=1) then + begin + WriteLn(stderr, '--internal should not be manually used'); + GameType := gmtSyntax; + end; + + if (not isInternal) and (recordFileName = '') then + begin + WriteLn(stderr, 'You must specify a replay file'); + GameType := gmtSyntax; + end + else if (recordFileName <> '') then + WriteLn(stdout, 'Attempting to play demo file "' + recordFilename + '"'); + + if (GameType = gmtSyntax) then WriteLn(stderr, 'Please use --help to see possible arguments and their usage'); - GameType:= gmtSyntax; - end + + (* + WriteLn(stdout,'PathPrefix: ' + PathPrefix); + WriteLn(stdout,'UserPathPrefix: ' + UserPathPrefix); + *) end; +{$ENDIF} +