Set default collision mask for gears at currenthedgehog X/Y to FF7F, expose mask to scripting as well. This should resolve the collision part of bug #420
authornemo
Sun, 07 Oct 2012 11:59:42 -0400
changeset 7726 1137406bce12
parent 7725 4ad05a478c6c
child 7727 bd252cacabe8
Set default collision mask for gears at currenthedgehog X/Y to FF7F, expose mask to scripting as well. This should resolve the collision part of bug #420
hedgewars/GSHandlers.inc
hedgewars/uGearsList.pas
hedgewars/uScript.pas
--- a/hedgewars/GSHandlers.inc	Sun Oct 07 00:12:46 2012 +0400
+++ b/hedgewars/GSHandlers.inc	Sun Oct 07 11:59:42 2012 -0400
@@ -315,14 +315,14 @@
         CheckCollision(Gear);
         if (Gear^.State and gstCollision) <> 0 then
             doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, Gear^.Hedgehog, EXPLDontDraw or EXPLNoGfx);
-    end;
+        end;
 
     if (Gear^.Kind = gtGasBomb) and ((GameTicks mod 200) = 0) then
         begin
         vg:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtSmokeWhite);
         if vg <> nil then
             vg^.Tint:= $FFC0C000;
-    end;
+        end;
 
     if Gear^.Timer = 0 then
         begin
@@ -386,10 +386,10 @@
                     FollowGear:= AddGear(hwRound(Gear^.X) - 30 + x, hwRound(Gear^.Y) - 20 + y, gtPoisonCloud, 0, _0, _0, 0);
                     end
                 end;
+            end;
+        DeleteGear(Gear);
+        exit
         end;
-    DeleteGear(Gear);
-    exit
-    end;
 
     CalcRotationDirAngle(Gear);
 
--- a/hedgewars/uGearsList.pas	Sun Oct 07 00:12:46 2012 +0400
+++ b/hedgewars/uGearsList.pas	Sun Oct 07 11:59:42 2012 -0400
@@ -104,9 +104,14 @@
 gear^.Density:= _1;
 // Define ammo association, if any.
 gear^.AmmoType:= GearKindAmmoTypeMap[Kind];
-gear^.CollisionMask:= $FFFF;
 
-if CurrentHedgehog <> nil then gear^.Hedgehog:= CurrentHedgehog;
+if CurrentHedgehog <> nil then 
+    begin
+    gear^.Hedgehog:= CurrentHedgehog;
+    if (CurrentHedgehog^.Gear <> nil) and (hwRound(CurrentHedgehog^.Gear^.X) = X) and (hwRound(CurrentHedgehog^.Gear^.Y) = Y) then
+        gear^.CollisionMask:= $FF7F;
+    end
+else gear^.CollisionMask:= $FFFF;
 
 if (Ammoz[Gear^.AmmoType].Ammo.Propz and ammoprop_NeedTarget <> 0) then
     gear^.Z:= cHHZ+1
--- a/hedgewars/uScript.pas	Sun Oct 07 00:12:46 2012 +0400
+++ b/hedgewars/uScript.pas	Sun Oct 07 11:59:42 2012 -0400
@@ -647,6 +647,39 @@
     lc_setgearpos:= 0
 end;
 
+function lc_getgearcollisionmask(L : Plua_State) : LongInt; Cdecl;
+var gear : PGear;
+begin
+    if lua_gettop(L) <> 1 then
+        begin
+        LuaError('Lua: Wrong number of parameters passed to GetGearCollisionMask!');
+        lua_pushnil(L); // return value on stack (nil)
+        end
+    else
+        begin
+        gear:= GearByUID(lua_tointeger(L, 1));
+        if gear <> nil then
+            lua_pushinteger(L, gear^.CollisionMask)
+        else
+            lua_pushnil(L);
+        end;
+    lc_getgearcollisionmask:= 1
+end;
+
+function lc_setgearcollisionmask(L : Plua_State) : LongInt; Cdecl;
+var gear : PGear;
+begin
+    if lua_gettop(L) <> 2 then
+        LuaError('Lua: Wrong number of parameters passed to SetGearCollisionMask!')
+    else
+        begin
+        gear:= GearByUID(lua_tointeger(L, 1));
+        if gear <> nil then
+            gear^.CollisionMask:= lua_tointeger(L, 2);
+        end;
+    lc_setgearcollisionmask:= 0
+end;
+
 function lc_gethoglevel(L : Plua_State): LongInt; Cdecl;
 var gear : PGear;
 begin
@@ -2327,6 +2360,8 @@
 lua_register(luaState, _P'SetGearMessage', @lc_setgearmessage);
 lua_register(luaState, _P'GetGearPos', @lc_getgearpos);
 lua_register(luaState, _P'SetGearPos', @lc_setgearpos);
+lua_register(luaState, _P'GetGearCollisionMask', @lc_getgearcollisionmask);
+lua_register(luaState, _P'SetGearCollisionMask', @lc_setgearcollisionmask);
 lua_register(luaState, _P'GetRandom', @lc_getrandom);
 lua_register(luaState, _P'SetWind', @lc_setwind);
 lua_register(luaState, _P'GetDataPath', @lc_getdatapath);