- New command 'set weapon'
authorunc0rr
Tue, 05 Feb 2008 17:53:38 +0000
changeset 783 4f59db6f147d
parent 782 e2d2b84aa776
child 784 b203147d91b5
- New command 'set weapon' - Fixes bug with changing weapon while switching hedgehogs
doc/protocol.txt
hedgewars/CCHandlers.inc
hedgewars/HHHandlers.inc
hedgewars/uAIActions.pas
hedgewars/uAmmos.pas
hedgewars/uConsole.pas
hedgewars/uConsts.pas
hedgewars/uGears.pas
hedgewars/uTeams.pas
hedgewars/uWorld.pas
--- a/doc/protocol.txt	Sun Feb 03 17:02:20 2008 +0000
+++ b/doc/protocol.txt	Tue Feb 05 17:53:38 2008 +0000
@@ -10,7 +10,8 @@
                 's' + <текст>   /say
                 '+'             пустой пакет для постоянности лага
                 '1'..'5'        /timer 1..5
-                chr(128+№)      /slot №
+                chr(128+№)     /slot №
+                'w'             /setweap
                 'p'             /put
                 'j'             /ljump
                 'J'             /hjump
--- a/hedgewars/CCHandlers.inc	Sun Feb 03 17:02:20 2008 +0000
+++ b/hedgewars/CCHandlers.inc	Tue Feb 05 17:53:38 2008 +0000
@@ -294,34 +294,27 @@
 
 procedure chSlot(var s: shortstring);
 var slot: LongWord;
-    caSlot, caAmmo: PLongword;
 begin
 if (s[0] <> #1) or CheckNoTeamOrHH then exit;
 bShowFinger:= false;
 slot:= byte(s[1]) - 49;
 if slot > cMaxSlotIndex then exit;
 if not CurrentTeam^.ExtDriven then SendIPC(char(byte(s[1]) + 79));
-with CurrentTeam^ do
+with CurrentHedgehog^.Gear^ do
      begin
-     with Hedgehogs[CurrHedgehog] do
-          begin
-          if ((Gear^.State and (gstAttacking or gstAttacked)) <> 0) or (AttacksNum > 0)
-             or ((Gear^.State and gstHHDriven) = 0) then exit;
-          Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump);
-          if CurAmmoGear = nil then begin caSlot:= @CurSlot; caAmmo:= @CurAmmo end
-                               else begin caSlot:= @AltSlot; caAmmo:= @AltAmmo end;
-          if caSlot^ = slot then
-             begin
-             inc(caAmmo^);
-             if (caAmmo^ > cMaxSlotAmmoIndex) or (Ammo^[slot, caAmmo^].Count = 0) then caAmmo^:= 0
-             end else
-             if Ammo^[slot, 0].Count > 0 then
-                begin
-                caSlot^:= slot;
-                caAmmo^:= 0;
-                end;
-          end;
-     ApplyAmmoChanges(Hedgehogs[CurrHedgehog])
+     Message:= Message or gm_Slot;
+     MsgParam:= slot
+     end
+end;
+
+procedure chSetWeapon(var s: shortstring);
+begin
+if (s[0] <> #1) or CheckNoTeamOrHH then exit;
+if not CurrentTeam^.ExtDriven then SendIPC('w' + char(byte(s[1]) + 79));
+with CurrentHedgehog^.Gear^ do
+     begin
+     Message:= Message or gm_Weapon;
+     MsgParam:= byte(s[1]) - ord('a')
      end
 end;
 
--- a/hedgewars/HHHandlers.inc	Sun Feb 03 17:02:20 2008 +0000
+++ b/hedgewars/HHHandlers.inc	Tue Feb 05 17:53:38 2008 +0000
@@ -17,6 +17,55 @@
  *)
 
 ////////////////////////////////////////////////////////////////////////////////
