now scripts can create unique crates: dummy (empty) crates and booby traps. scripts can also set health crate values
authorHenek
Sun, 26 Jun 2011 02:47:36 +0200
changeset 5313 5e18eaef65d0
parent 5310 4622f83623ac
child 5316 191cd6c06203
now scripts can create unique crates: dummy (empty) crates and booby traps. scripts can also set health crate values
hedgewars/GSHandlers.inc
hedgewars/HHHandlers.inc
hedgewars/uConsts.pas
hedgewars/uGears.pas
hedgewars/uGearsRender.pas
hedgewars/uScript.pas
--- a/hedgewars/GSHandlers.inc	Sat Jun 25 17:22:35 2011 +0400
+++ b/hedgewars/GSHandlers.inc	Sun Jun 26 02:47:36 2011 +0200
@@ -102,6 +102,7 @@
         gi := gi^.NextGear
         end;
 end;
+
 ////////////////////////////////////////////////////////////////////////////////
 procedure doStepDrowningGear(Gear: PGear);
 forward;
@@ -236,7 +237,6 @@
 end;
 
 ////////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////
 procedure CalcRotationDirAngle(Gear: PGear);
 var 
     dAngle: real;
@@ -477,6 +477,7 @@
             AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtEvilTrace);
 end;
 end;
+
 ////////////////////////////////////////////////////////////////////////////////
 procedure doStepMolotov(Gear: PGear);
 var 
@@ -513,11 +514,7 @@
     end;
 end;
 
-procedure doStepWatermelon(Gear: PGear);
-begin
-    AllInactive := false;
-    Gear^.doStep := @doStepBomb
-end;
+////////////////////////////////////////////////////////////////////////////////
 
 procedure doStepCluster(Gear: PGear);
 begin
@@ -582,6 +579,7 @@
         end
 end;
 
+////////////////////////////////////////////////////////////////////////////////
 procedure doStepSnowflake(Gear: PGear);
 var xx, yy, px, py: LongInt;
     move, draw, allpx, gun: Boolean;
@@ -2074,6 +2072,7 @@
     end
 end;
 
+////////////////////////////////////////////////////////////////////////////////
 procedure doStepShover(Gear: PGear);
 var 
     HHGear: PGear;
@@ -3308,6 +3307,7 @@
     Gear^.doStep := @doStepRCPlaneWork
 end;
 
+////////////////////////////////////////////////////////////////////////////////
 procedure doStepJetpackWork(Gear: PGear);
 var 
     HHGear: PGear;
@@ -3435,7 +3435,6 @@
         end
 end;
 
-////////////////////////////////////////////////////////////////////////////////
 procedure doStepJetpack(Gear: PGear);
 var 
     HHGear: PGear;
@@ -3471,7 +3470,6 @@
     end;
 end;
 
-////////////////////////////////////////////////////////////////////////////////
 procedure doStepBirdyFly(Gear: PGear);
 var 
     HHGear: PGear;
@@ -3565,7 +3563,6 @@
         end
 end;
 
-////////////////////////////////////////////////////////////////////////////////
 procedure doStepBirdyDescend(Gear: PGear);
 var 
     HHGear: PGear;
@@ -3607,7 +3604,6 @@
     end
 end;
 
-////////////////////////////////////////////////////////////////////////////////
 procedure doStepBirdy(Gear: PGear);
 var 
     HHGear: PGear;
@@ -4145,6 +4141,7 @@
     newPortal^.doStep := @doStepMovingPortal;
 end;
 
+////////////////////////////////////////////////////////////////////////////////
 procedure doStepPiano(Gear: PGear);
 var 
     r0, r1: LongInt;
@@ -4444,6 +4441,7 @@
     Gear^.doStep := @doStepFlamethrowerWork
 end;
 
+////////////////////////////////////////////////////////////////////////////////
 procedure doStepLandGunWork(Gear: PGear);
 var 
     HHGear: PGear;
@@ -4519,6 +4517,7 @@
     Gear^.doStep := @doStepLandGunWork
 end;
 
+////////////////////////////////////////////////////////////////////////////////
 procedure doStepPoisonCloud(Gear: PGear);
 begin
     if Gear^.Timer = 0 then
