hedgewars/uCommands.pas
changeset 4373 fe0e3903bb9e
child 4374 bcefeeabaa33
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hedgewars/uCommands.pas	Thu Nov 18 09:12:27 2010 +0300
@@ -0,0 +1,235 @@
+{$INCLUDE "options.inc"}
+
+unit uCommands;
+
+interface
+
+var isDeveloperMode: boolean;
+type TVariableType = (vtCommand, vtLongInt, vthwFloat, vtBoolean);
+     TCommandHandler = procedure (var params: shortstring);
+
+procedure initModule;
+procedure freeModule;
+procedure ParseCommand(CmdStr: shortstring; TrustedSource: boolean);
+procedure StopMessages(Message: Longword);
+procedure doPut(putX, putY: LongInt; fromAI: boolean);
+
+implementation
+uses uMisc, uStore, Types, uConsts, uGears, uTeams, uIO, uKeys, uMobile,
+     uRandom, uAmmos, uStats, uChat, SDLh, uSound, uVisualGears, uScript, uTypes,
+     uVariables, uConsole, uFloat;
+
+type  PVariable = ^TVariable;
+      TVariable = record
+                     Next: PVariable;
+                     Name: string[15];
+                    VType: TVariableType;
+                  Handler: pointer;
+                  Trusted: boolean;
+                  end;
+
+var
+      Variables: PVariable;
+
+function RegisterVariable(Name: shortstring; VType: TVariableType; p: pointer; Trusted: boolean): PVariable;
+var value: PVariable;
+begin
+New(value);
+TryDo(value <> nil, 'RegisterVariable: value = nil', true);
+FillChar(value^, sizeof(TVariable), 0);
+value^.Name:= Name;
+value^.VType:= VType;
+value^.Handler:= p;
+value^.Trusted:= Trusted;
+
+if Variables = nil then Variables:= value
+                   else begin
+                        value^.Next:= Variables;
+                        Variables:= value
+                        end;
+
+RegisterVariable:= value;
+end;
+
+
+procedure ParseCommand(CmdStr: shortstring; TrustedSource: boolean);
+var ii: LongInt;
+    s: shortstring;
+    t: PVariable;
+    c: char;
+begin
+//WriteLnToConsole(CmdStr);
+if CmdStr[0]=#0 then exit;
+{$IFDEF DEBUGFILE}AddFileLog('ParseCommand "' + CmdStr + '"');{$ENDIF}
+c:= CmdStr[1];
+if c in ['/', '$'] then Delete(CmdStr, 1, 1) else c:= '/';
+s:= '';
+SplitBySpace(CmdStr, s);
+t:= Variables;
+while t <> nil do
+      begin
+      if t^.Name = CmdStr then
+         begin
+         if TrustedSource or t^.Trusted then
+            case t^.VType of
+              vtCommand: if c='/' then
+                         begin
+                         TCommandHandler(t^.Handler)(s);
+                         end;
+              vtLongInt: if c='$' then
+                         if s[0]=#0 then
+                            begin
+                            str(PLongInt(t^.Handler)^, s);
+                            WriteLnToConsole('$' + CmdStr + ' is "' + s + '"');
+                            end else val(s, PLongInt(t^.Handler)^);
+              vthwFloat: if c='$' then
+                         if s[0]=#0 then
+                            begin
+                            //str(PhwFloat(t^.Handler)^:4:6, s);
+                            WriteLnToConsole('$' + CmdStr + ' is "' + s + '"');
+                            end else; //val(s, PhwFloat(t^.Handler)^, i);
+             vtBoolean: if c='$' then
+                         if s[0]=#0 then
+                            begin
+                            str(ord(boolean(t^.Handler^)), s);
+                            WriteLnToConsole('$' + CmdStr + ' is "' + s + '"');
+                            end else
+                            begin
+                            val(s, ii);
+                            boolean(t^.Handler^):= not (ii = 0)
+                            end;
+              end;
+         exit
+         end else t:= t^.Next
+      end;
+case c of
+     '$': WriteLnToConsole(errmsgUnknownVariable + ': "$' + CmdStr + '"')
+     else WriteLnToConsole(errmsgUnknownCommand  + ': "/' + CmdStr + '"') end
+end;
+
+
+procedure StopMessages(Message: Longword);
+begin
+if (Message and gmLeft) <> 0 then ParseCommand('/-left', true) else
+if (Message and gmRight) <> 0 then ParseCommand('/-right', true) else
+if (Message and gmUp) <> 0 then ParseCommand('/-up', true) else
+if (Message and gmDown) <> 0 then ParseCommand('/-down', true) else
+if (Message and gmAttack) <> 0 then ParseCommand('/-attack', true)
+end;
+
+{$INCLUDE "CCHandlers.inc"}
+
+procedure initModule;
+begin
+    Variables:= nil;
+    isDeveloperMode:= true;
+
+    // NOTE: please, keep most frequently used commands on bottom
+    RegisterVariable('flag'    , vtCommand, @chFlag         , false);
+    RegisterVariable('script'  , vtCommand, @chScript       , false);
+    RegisterVariable('proto'   , vtCommand, @chCheckProto   , true );
+    RegisterVariable('spectate', vtBoolean, @fastUntilLag   , false);
+    RegisterVariable('capture' , vtCommand, @chCapture      , true );
+    RegisterVariable('rotmask' , vtCommand, @chRotateMask   , true );
+    RegisterVariable('addteam' , vtCommand, @chAddTeam      , false);
+    RegisterVariable('rdriven' , vtCommand, @chTeamLocal    , false);
+    RegisterVariable('map'     , vtCommand, @chSetMap       , false);
+    RegisterVariable('theme'   , vtCommand, @chSetTheme     , false);
+    RegisterVariable('seed'    , vtCommand, @chSetSeed      , false);
+    RegisterVariable('template_filter', vtLongInt, @cTemplateFilter, false);
+    RegisterVariable('mapgen'  , vtLongInt, @cMapGen        , false);
+    RegisterVariable('maze_size',vtLongInt, @cMazeSize      , false);
+    RegisterVariable('delay'   , vtLongInt, @cInactDelay    , false);
+    RegisterVariable('ready'   , vtLongInt, @cReadyDelay    , false);
+    RegisterVariable('casefreq', vtLongInt, @cCaseFactor    , false);
+    RegisterVariable('healthprob', vtLongInt, @cHealthCaseProb, false);
+    RegisterVariable('hcaseamount', vtLongInt, @cHealthCaseAmount, false);
+    RegisterVariable('sd_turns', vtLongInt, @cSuddenDTurns  , false);
+    RegisterVariable('waterrise', vtLongInt, @cWaterRise    , false);
+    RegisterVariable('healthdec', vtLongInt, @cHealthDecrease, false);
+    RegisterVariable('damagepct',vtLongInt, @cDamagePercent , false);
+    RegisterVariable('minedudpct',vtLongInt,@cMineDudPercent, false);
+    RegisterVariable('minesnum', vtLongInt, @cLandMines     , false);
+    RegisterVariable('explosives',vtLongInt,@cExplosives    , false);
+    RegisterVariable('gmflags' , vtLongInt, @GameFlags      , false);
+    RegisterVariable('trflags' , vtLongInt, @TrainingFlags  , false);
+    RegisterVariable('turntime', vtLongInt, @cHedgehogTurnTime, false);
+    RegisterVariable('minestime',vtLongInt, @cMinesTime     , false);
+    RegisterVariable('fort'    , vtCommand, @chFort         , false);
+    RegisterVariable('voicepack',vtCommand, @chVoicepack    , false);
+    RegisterVariable('grave'   , vtCommand, @chGrave        , false);
+    RegisterVariable('bind'    , vtCommand, @chBind         , true );
+    RegisterVariable('addhh'   , vtCommand, @chAddHH        , false);
+    RegisterVariable('hat'     , vtCommand, @chSetHat       , false);
+    RegisterVariable('hhcoords', vtCommand, @chSetHHCoords  , false);
+    RegisterVariable('ammloadt', vtCommand, @chSetAmmoLoadout, false);
+    RegisterVariable('ammdelay', vtCommand, @chSetAmmoDelay, false);
+    RegisterVariable('ammprob',  vtCommand, @chSetAmmoProbability, false);
+    RegisterVariable('ammreinf', vtCommand, @chSetAmmoReinforcement, false);
+    RegisterVariable('ammstore', vtCommand, @chAddAmmoStore , false);
+    RegisterVariable('quit'    , vtCommand, @chQuit         , true );
+    RegisterVariable('confirm' , vtCommand, @chConfirm      , true );
+    RegisterVariable('+speedup', vtCommand, @chSpeedup_p    , true );
+    RegisterVariable('-speedup', vtCommand, @chSpeedup_m    , true );
+    RegisterVariable('zoomin'  , vtCommand, @chZoomIn       , true );
+    RegisterVariable('zoomout' , vtCommand, @chZoomOut      , true );
+    RegisterVariable('zoomreset',vtCommand, @chZoomReset    , true );
+    RegisterVariable('skip'    , vtCommand, @chSkip         , false);
+    RegisterVariable('history' , vtCommand, @chHistory      , true );
+    RegisterVariable('chat'    , vtCommand, @chChat         , true );
+    RegisterVariable('say'     , vtCommand, @chSay          , true );
+    RegisterVariable('hogsay'  , vtCommand, @chHogSay       , true );
+    RegisterVariable('team'    , vtCommand, @chTeamSay      , true );
+    RegisterVariable('ammomenu', vtCommand, @chAmmoMenu     , true);
+    RegisterVariable('+precise', vtCommand, @chPrecise_p    , false);
+    RegisterVariable('-precise', vtCommand, @chPrecise_m    , false);
+    RegisterVariable('+left'   , vtCommand, @chLeft_p       , false);
+    RegisterVariable('-left'   , vtCommand, @chLeft_m       , false);
+    RegisterVariable('+right'  , vtCommand, @chRight_p      , false);
+    RegisterVariable('-right'  , vtCommand, @chRight_m      , false);
+    RegisterVariable('+up'     , vtCommand, @chUp_p         , false);
+    RegisterVariable('-up'     , vtCommand, @chUp_m         , false);
+    RegisterVariable('+down'   , vtCommand, @chDown_p       , false);
+    RegisterVariable('-down'   , vtCommand, @chDown_m       , false);
+    RegisterVariable('+attack' , vtCommand, @chAttack_p     , false);
+    RegisterVariable('-attack' , vtCommand, @chAttack_m     , false);
+    RegisterVariable('switch'  , vtCommand, @chSwitch       , false);
+    RegisterVariable('nextturn', vtCommand, @chNextTurn     , false);
+    RegisterVariable('timer'   , vtCommand, @chTimer        , false);
+    RegisterVariable('taunt'   , vtCommand, @chTaunt        , false);
+    RegisterVariable('setweap' , vtCommand, @chSetWeapon    , false);
+    RegisterVariable('slot'    , vtCommand, @chSlot         , false);
+    RegisterVariable('put'     , vtCommand, @chPut          , false);
+    RegisterVariable('ljump'   , vtCommand, @chLJump        , false);
+    RegisterVariable('hjump'   , vtCommand, @chHJump        , false);
+    RegisterVariable('fullscr' , vtCommand, @chFullScr      , true );
+    RegisterVariable('+volup'  , vtCommand, @chVol_p        , true );
+    RegisterVariable('-volup'  , vtCommand, @chVol_m        , true );
+    RegisterVariable('+voldown', vtCommand, @chVol_m        , true );
+    RegisterVariable('-voldown', vtCommand, @chVol_p        , true );
+    RegisterVariable('findhh'  , vtCommand, @chFindhh       , true );
+    RegisterVariable('pause'   , vtCommand, @chPause        , true );
+    RegisterVariable('+cur_u'  , vtCommand, @chCurU_p       , true );
+    RegisterVariable('-cur_u'  , vtCommand, @chCurU_m       , true );
+    RegisterVariable('+cur_d'  , vtCommand, @chCurD_p       , true );
+    RegisterVariable('-cur_d'  , vtCommand, @chCurD_m       , true );
+    RegisterVariable('+cur_l'  , vtCommand, @chCurL_p       , true );
+    RegisterVariable('-cur_l'  , vtCommand, @chCurL_m       , true );
+    RegisterVariable('+cur_r'  , vtCommand, @chCurR_p       , true );
+    RegisterVariable('-cur_r'  , vtCommand, @chCurR_m       , true );
+end;
+
+procedure freeModule;
+var t, tt: PVariable;
+begin
+    tt:= Variables;
+    Variables:= nil;
+    while tt <> nil do
+    begin
+        t:= tt;
+        tt:= tt^.Next;
+        Dispose(t)
+    end;
+end;
+
+end.
\ No newline at end of file