diff -r e0dcf5b0e1b1 -r ecd51650d5d8 hedgewars/ArgParsers.inc --- a/hedgewars/ArgParsers.inc Mon Dec 24 16:23:55 2012 +0100 +++ b/hedgewars/ArgParsers.inc Mon Dec 24 17:07:12 2012 +0100 @@ -16,26 +16,91 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA *) +procedure GciEasterEgg; +begin + 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; -procedure internalStartGameWithParameters(); -var tmp: LongInt; +procedure DisplayUsage; 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)); + WriteLn(stdout, 'Usage: hwengine [options]'); + WriteLn(stdout, ''); + 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, ' --nick [string]'); + WriteLn(stdout, ' --width [screen width in pixels]'); + WriteLn(stdout, ' --height [screen 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'); + WriteLn(stdout, ' --nosound'); + WriteLn(stdout, ' --fullscreen'); + WriteLn(stdout, ' --showfps'); + WriteLn(stdout, ' --altdmg'); + WriteLn(stdout, ' --stats-only'); + WriteLn(stdout, ' --help'); + 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 > 9) and (tmp < 16) then @@ -51,50 +116,23 @@ // any other mode cStereoMode:= TStereoMode(max(0, min(ord(high(TStereoMode)), tmp-6))); {$ELSE} - cStereoMode:= smNone; + cStereoMode:= smNone; {$ENDIF} - 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; +procedure startVideoRecording(var paramIndex: LongInt); begin - WriteLn(stdout, 'Usage: hwengine [options]'); - WriteLn(stdout, ''); - 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, ' --volume [sound level]'); - WriteLn(stdout, ' --frame-interval [milliseconds]'); - WriteLn(stdout, ' --raw-quality [flags]'); - WriteLn(stdout, ' --low-quality'); - WriteLn(stdout, ' --nomusic'); - WriteLn(stdout, ' --nosound'); - WriteLn(stdout, ' --fullscreen'); - WriteLn(stdout, ' --showfps'); - WriteLn(stdout, ' --altdmg'); - WriteLn(stdout, ' --stats-only'); - WriteLn(stdout, ' --help'); - WriteLn(stdout, ''); - WriteLn(stdout, 'For more detailed help and examples go to:'); - WriteLn(stdout, 'http://code.google.com/p/hedgewars/wiki/CommandLineOptions'); +{$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; @@ -122,15 +160,16 @@ 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..22] of shortstring = ( + audioArray: Array [1..3] of String = ('--volume','--nomusic','--nosound'); + otherArray: Array [1..3] of String = ('--locale','--fullscreen','--showfps'); + mediaArray: Array [1..8] of String = ('--width','--height','--depth','--volume','--nomusic','--nosound','--locale','--fullscreen'); + allArray: Array [1..12] of String = ('--width','--height','--depth','--volume','--nomusic','--nosound','--locale','--fullscreen','--showfps','--altdmg','--frame-interval','--low-quality'); + reallyAll: array[0..28] of shortstring = ( '--prefix', '--user-prefix', '--locale', '--width', '--height', '--frame-interval', '--volume','--nomusic', '--nosound', - '--fullscreen', '--showfps', '--altdmg', '--low-quality', '--raw-quality', + '--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; @@ -155,47 +194,32 @@ {--altdmg} 11 : cAltDamage := true; {--low-quality} 12 : cReducedQuality:= $FFFFFFFF xor rqLowRes; {--raw-quality} 13 : cReducedQuality:= getLongIntParameter(arg, paramIndex, parseParameter); + {--stereo} 14 : setStereoMode ( getLongIntParameter(arg, paramIndex, parseParameter) ); + {--nick} 15 : UserNick := parseNick( getStringParameter(arg, paramIndex, parseParameter) ); {deprecated options} - {--depth} 14 : {do nothing}; - {--set-video} 15 : parseClassicParameter(videoArray,3,paramIndex); - {--set-audio} 16 : parseClassicParameter(audioArray,3,paramIndex); - {--set-other} 17 : parseClassicParameter(otherArray,3,paramIndex); - {--set-multimedia} 18 : parseClassicParameter(mediaArray,8,paramIndex); - {--set-everything} 19 : parseClassicParameter(allArray,12,paramIndex); + {--depth} 16 : setDepth(paramIndex); + {--set-video} 17 : parseClassicParameter(videoArray,3,paramIndex); + {--set-audio} 18 : parseClassicParameter(audioArray,3,paramIndex); + {--set-other} 19 : parseClassicParameter(otherArray,3,paramIndex); + {--set-multimedia} 20 : parseClassicParameter(mediaArray,8,paramIndex); + {--set-everything} 21 : parseClassicParameter(allArray,12,paramIndex); + {"internal" options} + {--internal} 22 : {note it, but do nothing}; + {--port} 23 : setIpcPort( getLongIntParameter(arg, paramIndex, parseParameter), parseParameter ); + {--recorder} 24 : startVideoRecording(paramIndex); + {--landpreview} 25 : GameType := gmtLandPreview; {anything else} - {--stats-only} 20 : begin - cOnlyStats:= true; - cReducedQuality:= $FFFFFFFF xor rqLowRes; - SetSound(false); - end; - {--gci} 21 : 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} 22 : begin - DisplayUsage(); - GameType:= gmtSyntax; - end; + {--stats-only} 26 : statsOnlyGame(); + {--gci} 27 : GciEasterEgg(); + {--help} 28 : DisplayUsage(); else begin //Asusme the first "non parameter" is the replay file, anything else is invalid - if recordFileName = '' then + if (recordFileName = '') and (Copy(cmd,1,2) <> '--') then recordFileName := cmd else begin - WriteLn(stderr, 'ERROR: '+cmd+' is not a valid argument'); + WriteLn(stderr, '"'+cmd+'" is not a valid option'); parseParameter:= true; end; end; @@ -204,7 +228,8 @@ 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!'); @@ -215,18 +240,31 @@ 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); + 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 += cmd + ' '; + if not isBool then + newSyntax += arg + ' '; + end; inc(index); end; + + WriteLn(stdout, 'Attempted to automatically convert to the new syntax:'); + WriteLn(stdout, newSyntax); + WriteLn(stdout, ''); end; procedure playReplayFileWithParameters; @@ -242,60 +280,47 @@ inc(paramIndex); end; if wrongParameter = true then - begin - WriteLn(stderr, 'Please use --help to see possible arguments and their usage'); GameType:= gmtSyntax; - end end; procedure GetParams; +//var tmpInt: LongInt; begin (* tmpInt:=0; while (tmpInt <= ParamCount) do begin - WriteLn(stdout,inttostr(tmpInt) + ': ' + ParamStr(tmpInt)); + WriteLn(stdout, inttostr(tmpInt) + ': ' + ParamStr(tmpInt)); inc(tmpInt); end; *) - if (ParamCount = 3) and (ParamStr(3) = 'landpreview') then - begin - PathPrefix := ParamStr(1); - ipcPort := StrToInt(ParamStr(2)); - GameType := gmtLandPreview; - exit; - end; - - //TODO: prepend something so that we can use a cDefaultParamNum of parameters - if ParamCount = cDefaultParamNum then - begin - internalStartGameWithParameters(); - exit; - end -{$IFDEF USE_VIDEO_RECORDING} - else if ParamCount = cVideorecParamNum then - begin - internalStartVideoRecordingWithParameters(); - exit; - end -{$ENDIF}; + isInternal:= (ParamStr(1) = '--internal'); UserPathPrefix := '.'; PathPrefix := cDefaultPathPrefix; recordFileName := ''; playReplayFileWithParameters(); - if (recordFileName = '') then + 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 - DisplayUsage(); - GameType:= gmtSyntax; - end; + 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'); + (* WriteLn(stdout,'PathPrefix: ' + PathPrefix); WriteLn(stdout,'UserPathPrefix: ' + UserPathPrefix); - WriteLn(stdout,'recordFilename: ' + recordFilename); *) end; - -