+procedure ChangeAmmo(Gear: PGear);
+var slot: Longword;
+    caSlot, caAmmo: PLongword;
+begin
+slot:= Gear^.MsgParam;
+
+with PHedgehog(Gear^.Hedgehog)^ do
+     begin
+     if ((Gear^.State and (gstAttacking or gstAttacked)) <> 0) or (AttacksNum > 0)
+        or ((Gear^.State and gstHHDriven) = 0) then exit;
+
+     Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump or gm_Slot);
+
+     if CurAmmoGear = nil then begin caSlot:= @CurSlot; caAmmo:= @CurAmmo end
+                          else begin caSlot:= @AltSlot; caAmmo:= @AltAmmo end;
+
+     if caSlot^ = slot then
+        begin
+        inc(caAmmo^);
+        if (caAmmo^ > cMaxSlotAmmoIndex) or (Ammo^[slot, caAmmo^].Count = 0) then caAmmo^:= 0
+        end else
+     if Ammo^[slot, 0].Count > 0 then
+        begin
+        caSlot^:= slot;
+        caAmmo^:= 0;
+        end;
+     end;
+ApplyAmmoChanges(PHedgehog(Gear^.Hedgehog)^)
+end;
+
+procedure HHSetWeapon(Gear: PGear);
+var t: LongInt;
+    weap: TAmmoType;
+begin
+weap:= TAmmoType(Gear^.MsgParam);
+Gear^.MsgParam:= Ammoz[weap].Slot;
+
+t:= cMaxSlotAmmoIndex;
+
+Gear^.Message:= Gear^.Message and not gm_Weapon;
+
+with PHedgehog(Gear^.Hedgehog)^ do
+     while (Ammo^[CurSlot, CurAmmo].AmmoType <> weap) and (t >= 0) do
+           begin
+           ChangeAmmo(Gear);
+           dec(t)
+           end
+end;
+
 procedure Attack(Gear: PGear);
 var xx, yy: hwFloat;
 begin
@@ -282,7 +331,7 @@
    end;
 
 if (Gear^.State <> 0) then DeleteCI(Gear);
-                
+
 if (Gear^.State and gstMoving) <> 0 then
    if TestCollisionXKick(Gear, hwSign(Gear^.dX)) then
       if not isFalling then
@@ -362,6 +411,10 @@
    exit
    end;
 
+if ((Gear^.Message and gm_Slot) <> 0) then ChangeAmmo(Gear);
+
+if ((Gear^.Message and gm_Weapon) <> 0) then HHSetWeapon(Gear);
+
 if ((Gear^.Message and gm_Attack) <> 0) or
    ((Gear^.State and gstAttacking) <> 0) then Attack(Gear);
 
--- a/hedgewars/uAIActions.pas	Sun Feb 03 17:02:20 2008 +0000
+++ b/hedgewars/uAIActions.pas	Tue Feb 05 17:53:38 2008 +0000
@@ -60,7 +60,7 @@
 procedure ProcessAction(var Actions: TActions; Me: PGear);
 
 implementation