@@ -4576,7 +4575,6 @@
 Gear^.doStep:= @doStepIdle
 end;
 
-////////////////////////////////////////////////////////////////////////////////
 procedure doStepHammerHitWork(Gear: PGear);
 var 
     i, ei: LongInt;
@@ -4812,6 +4810,14 @@
 var 
     x, y: LongInt;
 begin
+    if (Gear^.State and gstMoving) <> 0 then
+        begin
+        AddGearCI(Gear);
+        Gear^.dX:= _0;
+        Gear^.dY:= _0;
+        Gear^.State:= Gear^.State and not gstMoving;
+        end;
+
     if CurAmmoGear = Gear then
         begin
         if (CurrentHedgehog = nil) or (CurrentHedgehog^.Gear = nil) then 
@@ -4860,6 +4866,7 @@
         end;
 end;
 
+////////////////////////////////////////////////////////////////////////////////
 procedure doStepTardis(Gear: PGear);
 (*var 
     i, x, y: LongInt;
@@ -4902,3 +4909,6 @@
             DeleteGear(Gear)
         end
 end;
+
+////////////////////////////////////////////////////////////////////////////////
+
--- a/hedgewars/HHHandlers.inc	Sat Jun 25 17:22:35 2011 +0400
+++ b/hedgewars/HHHandlers.inc	Sun Jun 26 02:47:36 2011 +0200
@@ -467,6 +467,8 @@
 begin
 Gear^.Message:= gmDestroy;
 PlaySound(sndShotgunReload);
+if (Gear^.Pos and posCaseTrap) <> 0 then doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, HH^.Hedgehog, EXPLAutoSound)
+else
 case Gear^.Pos of
        posCaseUtility,
        posCaseAmmo: begin
--- a/hedgewars/uConsts.pas	Sat Jun 25 17:22:35 2011 +0400
+++ b/hedgewars/uConsts.pas	Sun Jun 26 02:47:36 2011 +0200
@@ -258,6 +258,8 @@
     posCaseAmmo    = $00000001;
     posCaseHealth  = $00000002;
     posCaseUtility = $00000004;
+    posCaseDummy   = $00000008;
+    posCaseTrap    = $00000010;
 
     NoPointX = Low(LongInt);
     cTargetPointRef : TPoint = (X: NoPointX; Y: 0);
--- a/hedgewars/uGears.pas	Sat Jun 25 17:22:35 2011 +0400
+++ b/hedgewars/uGears.pas	Sun Jun 26 02:47:36 2011 +0200
@@ -39,6 +39,7 @@
 procedure freeModule;
 function  AddGear(X, Y: LongInt; Kind: TGearType; State: Longword; dX, dY: hwFloat; Timer: LongWord): PGear;
 function  SpawnCustomCrateAt(x, y: LongInt; crate: TCrateType; content: Longword ): PGear;
+function  SpawnFakeCrateAt(x, y: LongInt; crate: TCrateType; trap: boolean ): PGear;
 procedure ResurrectHedgehog(gear: PGear);
 procedure ProcessGears;
 procedure EndTurnCleanup;
@@ -120,7 +121,7 @@
             @doStepKamikaze,
             @doStepCake,
             @doStepSeduction,
-            @doStepWatermelon,
+            @doStepBomb,
             @doStepCluster,
             @doStepBomb,
             @doStepWaterUp,
@@ -540,11 +541,11 @@
                 gear^.Density:= _1_5;
                 end;
    gtStructure: begin
-                gear^.ImpactSound:= sndGrenadeImpact;
-                gear^.nImpactSounds:= 1;
+                gear^.Elasticity:= _0_55;
+                gear^.Friction:= _0_995;
+                gear^.Density:= _0_9;
                 gear^.Radius:= 13;
-                gear^.Elasticity:= _0_3;
-                gear^.Health:= 50;
+                gear^.Health:= 200;
                 gear^.Tag:= 3;
                 end;
     end;
@@ -1607,12 +1608,12 @@
     FollowGear := AddGear(x, y, gtCase, 0, _0, _0, 0);
     cCaseFactor := 0;
 