-uses uMisc, uTeams, uConsts, uConsole, uAIMisc, uAI;
+uses uMisc, uTeams, uConsts, uConsole, uAIMisc, uAI, uAmmos;
 
 const ActionIdToStr: array[0..6] of string[16] = (
 {aia_none}           '',
--- a/hedgewars/uAmmos.pas	Sun Feb 03 17:02:20 2008 +0000
+++ b/hedgewars/uAmmos.pas	Tue Feb 05 17:53:38 2008 +0000
@@ -29,9 +29,10 @@
 procedure OnUsedAmmo(var Hedgehog: THedgehog);
 procedure ApplyAmmoChanges(var Hedgehog: THedgehog);
 procedure SwitchNotHoldedAmmo(var Hedgehog: THedgehog);
+procedure SetWeapon(weap: TAmmoType);
 
 implementation
-uses uMisc, uGears, uWorld, uLocale;
+uses uMisc, uGears, uWorld, uLocale, uConsole;
 type TAmmoCounts = array[TAmmoType] of Longword;
 var StoresList: array[0..Pred(cMaxHHs)] of PHHAmmo;
     StoreCnt: Longword = 0;
@@ -214,4 +215,9 @@
         end
 end;
 
+procedure SetWeapon(weap: TAmmoType);
+begin
+ParseCommand('/setweap ' + chr(ord('a') + byte(weap)), true)
+end;
+
 end.
--- a/hedgewars/uConsole.pas	Sun Feb 03 17:02:20 2008 +0000
+++ b/hedgewars/uConsole.pas	Tue Feb 05 17:53:38 2008 +0000
@@ -317,6 +317,7 @@
 RegisterVariable('switch'  , vtCommand, @chSwitch       , false);
 RegisterVariable('nextturn', vtCommand, @chNextTurn     , false);
 RegisterVariable('timer'   , vtCommand, @chTimer        , false);
+RegisterVariable('setweap' , vtCommand, @chSetWeapon    , false);
 RegisterVariable('slot'    , vtCommand, @chSlot         , false);
 RegisterVariable('put'     , vtCommand, @chPut          , false);
 RegisterVariable('ljump'   , vtCommand, @chLJump        , false);
--- a/hedgewars/uConsts.pas	Sun Feb 03 17:02:20 2008 +0000
+++ b/hedgewars/uConsts.pas	Tue Feb 05 17:53:38 2008 +0000
@@ -170,6 +170,8 @@
       gm_LJump  = $00000040;
       gm_HJump  = $00000080;
       gm_Destroy= $00000100;
+      gm_Slot   = $00000200; // with param
+      gm_Weapon = $00000400; // with param
 
       cMaxSlotIndex       = 8;
       cMaxSlotAmmoIndex   = 2;
--- a/hedgewars/uGears.pas	Sun Feb 03 17:02:20 2008 +0000
+++ b/hedgewars/uGears.pas	Tue Feb 05 17:53:38 2008 +0000
@@ -41,7 +41,7 @@
              Timer : LongWord;
              Elasticity: hwFloat;
              Friction  : hwFloat;
-             Message : Longword;
+             Message, MsgParam : Longword;
              Hedgehog: pointer;
              Health, Damage: LongInt;
              CollisionIndex: LongInt;
--- a/hedgewars/uTeams.pas	Sun Feb 03 17:02:20 2008 +0000
+++ b/hedgewars/uTeams.pas	Tue Feb 05 17:53:38 2008 +0000
@@ -87,7 +87,6 @@
 procedure RecountTeamHealth(team: PTeam);
 procedure RestoreTeamsFromSave;
 function CheckForWin: boolean;
-procedure SetWeapon(weap: TAmmoType);
 procedure SendStats;
 
 implementation
@@ -319,19 +318,6 @@
    TeamsArray[t]^.ExtDriven:= false
 end;
 
-procedure SetWeapon(weap: TAmmoType);
-var t: LongInt;
-begin
-t:= cMaxSlotAmmoIndex;
-with CurrentTeam^ do
-     with Hedgehogs[CurrHedgehog] do
-          while (Ammo^[CurSlot, CurAmmo].AmmoType <> weap) and (t >= 0) do
-                begin
-                ParseCommand('/slot ' + chr(49 + Ammoz[TAmmoType(weap)].Slot), true);
-                dec(t)
-                end
-end;
-
 procedure SendStats;
 var i, t: LongInt;
     msd: Longword; msdhh: PHedgehog;
--- a/hedgewars/uWorld.pas	Sun Feb 03 17:02:20 2008 +0000
+++ b/hedgewars/uWorld.pas	Tue Feb 05 17:53:38 2008 +0000
@@ -38,7 +38,7 @@
     Frames: Longword = 0;
 
 implementation
-uses uStore, uMisc, uTeams, uIO, uConsole, uKeys, uLocale, uSound, GL;
+uses uStore, uMisc, uTeams, uIO, uConsole, uKeys, uLocale, uSound, GL, uAmmos;
 const FPS: Longword = 0;
       CountTicks: Longword = 0;
       SoundTimerTicks: Longword = 0;