-    if (content > ord(High(TAmmoType))) then content := ord(High(TAmmoType));
+    if (crate <> HealthCrate) and (content > ord(High(TAmmoType))) then content := ord(High(TAmmoType));
 
     case crate of
         HealthCrate: begin
-            FollowGear^.Health := cHealthCaseAmount;
             FollowGear^.Pos := posCaseHealth;
+            FollowGear^.Health := content;
             AddCaption(GetEventString(eidNewHealthPack), cWhiteColor, capgrpAmmoInfo);
             end;
         AmmoCrate: begin
@@ -1632,6 +1633,34 @@
     SpawnCustomCrateAt := FollowGear;
 end;
 
+function SpawnFakeCrateAt(x, y: LongInt; crate: TCrateType; trap: boolean): PGear;
+begin
+    FollowGear := AddGear(x, y, gtCase, 0, _0, _0, 0);
+    cCaseFactor := 0;
+    
+    if trap then FollowGear^.Pos := posCaseTrap
+    else FollowGear^.Pos := posCaseDummy;
+
+    case crate of
+        HealthCrate: begin
+            FollowGear^.Pos := FollowGear^.Pos + posCaseHealth;
+            AddCaption(GetEventString(eidNewHealthPack), cWhiteColor, capgrpAmmoInfo);
+            end;
+        AmmoCrate: begin
+            FollowGear^.Pos := FollowGear^.Pos + posCaseAmmo;
+            AddCaption(GetEventString(eidNewAmmoPack), cWhiteColor, capgrpAmmoInfo);
+            end;
+        UtilityCrate: begin
+            FollowGear^.Pos := FollowGear^.Pos + posCaseUtility;
+            AddCaption(GetEventString(eidNewUtilityPack), cWhiteColor, capgrpAmmoInfo);
+            end;
+    end;
+
+    if ( (x = 0) and (y = 0) ) then FindPlace(FollowGear, true, 0, LAND_WIDTH);
+
+    SpawnFakeCrateAt := FollowGear;
+end;
+
 procedure SpawnBoxOfSmth;
 var t, aTot, uTot, a, h: LongInt;
     i: TAmmoType;
--- a/hedgewars/uGearsRender.pas	Sat Jun 25 17:22:35 2011 +0400
+++ b/hedgewars/uGearsRender.pas	Sun Jun 26 02:47:36 2011 +0200
@@ -928,24 +928,25 @@
                            DrawRotated(sprSMineOff, x, y, 0, Gear^.DirAngle)
                        else if Gear^.Health <> 0 then DrawRotated(sprSMineOn, x, y, 0, Gear^.DirAngle)
                        else DrawRotated(sprMineDead, x, y, 0, Gear^.DirAngle);
-            gtCase: case Gear^.Pos of
-                         posCaseAmmo  : begin
-                                        i:= (GameTicks shr 6) mod 64;
-                                        if i > 18 then i:= 0;
-                                        DrawSprite(sprCase, x - 24, y - 24, i);
-                                        end;
-                         posCaseHealth: begin
-                                        i:= ((GameTicks shr 6) + 38) mod 64;
-                                        if i > 13 then i:= 0;
-                                        DrawSprite(sprFAid, x - 24, y - 24, i);
-                                        end;
-                         posCaseUtility: begin
-                                        i:= (GameTicks shr 6) mod 70;
-                                        if i > 23 then i:= 0;
-                                        i:= i mod 12;
-                                        DrawSprite(sprUtility, x - 24, y - 24, i);
-                                        end;
-                         end;
+            gtCase: if ((Gear^.Pos and posCaseAmmo) <> 0) then
+                        begin
+                        i:= (GameTicks shr 6) mod 64;
+                        if i > 18 then i:= 0;
+                        DrawSprite(sprCase, x - 24, y - 24, i);
+                        end
+                    else if ((Gear^.Pos and posCaseHealth) <> 0) then
+                        begin
+                        i:= ((GameTicks shr 6) + 38) mod 64;
+                        if i > 13 then i:= 0;
+                        DrawSprite(sprFAid, x - 24, y - 24, i);
+                        end
+                    else if ((Gear^.Pos and posCaseUtility) <> 0) then
+                        begin
+                        i:= (GameTicks shr 6) mod 70;
+                        if i > 23 then i:= 0;
+                        i:= i mod 12;
+                        DrawSprite(sprUtility, x - 24, y - 24, i);
+                        end;
       gtExplosives: begin
                     if ((Gear^.State and gstDrowning) <> 0) then
                         DrawSprite(sprExplosivesRoll, x - 24, y - 24, 0)
--- a/hedgewars/uScript.pas	Sat Jun 25 17:22:35 2011 +0400
+++ b/hedgewars/uScript.pas	Sun Jun 26 02:47:36 2011 +0200
@@ -223,16 +223,64 @@
     lc_campaignunlock:= 0;
 end;
 
+function lc_spawnfakehealthcrate(L: Plua_State) : LongInt; Cdecl;
+var gear: PGear;
+begin
+    if lua_gettop(L) <> 3 then begin
+        LuaError('Lua: Wrong number of parameters passed to SpawnFakeHealthCrate!');
+        lua_pushnil(L);
+    end
+    else begin
+        gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2),
+            HealthCrate, lua_toboolean(L, 3));
+        lua_pushinteger(L, gear^.uid);
+    end;
+    lc_spawnfakehealthcrate := 1;        
+end;
+
+function lc_spawnfakeammocrate(L: PLua_State): LongInt; Cdecl;
+var gear: PGear;
+begin
+    if lua_gettop(L) <> 3 then begin
+        LuaError('Lua: Wrong number of parameters passed to SpawnFakeAmmoCrate!');
+        lua_pushnil(L);
+    end
+    else begin
+        gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2),
+            AmmoCrate, lua_toboolean(L, 3));
+        lua_pushinteger(L, gear^.uid);
+    end;
+    lc_spawnfakeammocrate := 1;
+end;
+
+function lc_spawnfakeutilitycrate(L: PLua_State): LongInt; Cdecl;
+var gear: PGear;
+begin
+    if lua_gettop(L) <> 3 then begin
+        LuaError('Lua: Wrong number of parameters passed to SpawnFakeUtilityCrate!');
+        lua_pushnil(L);
+    end
+    else begin  
+        gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2),
+            UtilityCrate, lua_toboolean(L, 3));
+        lua_pushinteger(L, gear^.uid);
+    end;
+    lc_spawnfakeutilitycrate := 1;
+end;
+
 function lc_spawnhealthcrate(L: Plua_State) : LongInt; Cdecl;
 var gear: PGear;
+var health: LongInt;
 begin
-    if lua_gettop(L) <> 2 then begin
+    if (lua_gettop(L) < 2) or (lua_gettop(L) > 3) then begin
         LuaError('Lua: Wrong number of parameters passed to SpawnHealthCrate!');
         lua_pushnil(L);
     end
     else begin
+        if lua_gettop(L) = 3 then health:= lua_tointeger(L, 3)
+        else health:= cHealthCaseAmount;
         gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2),
-            HealthCrate, 0);
+            HealthCrate, health);
         lua_pushinteger(L, gear^.uid);
     end;
     lc_spawnhealthcrate := 1;        
@@ -1740,6 +1788,9 @@
 lua_register(luaState, 'SpawnHealthCrate', @lc_spawnhealthcrate);
 lua_register(luaState, 'SpawnAmmoCrate', @lc_spawnammocrate);
 lua_register(luaState, 'SpawnUtilityCrate', @lc_spawnutilitycrate);
+lua_register(luaState, 'SpawnFakeHealthCrate', @lc_spawnfakehealthcrate);
+lua_register(luaState, 'SpawnFakeAmmoCrate', @lc_spawnfakeammocrate);
+lua_register(luaState, 'SpawnFakeUtilityCrate', @lc_spawnfakeutilitycrate);
 lua_register(luaState, 'WriteLnToConsole', @lc_writelntoconsole);
 lua_register(luaState, 'GetGearType', @lc_getgeartype);
 lua_register(luaState, 'EndGame', @lc_endgame);