hedgewars/uScript.pas
branchqmlfrontend
changeset 12855 1b2b84315d27
parent 12848 076d00110223
child 12910 383445810e42
--- a/hedgewars/uScript.pas	Thu Aug 11 23:05:14 2016 +0300
+++ b/hedgewars/uScript.pas	Sun Dec 17 00:09:24 2017 +0100
@@ -23,7 +23,7 @@
  * This unit defines, implements and registers functions and
  * variables/constants bindings for usage in Lua scripts.
  *
- * Please keep http://hedgewars.org/kb/LuaAPI up to date!
+ * Please keep https://hedgewars.org/kb/LuaAPI up to date!
  *
  * Note: If you add a new function, make sure to test if _all_ parameters
  *       work as intended! (Especially conversions errors can sneak in
@@ -223,7 +223,7 @@
 function LuaToGearTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline;
 begin
     if lua_isnoneornil(L, i) then i:= -1
-    else i:= lua_tointeger(L, i);
+    else i:= Trunc(lua_tonumber(L, i));
     if (i < ord(Low(TGearType))) or (i > ord(High(TGearType))) then
         begin
         LuaCallError('Invalid gearType!', call, paramsyntax);
@@ -236,7 +236,7 @@
 function LuaToVisualGearTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline;
 begin
     if lua_isnoneornil(L, i) then i:= -1
-    else i:= lua_tointeger(L, i);
+    else i:= Trunc(lua_tonumber(L, i));
     if (i < ord(Low(TVisualGearType))) or (i > ord(High(TVisualGearType))) then
         begin
         LuaCallError('Invalid visualGearType!', call, paramsyntax);
@@ -249,7 +249,7 @@
 function LuaToAmmoTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline;
 begin
     if lua_isnoneornil(L, i) then i:= -1
-    else i:= lua_tointeger(L, i);
+    else i:= Trunc(lua_tonumber(L, i));
     if (i < ord(Low(TAmmoType))) or (i > ord(High(TAmmoType))) then
         begin
         LuaCallError('Invalid ammoType!', call, paramsyntax);
@@ -262,7 +262,7 @@
 function LuaToStatInfoTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline;
 begin
     if lua_isnoneornil(L, i) then i:= -1
-    else i:= lua_tointeger(L, i);
+    else i:= Trunc(lua_tonumber(L, i));
     if (i < ord(Low(TStatInfoType))) or (i > ord(High(TStatInfoType))) then
         begin
         LuaCallError('Invalid statInfoType!', call, paramsyntax);
@@ -275,7 +275,7 @@
 function LuaToSoundOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline;
 begin
     if lua_isnoneornil(L, i) then i:= -1
-    else i:= lua_tointeger(L, i);
+    else i:= Trunc(lua_tonumber(L, i));
     if (i < ord(Low(TSound))) or (i > ord(High(TSound))) then
         begin
         LuaCallError('Invalid soundId!', call, paramsyntax);
@@ -288,10 +288,10 @@
 function LuaToHogEffectOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline;
 begin
     if lua_isnoneornil(L, i) then i:= -1
-    else i:= lua_tointeger(L, i);
+    else i:= Trunc(lua_tonumber(L, i));
     if (i < ord(Low(THogEffect))) or (i > ord(High(THogEffect))) then
         begin
-        LuaCallError('Invalid gear type!', call, paramsyntax);
+        LuaCallError('Invalid effect type!', call, paramsyntax);
         LuaToHogEffectOrd:= -1;
         end
     else
@@ -301,7 +301,7 @@
 function LuaToCapGroupOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline;
 begin
     if lua_isnoneornil(L, i) then i:= -1
-    else i:= lua_tointeger(L, i);
+    else i:= Trunc(lua_tonumber(L, i));
     if (i < ord(Low(TCapGroup))) or (i > ord(High(TCapGroup))) then
         begin
         LuaCallError('Invalid capgroup type!', call, paramsyntax);
@@ -314,7 +314,7 @@
 function LuaToSpriteOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline;
 begin
     if lua_isnoneornil(L, i) then i:= -1
-    else i:= lua_tointeger(L, i);
+    else i:= Trunc(lua_tonumber(L, i));
     if (i < ord(Low(TSprite))) or (i > ord(High(TSprite))) then
         begin
         LuaCallError('Invalid sprite id!', call, paramsyntax);
@@ -327,7 +327,7 @@
 function LuaToMapGenOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline;
 begin
     if lua_isnoneornil(L, i) then i:= -1
-    else i:= lua_tointeger(L, i);
+    else i:= Trunc(lua_tonumber(L, i));
     if (i < ord(Low(TMapGen))) or (i > ord(High(TMapGen))) then
         begin
         LuaCallError('Invalid mapgen id!', call, paramsyntax);
@@ -350,7 +350,7 @@
 function lc_band(L: PLua_State): LongInt; Cdecl;
 begin
     if CheckLuaParamCount(L, 2, 'band', 'value1, value2') then
-        lua_pushinteger(L, lua_tointeger(L, 2) and lua_tointeger(L, 1))
+        lua_pushnumber(L, Trunc(lua_tonumber(L, 2)) and Trunc(lua_tonumber(L, 1)))
     else
         lua_pushnil(L);
     lc_band := 1;
@@ -359,7 +359,7 @@
 function lc_bor(L: PLua_State): LongInt; Cdecl;
 begin
     if CheckLuaParamCount(L, 2, 'bor', 'value1, value2') then
-        lua_pushinteger(L, lua_tointeger(L, 2) or lua_tointeger(L, 1))
+        lua_pushnumber(L, Trunc(lua_tonumber(L, 2)) or Trunc(lua_tonumber(L, 1)))
     else
         lua_pushnil(L);
     lc_bor := 1;
@@ -368,7 +368,7 @@
 function lc_bnot(L: PLua_State): LongInt; Cdecl;
 begin
     if CheckLuaParamCount(L, 1, 'bnot', 'value') then
-        lua_pushinteger(L, (not lua_tointeger(L, 1)))
+        lua_pushnumber(L, (not Trunc(lua_tonumber(L, 1))))
     else
         lua_pushnil(L);
     lc_bnot := 1;
@@ -377,7 +377,7 @@
 function lc_div(L: PLua_State): LongInt; Cdecl;
 begin
     if CheckLuaParamCount(L, 2, 'div', 'dividend, divisor') then
-        lua_pushinteger(L, lua_tointeger(L, 1) div lua_tointeger(L, 2))
+        lua_pushnumber(L, Trunc(lua_tonumber(L, 1)) div Trunc(lua_tonumber(L, 2)))
     else
         lua_pushnil(L);
     lc_div := 1;
@@ -386,14 +386,14 @@
 function lc_getinputmask(L : Plua_State) : LongInt; Cdecl;
 begin
     if CheckLuaParamCount(L, 0, 'GetInputMask', '') then
-        lua_pushinteger(L, InputMask);
+        lua_pushnumber(L, InputMask);
     lc_getinputmask:= 1
 end;
 
 function lc_setinputmask(L : Plua_State) : LongInt; Cdecl;
 begin
     if CheckLuaParamCount(L, 1, 'SetInputMask', 'mask') then
-        InputMask:= lua_tointeger(L, 1);
+        InputMask:= Trunc(lua_tonumber(L, 1));
     lc_setinputmask:= 0
 end;
 
@@ -467,7 +467,7 @@
             cBuildMaxDist:= cDefaultBuildMaxDist;
             end
         else
-            CBuildMaxDist:= lua_tointeger(L, 1);
+            CBuildMaxDist:= Trunc(lua_tonumber(L, 1));
         end;
     lc_setmaxbuilddistance:= 0;
 end;
@@ -539,7 +539,7 @@
 function lc_showmission(L : Plua_State) : LongInt; Cdecl;
 begin
     if CheckLuaParamCount(L, 5, 'ShowMission', 'caption, subcaption, text, icon, time') then
-        ShowMission(lua_tostringA(L, 1), lua_tostringA(L, 2), lua_tostringA(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5));
+        ShowMission(lua_tostringA(L, 1), lua_tostringA(L, 2), lua_tostringA(L, 3), Trunc(lua_tonumber(L, 4)), Trunc(lua_tonumber(L, 5)));
     lc_showmission:= 0;
 end;
 
@@ -550,6 +550,33 @@
     lc_hidemission:= 0;
 end;
 
+function lc_setammotexts(L : Plua_State) : LongInt; Cdecl;
+const
+    call = 'SetAmmoTexts';
+    params = 'ammoType, name, caption, description';
+begin
+    if CheckLuaParamCount(L, 4, call, params) then
+        SetAmmoTexts(TAmmoType(LuaToAmmoTypeOrd(L, 1, call, params)), lua_tostringA(L, 2), lua_tostringA(L, 3), lua_tostringA(L, 4));
+    lc_setammotexts:= 0;
+end;
+
+function lc_setammodescriptionappendix(L : Plua_State) : LongInt; Cdecl;
+const
+    call = 'SetAmmoDescriptionAppendix';
+    params = 'ammoType, descAppend';
+var
+    ammoType: TAmmoType;
+    descAppend: ansistring;
+begin
+    if CheckLuaParamCount(L, 2, call, params) then
+        begin
+        ammoType := TAmmoType(LuaToAmmoTypeOrd(L, 1, call, params));
+        descAppend := lua_tostringA(L, 2);
+        trluaammoa[Ammoz[ammoType].NameId] := descAppend;
+        end;
+    lc_setammodescriptionappendix := 0;
+end;
+
 function lc_enablegameflags(L : Plua_State) : LongInt; Cdecl;
 var i, n : integer;
 begin
@@ -557,7 +584,7 @@
     if CheckAndFetchLuaParamMinCount(L, 1, 'EnableGameFlags', 'gameFlag, ... ', n) then
         begin
         for i:= 1 to n do
-            GameFlags := GameFlags or LongWord(lua_tointeger(L, i));
+            GameFlags := GameFlags or LongWord(Trunc(lua_tonumber(L, i)));
         ScriptSetInteger('GameFlags', GameFlags);
         end;
     lc_enablegameflags:= 0;
@@ -570,7 +597,7 @@
     if CheckAndFetchLuaParamMinCount(L, 1, 'DisableGameFlags', 'gameFlag, ... ', n) then
         begin
         for i:= 1 to n do
-            GameFlags := GameFlags and (not LongWord(lua_tointeger(L, i)));
+            GameFlags := GameFlags and (not LongWord(Trunc(lua_tonumber(L, i))));
         ScriptSetInteger('GameFlags', GameFlags);
         end;
     lc_disablegameflags:= 0;
@@ -589,7 +616,7 @@
 function lc_getgameflag(L : Plua_State) : LongInt; Cdecl;
 begin
     if CheckLuaParamCount(L, 1, 'GetGameFlag', 'gameflag') then
-        lua_pushboolean(L, (GameFlags and LongWord(lua_tointeger(L, 1)) <> 0))
+        lua_pushboolean(L, (GameFlags and LongWord(Trunc(lua_tonumber(L, 1))) <> 0))
     else
         lua_pushnil(L);
     lc_getgameflag:= 1;
@@ -609,7 +636,7 @@
             begin
             cg:= LuaToCapGroupOrd(L, 3, call, params);
             if cg >= 0 then
-                AddCaption(lua_tostringA(L, 1), lua_tointeger(L, 2) shr 8, TCapGroup(cg));
+                AddCaption(lua_tostringA(L, 1), Trunc(lua_tonumber(L, 2)) shr 8, TCapGroup(cg));
             end
         end;
     lc_addcaption:= 0;
@@ -638,10 +665,10 @@
 begin
     if CheckLuaParamCount(L, 4,'SpawnFakeHealthCrate', 'x, y, explode, poison') then
         begin
-        gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2),
+        gear := SpawnFakeCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)),
         HealthCrate, lua_toboolean(L, 3), lua_toboolean(L, 4));
         if gear <> nil then
-             lua_pushinteger(L, gear^.uid)
+             lua_pushnumber(L, gear^.uid)
         else lua_pushnil(L)
         end
     else
@@ -654,10 +681,10 @@
 begin
     if CheckLuaParamCount(L, 4,'SpawnFakeAmmoCrate', 'x, y, explode, poison') then
         begin
-        gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2),
+        gear := SpawnFakeCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)),
         AmmoCrate, lua_toboolean(L, 3), lua_toboolean(L, 4));
         if gear <> nil then
-             lua_pushinteger(L, gear^.uid)
+             lua_pushnumber(L, gear^.uid)
         else lua_pushnil(L)
         end
     else
@@ -670,10 +697,10 @@
 begin
     if CheckLuaParamCount(L, 4,'SpawnFakeUtilityCrate', 'x, y, explode, poison') then
         begin
-        gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2),
+        gear := SpawnFakeCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)),
         UtilityCrate, lua_toboolean(L, 3), lua_toboolean(L, 4));
         if gear <> nil then
-             lua_pushinteger(L, gear^.uid)
+             lua_pushnumber(L, gear^.uid)
         else lua_pushnil(L)
         end
     else
@@ -688,12 +715,12 @@
     if CheckAndFetchParamCount(L, 2, 3, 'SpawnHealthCrate', 'x, y [, health]', n) then
         begin
         if n = 3 then
-            health:= lua_tointeger(L, 3)
+            health:= Trunc(lua_tonumber(L, 3))
         else
             health:= cHealthCaseAmount;
-        gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), HealthCrate, health, 0);
+        gear := SpawnCustomCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)), HealthCrate, health, 0);
         if gear <> nil then
-             lua_pushinteger(L, gear^.uid)
+             lua_pushnumber(L, gear^.uid)
         else lua_pushnil(L);
         end
     else
@@ -708,10 +735,10 @@
     if CheckAndFetchParamCount(L, 3, 4, 'SpawnAmmoCrate', 'x, y, content [, amount]', n) then
         begin
         if n = 3 then
-             gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), AmmoCrate, lua_tointeger(L, 3), 0)
-        else gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), AmmoCrate, lua_tointeger(L, 3), lua_tointeger(L, 4));
+             gear := SpawnCustomCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)), AmmoCrate, Trunc(lua_tonumber(L, 3)), 0)
+        else gear := SpawnCustomCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)), AmmoCrate, Trunc(lua_tonumber(L, 3)), Trunc(lua_tonumber(L, 4)));
         if gear <> nil then
-             lua_pushinteger(L, gear^.uid)
+             lua_pushnumber(L, gear^.uid)
         else lua_pushnil(L);
         end
     else
@@ -726,10 +753,10 @@
     if CheckAndFetchParamCount(L, 3, 4, 'SpawnUtilityCrate', 'x, y, content [, amount]', n) then
         begin
         if n = 3 then
-             gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), UtilityCrate, lua_tointeger(L, 3), 0)
-        else gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), UtilityCrate, lua_tointeger(L, 3), lua_tointeger(L, 4));
+             gear := SpawnCustomCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)), UtilityCrate, Trunc(lua_tonumber(L, 3)), 0)
+        else gear := SpawnCustomCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)), UtilityCrate, Trunc(lua_tonumber(L, 3)), Trunc(lua_tonumber(L, 4)));
         if gear <> nil then
-             lua_pushinteger(L, gear^.uid)
+             lua_pushnumber(L, gear^.uid)
         else lua_pushnil(L);
        end
     else
@@ -752,16 +779,16 @@
         if t >= 0 then
             begin
             gt:= TGearType(t);
-            x:= lua_tointeger(L, 1);
-            y:= lua_tointeger(L, 2);
-            s:= lua_tointeger(L, 4);
-            dx:= int2hwFloat(lua_tointeger(L, 5)) / 1000000;
-            dy:= int2hwFloat(lua_tointeger(L, 6)) / 1000000;
-            t:= lua_tointeger(L, 7);
+            x:= Trunc(lua_tonumber(L, 1));
+            y:= Trunc(lua_tonumber(L, 2));
+            s:= Trunc(lua_tonumber(L, 4));
+            dx:= int2hwFloat(Trunc(lua_tonumber(L, 5))) / 1000000;
+            dy:= int2hwFloat(Trunc(lua_tonumber(L, 6))) / 1000000;
+            t:= Trunc(lua_tonumber(L, 7));
 
             gear:= AddGear(x, y, gt, s, dx, dy, t);
             lastGearByUID:= gear;
-            lua_pushinteger(L, gear^.uid)
+            lua_pushnumber(L, gear^.uid)
             end
         else
             lua_pushnil(L);
@@ -776,7 +803,7 @@
 begin
     if CheckLuaParamCount(L, 1, 'DeleteGear', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             gear^.Message:= gear^.Message or gmDelete;
         end;
@@ -800,14 +827,14 @@
         if s >= 0 then
             begin
             vgt:= TVisualGearType(s);
-            x:= lua_tointeger(L, 1);
-            y:= lua_tointeger(L, 2);
-            s:= lua_tointeger(L, 4);
+            x:= Trunc(lua_tonumber(L, 1));
+            y:= Trunc(lua_tonumber(L, 2));
+            s:= Trunc(lua_tonumber(L, 4));
             c:= lua_toboolean(L, 5);
 
             if n = 6 then
                 begin
-                layer:= lua_tointeger(L, 6);
+                layer:= Trunc(lua_tonumber(L, 6));
                 vg:= AddVisualGear(x, y, vgt, s, c, layer);
                 end
             else
@@ -817,7 +844,7 @@
                 begin
                 lastVisualGearByUID:= vg;
                 uid:= vg^.uid;
-                lua_pushinteger(L, uid);
+                lua_pushnumber(L, uid);
                 end;
             end
             else
@@ -834,7 +861,7 @@
     vg:= nil;
     if CheckLuaParamCount(L, 1, 'DeleteVisualGear', 'vgUid') then
         begin
-        vg:= VisualGearByUID(lua_tointeger(L, 1));
+        vg:= VisualGearByUID(Trunc(lua_tonumber(L, 1)));
         if vg <> nil then
             DeleteVisualGear(vg);
         end;
@@ -843,24 +870,41 @@
     lc_deletevisualgear:= 1
 end;
 
+function lc_getvisualgeartype(L : Plua_State) : LongInt; Cdecl;
+var vg : PVisualGear;
+begin
+    if CheckLuaParamCount(L, 1, 'GetVisualGearType', 'vgUid') then
+        begin
+        vg := VisualGearByUID(Trunc(lua_tonumber(L, 1)));
+        if vg <> nil then
+            lua_pushnumber(L, ord(vg^.Kind))
+        else
+            lua_pushnil(L);
+        end
+    else
+        lua_pushnil(L); // return value on stack (nil)
+    lc_getvisualgeartype:= 1
+end;
+
+
 function lc_getvisualgearvalues(L : Plua_State) : LongInt; Cdecl;
 var vg: PVisualGear;
 begin
     if CheckLuaParamCount(L, 1, 'GetVisualGearValues', 'vgUid') then
         begin
-        vg:= VisualGearByUID(lua_tointeger(L, 1));
+        vg:= VisualGearByUID(Trunc(lua_tonumber(L, 1)));
         if vg <> nil then
             begin
-            lua_pushinteger(L, round(vg^.X));
-            lua_pushinteger(L, round(vg^.Y));
+            lua_pushnumber(L, round(vg^.X));
+            lua_pushnumber(L, round(vg^.Y));
             lua_pushnumber(L, vg^.dX);
             lua_pushnumber(L, vg^.dY);
             lua_pushnumber(L, vg^.Angle);
-            lua_pushinteger(L, vg^.Frame);
-            lua_pushinteger(L, vg^.FrameTicks);
-            lua_pushinteger(L, vg^.State);
-            lua_pushinteger(L, vg^.Timer);
-            lua_pushinteger(L, vg^.Tint);
+            lua_pushnumber(L, vg^.Frame);
+            lua_pushnumber(L, vg^.FrameTicks);
+            lua_pushnumber(L, vg^.State);
+            lua_pushnumber(L, vg^.Timer);
+            lua_pushnumber(L, vg^.Tint);
             end
         else
             begin
@@ -882,13 +926,13 @@
 // Param count can be 1-11 at present
 //    if CheckLuaParamCount(L, 11, 'SetVisualGearValues', 'vgUid, X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint') then
 //        begin
-        vg:= VisualGearByUID(lua_tointeger(L, 1));
+        vg:= VisualGearByUID(Trunc(lua_tonumber(L, 1)));
         if vg <> nil then
             begin
             if not lua_isnoneornil(L, 2) then
-                vg^.X:= lua_tointeger(L, 2);
+                vg^.X:= Trunc(lua_tonumber(L, 2));
             if not lua_isnoneornil(L, 3) then
-                vg^.Y:= lua_tointeger(L, 3);
+                vg^.Y:= Trunc(lua_tonumber(L, 3));
             if not lua_isnoneornil(L, 4) then
                 vg^.dX:= lua_tonumber(L, 4);
             if not lua_isnoneornil(L, 5) then
@@ -896,15 +940,15 @@
             if not lua_isnoneornil(L, 6) then
                 vg^.Angle:= lua_tonumber(L, 6);
             if not lua_isnoneornil(L, 7) then
-                vg^.Frame:= lua_tointeger(L, 7);
+                vg^.Frame:= Trunc(lua_tonumber(L, 7));
             if not lua_isnoneornil(L, 8) then
-                vg^.FrameTicks:= lua_tointeger(L, 8);
+                vg^.FrameTicks:= Trunc(lua_tonumber(L, 8));
             if not lua_isnoneornil(L, 9) then
-                vg^.State:= lua_tointeger(L, 9);
+                vg^.State:= Trunc(lua_tonumber(L, 9));
             if not lua_isnoneornil(L, 10) then
-                vg^.Timer:= lua_tointeger(L, 10);
+                vg^.Timer:= Trunc(lua_tonumber(L, 10));
             if not lua_isnoneornil(L, 11) then
-                vg^.Tint:= lua_tointeger(L, 11)
+                vg^.Tint:= Trunc(lua_tonumber(L, 11))
             end;
 //        end
 //    else
@@ -919,22 +963,22 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetGearValues', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             begin
-            lua_pushinteger(L, gear^.Angle);
-            lua_pushinteger(L, gear^.Power);
-            lua_pushinteger(L, gear^.WDTimer);
-            lua_pushinteger(L, gear^.Radius);
-            lua_pushinteger(L, hwRound(gear^.Density * _10000));
-            lua_pushinteger(L, gear^.Karma);
+            lua_pushnumber(L, gear^.Angle);
+            lua_pushnumber(L, gear^.Power);
+            lua_pushnumber(L, gear^.WDTimer);
+            lua_pushnumber(L, gear^.Radius);
+            lua_pushnumber(L, hwRound(gear^.Density * _10000));
+            lua_pushnumber(L, gear^.Karma);
             lua_pushnumber(L,  gear^.DirAngle);
-            lua_pushinteger(L, gear^.AdvBounce);
-            lua_pushinteger(L, Integer(gear^.ImpactSound));
-            lua_pushinteger(L, gear^.nImpactSounds);
-            lua_pushinteger(L, gear^.Tint);
-            lua_pushinteger(L, gear^.Damage);
-            lua_pushinteger(L, gear^.Boom)
+            lua_pushnumber(L, gear^.AdvBounce);
+            lua_pushnumber(L, Integer(gear^.ImpactSound));
+            lua_pushnumber(L, gear^.nImpactSounds);
+            lua_pushnumber(L, gear^.Tint);
+            lua_pushnumber(L, gear^.Damage);
+            lua_pushnumber(L, gear^.Boom)
             end
         else
             begin
@@ -958,35 +1002,35 @@
 // Currently allows 1-14 params
 //    if CheckLuaParamCount(L, 14, 'SetGearValues', 'gearUid, Angle, Power, WDTimer, Radius, Density, Karma, DirAngle, AdvBounce, ImpactSound, # ImpactSounds, Tint, Damage, Boom') then
 //        begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             begin
             if not lua_isnoneornil(L, 2) then
-                gear^.Angle := lua_tointeger(L, 2);
+                gear^.Angle := Trunc(lua_tonumber(L, 2));
             if not lua_isnoneornil(L, 3) then
-                gear^.Power := lua_tointeger(L, 3);
+                gear^.Power := Trunc(lua_tonumber(L, 3));
             if not lua_isnoneornil(L, 4) then
-                gear^.WDTimer := lua_tointeger(L, 4);
+                gear^.WDTimer := Trunc(lua_tonumber(L, 4));
             if not lua_isnoneornil(L, 5) then
-                gear^.Radius := lua_tointeger(L, 5);
+                gear^.Radius := Trunc(lua_tonumber(L, 5));
             if not lua_isnoneornil(L, 6) then
-                gear^.Density:= int2hwFloat(lua_tointeger(L, 6)) / 10000;
+                gear^.Density:= int2hwFloat(Trunc(lua_tonumber(L, 6))) / 10000;
             if not lua_isnoneornil(L, 7) then
-                gear^.Karma := lua_tointeger(L, 7);
+                gear^.Karma := Trunc(lua_tonumber(L, 7));
             if not lua_isnoneornil(L, 8) then
                 gear^.DirAngle:= lua_tonumber(L, 8);
             if not lua_isnoneornil(L, 9) then
-                gear^.AdvBounce := lua_tointeger(L, 9);
+                gear^.AdvBounce := Trunc(lua_tonumber(L, 9));
             if not lua_isnoneornil(L, 10) then
-                gear^.ImpactSound := TSound(lua_tointeger(L, 10));
+                gear^.ImpactSound := TSound(Trunc(lua_tonumber(L, 10)));
             if not lua_isnoneornil(L, 11) then
-                gear^.nImpactSounds := lua_tointeger(L, 11);
+                gear^.nImpactSounds := Trunc(lua_tonumber(L, 11));
             if not lua_isnoneornil(L, 12) then
-                gear^.Tint := lua_tointeger(L, 12);
+                gear^.Tint := Trunc(lua_tonumber(L, 12));
             if not lua_isnoneornil(L, 13) then
-                gear^.Damage := lua_tointeger(L, 13);
+                gear^.Damage := Trunc(lua_tonumber(L, 13));
             if not lua_isnoneornil(L, 14) then
-                gear^.Boom := lua_tointeger(L, 14);
+                gear^.Boom := Trunc(lua_tonumber(L, 14));
             end;
 //        end
 //    else
@@ -1001,7 +1045,7 @@
         if FollowGear = nil then
             lua_pushnil(L)
         else
-            lua_pushinteger(L, FollowGear^.uid);
+            lua_pushnumber(L, FollowGear^.uid);
         end
     else
         lua_pushnil(L);
@@ -1013,9 +1057,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetGearType', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, ord(gear^.Kind))
+            lua_pushnumber(L, ord(gear^.Kind))
         else
             lua_pushnil(L);
         end
@@ -1029,9 +1073,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetGearMessage', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, gear^.message)
+            lua_pushnumber(L, gear^.message)
         else
             lua_pushnil(L);
         end
@@ -1045,9 +1089,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetGearElasticity', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, hwRound(gear^.elasticity * _10000))
+            lua_pushnumber(L, hwRound(gear^.elasticity * _10000))
         else
             lua_pushnil(L);
         end
@@ -1061,9 +1105,9 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetGearElasticity', 'gearUid, Elasticity') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            gear^.Elasticity:= int2hwFloat(lua_tointeger(L, 2)) / 10000
+            gear^.Elasticity:= int2hwFloat(Trunc(lua_tonumber(L, 2))) / 10000
         end;
     lc_setgearelasticity:= 0
 end;
@@ -1073,9 +1117,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetGearFriction', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, hwRound(gear^.friction * _10000))
+            lua_pushnumber(L, hwRound(gear^.friction * _10000))
         else
             lua_pushnil(L);
         end
@@ -1089,9 +1133,9 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetGearFriction', 'gearUid, Friction') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            gear^.Friction:= int2hwFloat(lua_tointeger(L, 2)) / 10000
+            gear^.Friction:= int2hwFloat(Trunc(lua_tonumber(L, 2))) / 10000
         end;
     lc_setgearfriction:= 0
 end;
@@ -1101,9 +1145,9 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetGearMessage', 'gearUid, message') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            gear^.message:= lua_tointeger(L, 2);
+            gear^.message:= Trunc(lua_tonumber(L, 2));
         end;
     lc_setgearmessage:= 0
 end;
@@ -1113,9 +1157,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetGearPos', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, gear^.Pos)
+            lua_pushnumber(L, gear^.Pos)
         else
             lua_pushnil(L);
         end
@@ -1129,9 +1173,9 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetGearPos', 'gearUid, value') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            gear^.Pos:= lua_tointeger(L, 2);
+            gear^.Pos:= Trunc(lua_tonumber(L, 2));
         end;
     lc_setgearpos:= 0
 end;
@@ -1141,9 +1185,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetGearCollisionMask', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, gear^.CollisionMask)
+            lua_pushnumber(L, gear^.CollisionMask)
         else
             lua_pushnil(L);
         end
@@ -1157,9 +1201,9 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetGearCollisionMask', 'gearUid, mask') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            gear^.CollisionMask:= lua_tointeger(L, 2);
+            gear^.CollisionMask:= Trunc(lua_tonumber(L, 2));
         end;
     lc_setgearcollisionmask:= 0
 end;
@@ -1169,9 +1213,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetHogLevel', 'gearUid') then
         begin
-        gear := GearByUID(lua_tointeger(L, 1));
+        gear := GearByUID(Trunc(lua_tonumber(L, 1)));
         if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then
-            lua_pushinteger(L, gear^.Hedgehog^.BotLevel)
+            lua_pushnumber(L, gear^.Hedgehog^.BotLevel)
         else
             lua_pushnil(L);
     end;
@@ -1183,9 +1227,9 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetHogLevel', 'gearUid, level') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then
-            gear^.Hedgehog^.BotLevel:= lua_tointeger(L, 2);
+            gear^.Hedgehog^.BotLevel:= Trunc(lua_tonumber(L, 2));
         end;
     lc_sethoglevel:= 0
 end;
@@ -1195,10 +1239,10 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetHogClan', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then
             begin
-            lua_pushinteger(L, gear^.Hedgehog^.Team^.Clan^.ClanIndex)
+            lua_pushnumber(L, gear^.Hedgehog^.Team^.Clan^.ClanIndex)
             end
         else
             lua_pushnil(L);
@@ -1213,7 +1257,7 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetClanColor', 'clanIdx') then
         begin
-        idx:= lua_tointeger(L, 1);
+        idx:= Trunc(lua_tonumber(L, 1));
         if (not lua_isnumber(L, 1)) then
             begin
             LuaError('Argument ''clanIdx'' must be a number!');
@@ -1225,7 +1269,7 @@
             lua_pushnil(L);
             end
         else
-            lua_pushinteger(L, ClansArray[idx]^.Color shl 8 or $FF);
+            lua_pushnumber(L, ClansArray[idx]^.Color shl 8 or $FF);
         end
     else
         lua_pushnil(L); // return value on stack (nil)
@@ -1240,10 +1284,10 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetClanColor', 'clan, color') then
         begin
-        i:= lua_tointeger(L,1);
+        i:= Trunc(lua_tonumber(L,1));
         if i >= ClansCount then exit(0);
         clan := ClansArray[i];
-        clan^.Color:= lua_tointeger(L, 2) shr 8;
+        clan^.Color:= Trunc(lua_tonumber(L, 2)) shr 8;
 
         for i:= 0 to Pred(clan^.TeamsNumber) do
             begin
@@ -1274,7 +1318,7 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetHogVoicepack', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then
             lua_pushstring(L, str2pchar(gear^.Hedgehog^.Team^.Voicepack^.name))
         else
@@ -1290,7 +1334,7 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetHogGrave', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then
             lua_pushstring(L, str2pchar(gear^.Hedgehog^.Team^.GraveName))
         else
@@ -1306,7 +1350,8 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetHogFlag', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
+        // TODO error messages
         if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then
             lua_pushstring(L, str2pchar(gear^.Hedgehog^.Team^.Flag))
         else
@@ -1317,12 +1362,47 @@
     lc_gethogflag:= 1
 end;
 
+function lc_gethogfort(L : Plua_State) : LongInt; Cdecl;
+var gear : PGear;
+begin
+    if CheckLuaParamCount(L, 1, 'GetHogFort', 'gearUid') then
+        begin
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
+        // TODO error messages
+        if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then
+            lua_pushstring(L, str2pchar(gear^.Hedgehog^.Team^.FortName))
+        else
+            lua_pushnil(L);
+        end
+    else
+        lua_pushnil(L); // return value on stack (nil)
+    lc_gethogfort:= 1
+end;
+
+function lc_ishoglocal(L : Plua_State) : LongInt; Cdecl;
+var gear : PGear;
+begin
+    if CheckLuaParamCount(L, 1, 'IsHogLocal', 'gearUid') then
+        begin
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
+        // TODO error messages
+        if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then
+            lua_pushboolean(L, IsHogLocal(gear^.Hedgehog))
+        else
+            lua_pushnil(L);
+        end
+    else
+        lua_pushnil(L); // return value on stack (nil)
+    lc_ishoglocal:= 1
+end;
+
 function lc_gethogteamname(L : Plua_State) : LongInt; Cdecl;
 var gear : PGear;
 begin
     if CheckLuaParamCount(L, 1, 'GetHogTeamName', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
+        // TODO error messages
         if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then
             lua_pushstring(L, str2pchar(gear^.Hedgehog^.Team^.TeamName))
         else
@@ -1338,7 +1418,7 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetHogTeamName', 'gearUid, name') then
         begin
-        gear := GearByUID(lua_tointeger(L, 1));
+        gear := GearByUID(Trunc(lua_tonumber(L, 1)));
         if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then
             begin
             gear^.Hedgehog^.Team^.TeamName := lua_tostring(L, 2);
@@ -1359,7 +1439,7 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetHogName', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then
             begin
             lua_pushstring(L, str2pchar(gear^.Hedgehog^.Name))
@@ -1377,7 +1457,7 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetHogName', 'gearUid, name') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then
             begin
             gear^.Hedgehog^.Name:= lua_tostring(L, 2);
@@ -1394,9 +1474,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetTimer', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, gear^.Timer)
+            lua_pushnumber(L, gear^.Timer)
         else
             lua_pushnil(L);
         end
@@ -1410,9 +1490,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetFlightTime', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, gear^.FlightTime)
+            lua_pushnumber(L, gear^.FlightTime)
         else
             lua_pushnil(L);
         end
@@ -1426,9 +1506,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetHealth', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, gear^.Health)
+            lua_pushnumber(L, gear^.Health)
         else
             lua_pushnil(L);
         end
@@ -1442,9 +1522,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetX', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, hwRound(gear^.X))
+            lua_pushnumber(L, hwRound(gear^.X))
         else
             lua_pushnil(L);
         end
@@ -1458,9 +1538,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetY', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, hwRound(gear^.Y))
+            lua_pushnumber(L, hwRound(gear^.Y))
         else
             lua_pushnil(L);
         end
@@ -1474,8 +1554,8 @@
 begin
     if CheckLuaParamCount(L, 2, 'CopyPV', 'fromGearUid, toGearUid') then
         begin
-        gears:= GearByUID(lua_tointeger(L, 1));
-        geard:= GearByUID(lua_tointeger(L, 2));
+        gears:= GearByUID(Trunc(lua_tonumber(L, 1)));
+        geard:= GearByUID(Trunc(lua_tonumber(L, 2)));
         if (gears <> nil) and (geard <> nil) then
             begin
             geard^.X:= gears^.X;
@@ -1492,7 +1572,7 @@
 begin
     if CheckLuaParamCount(L, 1, 'FollowGear', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then FollowGear:= gear
         end;
     lc_followgear:= 0
@@ -1506,12 +1586,12 @@
 begin
     if CheckAndFetchParamCount(L, 3, 4, 'HogSay', 'gearUid, text, manner [, vgState]', n) then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             begin
             // state defaults to 0 if state param is given
             if n = 4 then
-                s:= lua_tointeger(L, 4)
+                s:= Trunc(lua_tonumber(L, 4))
             else
                 s:= 0;
             vgear:= AddVisualGear(0, 0, vgtSpeechBubble, s, true);
@@ -1525,10 +1605,10 @@
                    end
                else vgear^.Frame:= gear^.uid;
 
-               vgear^.FrameTicks:= lua_tointeger(L, 3);
+               vgear^.FrameTicks:= Trunc(lua_tonumber(L, 3));
                if (vgear^.FrameTicks < 1) or (vgear^.FrameTicks > 3) then
                    vgear^.FrameTicks:= 1;
-               lua_pushinteger(L, vgear^.Uid);
+               lua_pushnumber(L, vgear^.Uid);
                end
             end
         else
@@ -1544,7 +1624,7 @@
 begin
     if CheckLuaParamCount(L, 1, 'SwitchHog', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
 // should we allow this when there is no current hedgehog? might do some odd(er) things to turn sequence.
         if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) and (CurrentHedgehog <> nil) then
             begin
@@ -1558,8 +1638,14 @@
                 end;
 
             SwitchCurrentHedgehog(gear^.Hedgehog);
+            AmmoMenuInvalidated:= true;
             CurrentTeam:= CurrentHedgehog^.Team;
 
+            repeat
+                CurrentTeam^.CurrHedgehog := (CurrentTeam^.CurrHedgehog + 1) mod CurrentTeam^.HedgehogsNumber
+            until
+                CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear = CurrentHedgehog^.Gear;
+
             gear^.State:= gear^.State or gstHHDriven;
             gear^.Active := true;
             gear^.Z := cCurrHHZ;
@@ -1581,12 +1667,12 @@
         at:= LuaToAmmoTypeOrd(L, 2, call, params);
         if at >= 0 then
             begin
-            gear:= GearByUID(lua_tointeger(L, 1));
+            gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
             if (gear <> nil) and (gear^.Hedgehog <> nil) then
                 if n = 2 then
                     AddAmmo(gear^.Hedgehog^, TAmmoType(at))
                 else
-                    SetAmmo(gear^.Hedgehog^, TAmmoType(at), lua_tointeger(L, 3))
+                    SetAmmo(gear^.Hedgehog^, TAmmoType(at), Trunc(lua_tonumber(L, 3)))
             end;
         end;
     lc_addammo:= 0
@@ -1602,7 +1688,7 @@
 begin
     if CheckLuaParamCount(L, 2, call, params) then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if (gear <> nil) and (gear^.Hedgehog <> nil) then
             begin
             at:= LuaToAmmoTypeOrd(L, 2, call, params);
@@ -1610,12 +1696,12 @@
                 begin
                 ammo:= GetAmmoEntry(gear^.Hedgehog^, TAmmoType(at));
                 if ammo^.AmmoType = amNothing then
-                    lua_pushinteger(L, 0)
+                    lua_pushnumber(L, 0)
                 else
-                    lua_pushinteger(L, ammo^.Count);
+                    lua_pushnumber(L, ammo^.Count);
                 end;
             end
-        else lua_pushinteger(L, 0);
+        else lua_pushnumber(L, 0);
         end
     else
         lua_pushnil(L);
@@ -1627,10 +1713,10 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetHealth', 'gearUid, health') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             begin
-            gear^.Health:= lua_tointeger(L, 2);
+            gear^.Health:= Trunc(lua_tonumber(L, 2));
 
             if (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then
                 begin
@@ -1651,8 +1737,8 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetTimer', 'gearUid, timer') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
-        if gear <> nil then gear^.Timer:= lua_tointeger(L, 2)
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
+        if gear <> nil then gear^.Timer:= Trunc(lua_tonumber(L, 2))
         end;
     lc_settimer:= 0
 end;
@@ -1662,8 +1748,8 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetFlightTime', 'gearUid, flighttime') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
-        if gear <> nil then gear^.FlightTime:= lua_tointeger(L, 2)
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
+        if gear <> nil then gear^.FlightTime:= Trunc(lua_tonumber(L, 2))
         end;
     lc_setflighttime:= 0
 end;
@@ -1680,9 +1766,9 @@
         t:= LuaToHogEffectOrd(L, 2, call, params);
         if t >= 0 then
             begin
-            gear := GearByUID(lua_tointeger(L, 1));
+            gear := GearByUID(Trunc(lua_tonumber(L, 1)));
             if (gear <> nil) and (gear^.Hedgehog <> nil) then
-                gear^.Hedgehog^.Effects[THogEffect(t)]:= lua_tointeger(L, 3);
+                gear^.Hedgehog^.Effects[THogEffect(t)]:= Trunc(lua_tonumber(L, 3));
             end;
         end;
     lc_seteffect := 0;
@@ -1700,15 +1786,15 @@
         t:= LuaToHogEffectOrd(L, 2, call, params);
         if t >= 0 then
             begin
-            gear:= GearByUID(lua_tointeger(L, 1));
+            gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
             if (gear <> nil) and (gear^.Hedgehog <> nil) then
-                lua_pushinteger(L, gear^.Hedgehog^.Effects[THogEffect(t)])
+                lua_pushnumber(L, gear^.Hedgehog^.Effects[THogEffect(t)])
             else
-                lua_pushinteger(L, 0)
+                lua_pushnumber(L, 0)
             end;
         end
     else
-        lua_pushinteger(L, 0);
+        lua_pushnumber(L, 0);
     lc_geteffect:= 1
 end;
 
@@ -1717,10 +1803,10 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetState', 'gearUid, state') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             begin
-            gear^.State:= lua_tointeger(L, 2);
+            gear^.State:= Trunc(lua_tonumber(L, 2));
             SetAllToActive;
             end
         end;
@@ -1732,9 +1818,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetState', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, gear^.State)
+            lua_pushnumber(L, gear^.State)
         else
             lua_pushnil(L)
         end
@@ -1748,9 +1834,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetTag', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, gear^.Tag)
+            lua_pushnumber(L, gear^.Tag)
         else
             lua_pushnil(L);
         end
@@ -1764,10 +1850,10 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetTag', 'gearUid, tag') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             begin
-            gear^.Tag:= lua_tointeger(L, 2);
+            gear^.Tag:= Trunc(lua_tonumber(L, 2));
             SetAllToActive;
             end
         end;
@@ -1781,6 +1867,19 @@
     lc_endgame:= 0
 end;
 
+function lc_endturn(L : Plua_State) : LongInt; Cdecl;
+var n: LongInt;
+const
+    call = 'EndTurn';
+    params = '[noTaunts]';
+begin
+    if CheckAndFetchParamCount(L, 0, 1, call, params, n) then
+        if n >= 1 then
+            LuaNoEndTurnTaunts:= lua_toboolean(L, 1);
+    LuaEndTurnRequested:= true;
+    lc_endturn:= 0
+end;
+
 function lc_sendstat(L : Plua_State) : LongInt; Cdecl;
 var statInfo : TStatInfoType;
     i, n     : LongInt;
@@ -1844,6 +1943,27 @@
     lc_sendstat:= 0
 end;
 
+function lc_sendgameresultoff(L : Plua_State) : LongInt; Cdecl;
+begin
+    L:= L; // avoid compiler hint
+    uStats.SendGameResultOn := false;
+    lc_sendgameresultoff:= 0
+end;
+
+function lc_sendrankingstatsoff(L : Plua_State) : LongInt; Cdecl;
+begin
+    L:= L; // avoid compiler hint
+    uStats.SendRankingStatsOn := false;
+    lc_sendrankingstatsoff:= 0
+end;
+
+function lc_sendachievementsstatsoff(L : Plua_State) : LongInt; Cdecl;
+begin
+    L:= L; // avoid compiler hint
+    uStats.SendAchievementsStatsOn := false;
+    lc_sendachievementsstatsoff:= 0
+end;
+
 function lc_sendhealthstatsoff(L : Plua_State) : LongInt; Cdecl;
 begin
     L:= L; // avoid compiler hint
@@ -1859,10 +1979,10 @@
 begin
     if CheckAndFetchParamCount(L, 4, 5, 'FindPlace', 'gearUid, fall, left, right [, tryHarder]', n) then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         fall:= lua_toboolean(L, 2);
-        left:= lua_tointeger(L, 3);
-        right:= lua_tointeger(L, 4);
+        left:= Trunc(lua_tonumber(L, 3));
+        right:= Trunc(lua_tonumber(L, 4));
         if n = 5 then
             tryhard:= lua_toboolean(L, 5)
         else
@@ -1870,7 +1990,7 @@
         if gear <> nil then
             FindPlace(gear, fall, left, right, tryhard);
         if gear <> nil then
-            lua_pushinteger(L, gear^.uid)
+            lua_pushnumber(L, gear^.uid)
         else
             lua_pushnil(L);
         end
@@ -1896,7 +2016,7 @@
                 PlaySound(TSound(s))
             else
                 begin
-                gear:= GearByUID(lua_tointeger(L, 2));
+                gear:= GearByUID(Trunc(lua_tonumber(L, 2)));
                 if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then
                     AddVoice(TSound(s),gear^.Hedgehog^.Team^.Voicepack)
                 end;
@@ -1917,7 +2037,7 @@
         if (np = 6) then ParseCommand('flag ' + lua_tostring(L, 6), true, true);
         CurrentTeam^.Binds:= DefaultBinds
         // fails on x64
-        //lua_pushinteger(L, LongInt(CurrentTeam));
+        //lua_pushnumber(L, LongInt(CurrentTeam));
         end;
     //else
         //lua_pushnil(L)
@@ -1967,6 +2087,53 @@
     lc_dismissteam:= 0;
 end;
 
+function lc_getteamstats(L : Plua_State) : LongInt; Cdecl;
+var i: LongInt;
+begin
+    if CheckLuaParamCount(L, 1, 'GetTeamStats', 'teamname') then
+        begin
+        if TeamsCount > 0 then
+            for i:= 0 to Pred(TeamsCount) do
+                begin
+                // skip teams that don't have matching name
+                if TeamsArray[i]^.TeamName <> lua_tostring(L, 1) then
+                    continue;
+
+                lua_newtable(L);
+
+                lua_pushstring(L, str2pchar('Kills'));
+                lua_pushnumber(L, TeamsArray[i]^.stats.Kills);
+                lua_settable(L, -3);
+
+                lua_pushstring(L, str2pchar('Suicides'));
+                lua_pushnumber(L, TeamsArray[i]^.stats.Suicides);
+                lua_settable(L, -3);
+
+                lua_pushstring(L, str2pchar('AIKills'));
+                lua_pushnumber(L, TeamsArray[i]^.stats.AIKills);
+                lua_settable(L, -3);
+
+                lua_pushstring(L, str2pchar('TeamKills'));
+                lua_pushnumber(L, TeamsArray[i]^.stats.TeamKills);
+                lua_settable(L, -3);
+
+                lua_pushstring(L, str2pchar('TurnSkips'));
+                lua_pushnumber(L, TeamsArray[i]^.stats.TurnSkips);
+                lua_settable(L, -3);
+
+                lua_pushstring(L, str2pchar('TeamDamage'));
+                lua_pushnumber(L, TeamsArray[i]^.stats.TeamDamage);
+                lua_settable(L, -3);
+
+                end;
+        end
+    else
+        lua_pushnil(L);
+    lc_getteamstats:= 1;
+end;
+
+
+
 function lc_addhog(L : Plua_State) : LongInt; Cdecl;
 var temp: ShortString;
 begin
@@ -1975,7 +2142,7 @@
         temp:= lua_tostring(L, 4);
         ParseCommand('addhh ' + lua_tostring(L, 2) + ' ' + lua_tostring(L, 3) + ' ' + lua_tostring(L, 1), true, true);
         ParseCommand('hat ' + temp, true, true);
-        lua_pushinteger(L, CurrentHedgehog^.Gear^.uid);
+        lua_pushnumber(L, CurrentHedgehog^.Gear^.uid);
         end
     else
         lua_pushnil(L);
@@ -1987,7 +2154,7 @@
 begin
     if CheckLuaParamCount(L, 2, 'HogTurnLeft', 'gearUid, boolean') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             gear^.dX.isNegative:= lua_toboolean(L, 2);
         end;
@@ -1999,11 +2166,11 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetGearPosition', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             begin
-            lua_pushinteger(L, hwRound(gear^.X));
-            lua_pushinteger(L, hwRound(gear^.Y))
+            lua_pushnumber(L, hwRound(gear^.X));
+            lua_pushnumber(L, hwRound(gear^.Y))
             end
         else
             begin
@@ -2026,12 +2193,12 @@
 begin
     if CheckLuaParamCount(L, 3, 'SetGearPosition', 'gearUid, x, y') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             begin
             col:= gear^.CollisionIndex >= 0;
-            x:= lua_tointeger(L, 2);
-            y:= lua_tointeger(L, 3);
+            x:= Trunc(lua_tonumber(L, 2));
+            y:= Trunc(lua_tonumber(L, 3));
             if col then
                 DeleteCI(gear);
             gear^.X:= int2hwfloat(x);
@@ -2049,11 +2216,11 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetGearTarget', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             begin
-            lua_pushinteger(L, gear^.Target.X);
-            lua_pushinteger(L, gear^.Target.Y)
+            lua_pushnumber(L, gear^.Target.X);
+            lua_pushnumber(L, gear^.Target.Y)
             end
         else
             begin
@@ -2074,11 +2241,11 @@
 begin
     if CheckLuaParamCount(L, 3, 'SetGearTarget', 'gearUid, x, y') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             begin
-            gear^.Target.X:= lua_tointeger(L, 2);
-            gear^.Target.Y:= lua_tointeger(L, 3)
+            gear^.Target.X:= Trunc(lua_tonumber(L, 2));
+            gear^.Target.Y:= Trunc(lua_tonumber(L, 3))
             end
         end;
     lc_setgeartarget:= 0
@@ -2090,14 +2257,14 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetGearVelocity', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             begin
             t:= hwRound(gear^.dX * 1000000);
             // gear dX determines hog orientation
             if (gear^.dX.isNegative) and (t = 0) then t:= -1;
-            lua_pushinteger(L, t);
-            lua_pushinteger(L, hwRound(gear^.dY * 1000000))
+            lua_pushnumber(L, t);
+            lua_pushnumber(L, hwRound(gear^.dY * 1000000))
             end
         end
     else
@@ -2113,11 +2280,11 @@
 begin
     if CheckLuaParamCount(L, 3, 'SetGearVelocity', 'gearUid, dx, dy') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
             begin
-            gear^.dX:= int2hwFloat(lua_tointeger(L, 2)) / 1000000;
-            gear^.dY:= int2hwFloat(lua_tointeger(L, 3)) / 1000000;
+            gear^.dX:= int2hwFloat(Trunc(lua_tonumber(L, 2))) / 1000000;
+            gear^.dY:= int2hwFloat(Trunc(lua_tonumber(L, 3))) / 1000000;
             SetAllToActive;
             end
         end;
@@ -2158,9 +2325,9 @@
         if at >= 0 then
             begin
             if np = 4 then
-                ScriptSetAmmo(TAmmoType(at), lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), 1)
+                ScriptSetAmmo(TAmmoType(at), Trunc(lua_tonumber(L, 2)), Trunc(lua_tonumber(L, 3)), Trunc(lua_tonumber(L, 4)), 1)
             else
-                ScriptSetAmmo(TAmmoType(at), lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5));
+                ScriptSetAmmo(TAmmoType(at), Trunc(lua_tonumber(L, 2)), Trunc(lua_tonumber(L, 3)), Trunc(lua_tonumber(L, 4)), Trunc(lua_tonumber(L, 5)));
             end;
         end;
     lc_setammo:= 0
@@ -2176,31 +2343,19 @@
         begin
         at:= LuaToAmmoTypeOrd(L, 1, call, params);
         if at >= 0 then
-            ScriptSetAmmoDelay(TAmmoType(at), lua_tointeger(L, 2));
+            ScriptSetAmmoDelay(TAmmoType(at), Trunc(lua_tonumber(L, 2)));
         end;
     lc_setammodelay:= 0
 end;
 
-function lc_setammostore(L : Plua_State) : LongInt; Cdecl;
-begin
-    if CheckLuaParamCount(L, 4, 'SetAmmoStore', 'loadouts, probabilities, delays, reinforments') then
-        begin
-        ScriptAmmoLoadout:= lua_tostring(L, 1);
-        ScriptAmmoProbability:= lua_tostring(L, 2);
-        ScriptAmmoDelay:= lua_tostring(L, 3);
-        ScriptAmmoReinforcement:= lua_tostring(L, 4);
-        end;
-    lc_setammostore:= 0
-end;
-
 function lc_getrandom(L : Plua_State) : LongInt; Cdecl;
 var m : LongInt;
 begin
     if CheckLuaParamCount(L, 1, 'GetRandom', 'number') then
         begin
-        m:= lua_tointeger(L, 1);
+        m:= Trunc(lua_tonumber(L, 1));
         if (m > 0) then
-            lua_pushinteger(L, GetRandom(m))
+            lua_pushnumber(L, GetRandom(m))
         else
             begin
             LuaError('Lua: Tried to pass 0 to GetRandom!');
@@ -2216,7 +2371,7 @@
 begin
     if CheckLuaParamCount(L, 1, 'SetWind', 'windSpeed') then
         begin
-        cWindSpeed:= int2hwfloat(lua_tointeger(L, 1)) / 100 * cMaxWindSpeed;
+        cWindSpeed:= int2hwfloat(Trunc(lua_tonumber(L, 1))) / 100 * cMaxWindSpeed;
         cWindSpeedf:= SignAs(cWindSpeed,cWindSpeed).QWordValue / SignAs(_1,_1).QWordValue;
         if cWindSpeed.isNegative then
             CWindSpeedf := -cWindSpeedf;
@@ -2239,9 +2394,9 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetGearRadius', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            lua_pushinteger(L, gear^.Radius)
+            lua_pushnumber(L, gear^.Radius)
         else
             lua_pushnil(L);
         end
@@ -2255,7 +2410,7 @@
 begin
     if CheckLuaParamCount(L, 1, 'GetHogHat', 'gearUid') then
         begin
-        gear := GearByUID(lua_tointeger(L, 1));
+        gear := GearByUID(Trunc(lua_tonumber(L, 1)));
         if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then
             lua_pushstring(L, str2pchar(gear^.Hedgehog^.Hat))
         else
@@ -2272,7 +2427,7 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetHogHat', 'gearUid, hat') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then
             begin
             hat:= lua_tostring(L, 2);
@@ -2301,7 +2456,7 @@
     if CheckAndFetchLuaParamMinCount(L, 4, call, params, n) then
         begin
         if not lua_isnoneornil(L, 5) then
-            tint := lua_tointeger(L, 5)
+            tint := Trunc(lua_tonumber(L, 5))
         else tint := $FFFFFFFF;
         if not lua_isnoneornil(L, 6) then
             behind := lua_toboolean(L, 6)
@@ -2316,7 +2471,7 @@
 
         // accept any amount of landflags, loop is never executed if n<9
         for i:= 9 to n do
-            lf:= lf or lua_tointeger(L, i);
+            lf:= lf or Trunc(lua_tonumber(L, i));
 
         n:= LuaToSpriteOrd(L, 3, call, params);
         if n >= 0 then
@@ -2326,9 +2481,9 @@
                 LuaError(call + ': ' + EnumToStr(spr) + ' cannot be placed! (required information not loaded)' )
             else
                 placed:= ForcePlaceOnLand(
-                    lua_tointeger(L, 1) - SpritesData[spr].Width div 2,
-                    lua_tointeger(L, 2) - SpritesData[spr].Height div 2,
-                    spr, lua_tointeger(L, 4), lf, tint, behind, flipHoriz, flipVert);
+                    Trunc(lua_tonumber(L, 1)) - SpritesData[spr].Width div 2,
+                    Trunc(lua_tonumber(L, 2)) - SpritesData[spr].Height div 2,
+                    spr, Trunc(lua_tonumber(L, 4)), lf, tint, behind, flipHoriz, flipVert);
             end;
         end;
 
@@ -2363,7 +2518,7 @@
 
         // accept any amount of landflags, loop is never executed if n<9
         for i:= 9 to n do
-            lf:= lf or lua_tointeger(L, i);
+            lf:= lf or Trunc(lua_tonumber(L, i));
 
         n:= LuaToSpriteOrd(L, 3, call, params);
         if n >= 0 then
@@ -2373,9 +2528,9 @@
                 LuaError(call + ': ' + EnumToStr(spr) + ' cannot be placed! (required information not loaded)' )
             else
                 EraseLand(
-                    lua_tointeger(L, 1) - SpritesData[spr].Width div 2,
-                    lua_tointeger(L, 2) - SpritesData[spr].Height div 2,
-                    spr, lua_tointeger(L, 4), lf, eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert);
+                    Trunc(lua_tonumber(L, 1)) - SpritesData[spr].Width div 2,
+                    Trunc(lua_tonumber(L, 2)) - SpritesData[spr].Height div 2,
+                    spr, Trunc(lua_tonumber(L, 4)), lf, eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert);
             end;
         end;
     lc_erasesprite:= 0
@@ -2387,20 +2542,34 @@
     placed:= false;
     if CheckLuaParamCount(L, 3, 'PlaceGirder', 'x, y, frameIdx') then
         placed:= TryPlaceOnLandSimple(
-            lua_tointeger(L, 1) - SpritesData[sprAmGirder].Width div 2,
-            lua_tointeger(L, 2) - SpritesData[sprAmGirder].Height div 2,
-            sprAmGirder, lua_tointeger(L, 3), true, false);
+            Trunc(lua_tonumber(L, 1)) - SpritesData[sprAmGirder].Width div 2,
+            Trunc(lua_tonumber(L, 2)) - SpritesData[sprAmGirder].Height div 2,
+            sprAmGirder, Trunc(lua_tonumber(L, 3)), true, false);
 
     lua_pushboolean(L, placed);
     lc_placegirder:= 1
 end;
 
+function lc_placerubber(L : Plua_State) : LongInt; Cdecl;
+var placed: boolean;
+begin
+    placed:= false;
+    if CheckLuaParamCount(L, 3, 'PlaceRubber', 'x, y, frameIdx') then
+        placed:= TryPlaceOnLand(
+            Trunc(lua_tonumber(L, 1)) - SpritesData[sprAmRubber].Width div 2,
+            Trunc(lua_tonumber(L, 2)) - SpritesData[sprAmRubber].Height div 2,
+            sprAmRubber, Trunc(lua_tonumber(L, 3)), true, lfBouncy);
+
+    lua_pushboolean(L, placed);
+    lc_placerubber:= 1
+end;
+
 function lc_getcurammotype(L : Plua_State): LongInt; Cdecl;
 begin
     if (CurrentHedgehog <> nil) and (CheckLuaParamCount(L, 0, 'GetCurAmmoType', '')) then
-        lua_pushinteger(L, ord(CurrentHedgehog^.CurAmmoType))
+        lua_pushnumber(L, ord(CurrentHedgehog^.CurAmmoType))
     else
-        lua_pushinteger(L, ord(amNothing));
+        lua_pushnumber(L, ord(amNothing));
     lc_getcurammotype := 1;
 end;
 
@@ -2424,10 +2593,16 @@
 begin
     if CheckLuaParamCount(L, 1, 'HideHog', 'gearUid') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
-        HideHog(gear^.hedgehog)
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
+        if (gear <> nil) and (gear^.hedgehog <> nil) then
+            begin
+            HideHog(gear^.hedgehog);
+            lua_pushboolean(L, true);
+            end
+        else
+            lua_pushboolean(L, false);
         end;
-    lc_hidehog := 0;
+    lc_hidehog := 1;
 end;
 
 function lc_restorehog(L: Plua_State): LongInt; Cdecl;
@@ -2436,7 +2611,7 @@
 begin
     if CheckLuaParamCount(L, 1, 'RestoreHog', 'gearUid') then
         begin
-        uid:= LongWord(lua_tointeger(L, 1));
+        uid:= LongWord(Trunc(lua_tonumber(L, 1)));
         if TeamsCount > 0 then
             for i:= 0 to Pred(TeamsCount) do
                 for h:= 0 to cMaxHHIndex do
@@ -2456,10 +2631,10 @@
     if CheckLuaParamCount(L, 5, 'TestRectForObstacle', 'x1, y1, x2, y2, landOnly') then
         begin
         rtn:= TestRectangleForObstacle(
-                    lua_tointeger(L, 1),
-                    lua_tointeger(L, 2),
-                    lua_tointeger(L, 3),
-                    lua_tointeger(L, 4),
+                    Trunc(lua_tonumber(L, 1)),
+                    Trunc(lua_tonumber(L, 2)),
+                    Trunc(lua_tonumber(L, 3)),
+                    Trunc(lua_tonumber(L, 4)),
                     lua_toboolean(L, 5)
                     );
         lua_pushboolean(L, rtn);
@@ -2473,7 +2648,7 @@
 function lc_getgravity(L : Plua_State) : LongInt; Cdecl;
 begin
     if CheckLuaParamCount(L, 0, 'GetGravity', '') then
-        lua_pushinteger(L, hwRound(SignAs(_0_5, cGravity) + (cGravity * 50 / cMaxWindSpeed)));
+        lua_pushnumber(L, hwRound(SignAs(_0_5, cGravity) + (cGravity * 50 / cMaxWindSpeed)));
     lc_getgravity:= 1
 end;
 
@@ -2481,8 +2656,8 @@
 begin
     if CheckLuaParamCount(L, 1, 'SetGravity', 'percent') then
         begin
-        cGravity:= _0_02 * lua_tointeger(L, 1) * cMaxWindSpeed;
-        cGravityf:= 0.00025 * lua_tointeger(L, 1) * 0.02
+        cGravity:= _0_02 * Trunc(lua_tonumber(L, 1)) * cMaxWindSpeed;
+        cGravityf:= 0.00025 * Trunc(lua_tonumber(L, 1)) * 0.02
         end;
     lc_setgravity:= 0
 end;
@@ -2492,7 +2667,7 @@
 begin
     if CheckLuaParamCount(L, 1, 'SetWaterLine', 'waterline') then
         begin
-        cWaterLine:= lua_tointeger(L,1);
+        cWaterLine:= Trunc(lua_tonumber(L,1));
         AllInactive:= false;
         iterator:= GearsList;
         while iterator <> nil do
@@ -2515,9 +2690,9 @@
 begin
     if CheckLuaParamCount(L, 2, 'SetAIHintOnGear', 'gearUid, aiHints') then
         begin
-        gear:= GearByUID(lua_tointeger(L, 1));
+        gear:= GearByUID(Trunc(lua_tonumber(L, 1)));
         if gear <> nil then
-            gear^.aihints:= lua_tointeger(L, 2);
+            gear^.aihints:= Trunc(lua_tonumber(L, 2));
         end;
     lc_setgearaihints:= 0
 end;
@@ -2536,21 +2711,44 @@
 function lc_declareachievement(L : Plua_State) : LongInt; Cdecl;
 begin
     if CheckLuaParamCount(L, 4, 'DeclareAchievement', 'achievementId, teamname, location, value') then
-        declareAchievement(lua_tostring(L, 1), lua_tostring(L, 2), lua_tostring(L, 3), lua_tointeger(L, 4));
+        declareAchievement(lua_tostring(L, 1), lua_tostring(L, 2), lua_tostring(L, 3), Trunc(lua_tonumber(L, 4)));
     lc_declareachievement:= 0
 end;
 
+function lc_getammoname(L : Plua_state) : LongInt; Cdecl;
+var np, at: LongInt;
+    ignoreOverwrite: Boolean;
+const call = 'GetAmmoName';
+      params = 'ammoType [, ignoreOverwrite ]';
+begin
+    if CheckAndFetchParamCountRange(L, 1, 2, call, params, np) then
+        begin
+        at:= LuaToAmmoTypeOrd(L, 1, call, params);
+        ignoreOverwrite := false;
+        if np > 1 then
+            ignoreOverwrite := lua_toboolean(L, 2);
+        if at >= 0 then
+            if (not ignoreOverwrite) and (length(trluaammo[Ammoz[TAmmoType(at)].NameId]) > 0) then
+                lua_pushstring(L, PChar(trluaammo[Ammoz[TAmmoType(at)].NameId]))
+            else
+                lua_pushstring(L, PChar(trammo[Ammoz[TAmmoType(at)].NameId]));
+        end
+    else
+        lua_pushnil(L);
+    lc_getammoname:= 1;
+end;
+
 function lc_startghostpoints(L : Plua_State) : LongInt; Cdecl;
 begin
     if CheckLuaParamCount(L, 1, 'StartGhostPoints', 'count') then
-        startGhostPoints(lua_tointeger(L, 1));
+        startGhostPoints(Trunc(lua_tonumber(L, 1)));
     lc_startghostpoints:= 0
 end;
 
 function lc_dumppoint(L : Plua_State) : LongInt; Cdecl;
 begin
     if CheckLuaParamCount(L, 2, 'DumpPoint', 'x, y') then
-        dumpPoint(lua_tointeger(L, 1), lua_tointeger(L, 2));
+        dumpPoint(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)));
     lc_dumppoint:= 0
 end;
 
@@ -2568,17 +2766,17 @@
     if CheckAndFetchParamCountRange(L, 2, 4, 'AddPoint', 'x, y [, width [, erase] ]', np) then
         begin
         // x
-        param:= LongInt(lua_tointeger(L,1));
+        param:= LongInt(Trunc(lua_tonumber(L,1)));
         PointsBuffer:= PointsBuffer + char((param shr 8) and $FF);
         PointsBuffer:= PointsBuffer + char((param and $FF));
         // y
-        param:= LongInt(lua_tointeger(L,2));
+        param:= LongInt(Trunc(lua_tonumber(L,2)));
         PointsBuffer:= PointsBuffer + char((param shr 8) and $FF);
         PointsBuffer:= PointsBuffer + char((param and $FF));
         // width
         if np > 2 then
             begin
-            param:= lua_tointeger(L,3);
+            param:= Trunc(lua_tonumber(L,3));
             param:= (param or $80);
             // erase
             if (np > 3) and lua_toboolean(L, 4) then
@@ -2615,7 +2813,7 @@
     if CheckLuaParamCount(L, 1, call, params) then
         begin
 
-        case lua_tointeger(L, 1) of
+        case Trunc(lua_tonumber(L, 1)) of
             HaltTestSuccess : rstring:= 'Success';
             HaltTestFailed: rstring:= 'FAILED';
         else
@@ -2628,7 +2826,7 @@
         if cTestLua then
             begin
             WriteLnToConsole('Lua test finished, result: ' + rstring);
-            halt(lua_tointeger(L, 1));
+            halt(Trunc(lua_tonumber(L, 1)));
             end
         else LuaError('Not in lua test mode, engine will keep running. Reported test result: ' + rstring);
 
@@ -2665,7 +2863,7 @@
 
 procedure ScriptSetInteger(name : shortstring; value : LongInt);
 begin
-    lua_pushinteger(luaState, value);
+    lua_pushnumber(luaState, value);
     lua_setglobal(luaState, Str2PChar(name));
 end;
 
@@ -2678,7 +2876,7 @@
 function ScriptGetInteger(name : shortstring) : LongInt;
 begin
     lua_getglobal(luaState, Str2PChar(name));
-    ScriptGetInteger:= lua_tointeger(luaState, -1);
+    ScriptGetInteger:= Trunc(lua_tonumber(luaState, -1));
     lua_pop(luaState, 1);
 end;
 
@@ -2689,6 +2887,13 @@
     lua_pop(luaState, 1);
 end;
 
+function ScriptGetAnsiString(name : shortstring) : ansistring;
+begin
+    lua_getglobal(luaState, Str2PChar(name));
+    ScriptGetAnsiString:= lua_tostringa(luaState, -1);
+    lua_pop(luaState, 1);
+end;
+
 procedure ScriptOnPreviewInit;
 begin
 // not required if there is no script to run
@@ -2721,8 +2926,8 @@
 // push game variables so they may be modified by the script
 ScriptSetInteger('CursorX', CursorPoint.X);
 ScriptSetInteger('CursorY', CursorPoint.Y);
-ScriptSetInteger('BorderColor', ExplosionBorderColor);
 ScriptSetInteger('GameFlags', GameFlags);
+ScriptSetInteger('WorldEdge', ord(WorldEdge));
 ScriptSetString('Seed', cSeed);
 ScriptSetInteger('TemplateFilter', cTemplateFilter);
 ScriptSetInteger('TemplateNumber', LuaTemplateNumber);
@@ -2739,6 +2944,7 @@
 ScriptSetInteger('MinesNum', cLandMines);
 ScriptSetInteger('MinesTime', cMinesTime);
 ScriptSetInteger('MineDudPercent', cMineDudPercent);
+ScriptSetInteger('AirMinesNum', cAirMines);
 ScriptSetInteger('Explosives', cExplosives);
 ScriptSetInteger('Delay', cInactDelay);
 ScriptSetInteger('Ready', cReadyDelay);
@@ -2746,6 +2952,7 @@
 ScriptSetInteger('WaterRise', cWaterRise);
 ScriptSetInteger('HealthDecrease', cHealthDecrease);
 ScriptSetInteger('GetAwayTime', cGetAwayTime);
+ScriptSetInteger('AmmoTypeMax', Ord(High(TAmmoType)));
 ScriptSetString('Map', cMapName);
 ScriptSetString('Theme', Theme);
 ScriptSetString('Goals', '');
@@ -2759,6 +2966,7 @@
 cMapGen          := TMapGen(ScriptGetInteger('MapGen'));
 cFeatureSize     := ScriptGetInteger('MapFeatureSize');
 GameFlags        := ScriptGetInteger('GameFlags');
+WorldEdge        := TWorldEdge(ScriptGetInteger('WorldEdge'));
 cHedgehogTurnTime:= ScriptGetInteger('TurnTime');
 cCaseFactor      := ScriptGetInteger('CaseFreq');
 cHealthCaseProb  := ScriptGetInteger('HealthCaseProb');
@@ -2768,6 +2976,7 @@
 cLandMines       := ScriptGetInteger('MinesNum');
 cMinesTime       := ScriptGetInteger('MinesTime');
 cMineDudPercent  := ScriptGetInteger('MineDudPercent');
+cAirMines        := ScriptGetInteger('AirMinesNum');
 cExplosives      := ScriptGetInteger('Explosives');
 cInactDelay      := ScriptGetInteger('Delay');
 cReadyDelay      := ScriptGetInteger('Ready');
@@ -2780,7 +2989,7 @@
     ParseCommand('map ' + ScriptGetString('Map'), true, true);
 if ScriptGetString('Theme') <> '' then
     ParseCommand('theme ' + ScriptGetString('Theme'), true, true);
-LuaGoals:= ScriptGetString('Goals');
+LuaGoals:= ScriptGetAnsiString('Goals');
 
 // Support lua changing the ammo layout - assume all hogs have same ammo, note this might leave a few ammo stores lying around.
 k:= 0;
@@ -2839,12 +3048,89 @@
 // custom script loader via physfs, passed to lua_load
 const BUFSIZE = 1024;
 
+var inComment: boolean;
+var inQuote: boolean;
+var locSum: LongWord;
+var braceCount: LongWord;
+var wordCount: LongWord;
+var lastChar: char;
+// ⭒⭐⭒✨⭐⭒✨⭐☆✨⭐✨✧✨☆✨✧✨☆⭒✨☆⭐⭒☆✧✨⭒✨⭐✧⭒☆⭒✧☆✨✧⭐☆✨☆✧⭒✨✧⭒☆⭐☆✧
+function  ScriptReader(L: Plua_State; f: PFSFile; sz: Psize_t) : PChar; Cdecl;
+var mybuf: PChar;
+    i: LongInt;
+begin
+    SetRandomSeed(cSeed,true);
+    mybuf := physfsReader(L, f, sz);
+    if (mybuf <> nil) and ((sz^) > 0) then
+        begin
+            for i:= 0 to sz^-1 do
+                begin
+                    if (lastChar = '-') and (mybuf[i] = '-') then
+                        inComment := true
+                    // gonna add any non-magic whitespace and skip - just to make comment avoidance easier
+                    else if not inComment and (byte(mybuf[i]) > $20) and (byte(mybuf[i]) < $7F) and (mybuf[i]<>'-') then
+                        begin
+                        AddRandomness(byte(mybuf[i]));  // wish I had the seed...
+                        CheckSum := CheckSum xor GetRandom($FFFFFFFF);
+                        end;
+                    lastChar := mybuf[i];
+                    if (byte(mybuf[i]) = $0D) or (byte(mybuf[i]) = $0A) then
+                        inComment := false
+                end;
+        end;
+    ScriptReader:= mybuf
+end;
+function  ScriptLocaleReader(L: Plua_State; f: PFSFile; sz: Psize_t) : PChar; Cdecl;
+var mybuf: PChar;
+    i: LongInt;
+begin
+    mybuf := physfsReader(L, f, sz);
+    if (mybuf <> nil) and ((sz^) > 0) then
+        begin
+            for i:= 0 to sz^-1 do
+                begin
+                    if not inComment and (mybuf[i] = '"') and (lastChar <> '\') then
+                        inQuote := not inQuote;
+                    if not inQuote and (lastChar = '-') and (mybuf[i] = '-') then
+                        inComment := true;
+                    if not inComment and (not inQuote) then
+                       locSum := locSum xor (byte(mybuf[i]) shl (i mod 4));
+                    if not inComment and (not inQuote) and
+                        ((mybuf[i] = '(') or
+                        (mybuf[i] = ')') or
+                        (mybuf[i] = '+') or
+                        (mybuf[i] = '#') or
+                        (braceCount > 2) or
+                        (wordCount > 6)) then
+                       CheckSum := locSum;
+                    if not inComment and (not inQuote) and ((mybuf[i] = '{') or (mybuf[i] = '}')) then
+                        inc(braceCount);
+                    if not inComment and (not inQuote) and
+                        (((byte(mybuf[i]) > $40) and (byte(mybuf[i]) < $5B)) or
+                        ((byte(mybuf[i]) > $60) and (byte(mybuf[i]) < $7B)) or
+                        ((byte(mybuf[i]) >= $30) and (byte(mybuf[i]) < $3A))) then
+                        inc(wordCount);
+                    lastChar := mybuf[i];
+                    if (byte(mybuf[i]) = $0D) or (byte(mybuf[i]) = $0A) then
+                        inComment := false
+                end;
+        end;
+    ScriptLocaleReader:= mybuf
+end;
+// ⭒⭐⭒✨⭐⭒✨⭐☆✨⭐✨✧✨☆✨✧✨☆⭒✨☆⭐⭒☆✧✨⭒✨⭐✧⭒☆⭒✧☆✨✧⭐☆✨☆✧⭒✨✧⭒☆⭐☆✧
+
 procedure ScriptLoad(name : shortstring);
 var ret : LongInt;
       s : shortstring;
       f : PFSFile;
     buf : array[0..Pred(BUFSIZE)] of byte;
 begin
+inComment:= false;
+inQuote:= false;
+lastChar:= 'X';
+braceCount:= 0;
+wordCount:= 0;
+locSum:= 0;
 s:= cPathz[ptData] + name;
 if not pfsExists(s) then
     begin
@@ -2856,8 +3142,12 @@
 if f = nil then
     exit;
 
+hedgewarsMountPackage(Str2PChar(copy(s, 1, length(s)-4)+'.hwp'));
+
 physfsReaderSetBuffer(@buf);
-ret:= lua_load(luaState, @physfsReader, f, Str2PChar(s));
+if Pos('Locale/',s) <> 0 then
+     ret:= lua_load(luaState, @ScriptLocaleReader, f, Str2PChar(s))
+else ret:= lua_load(luaState, @ScriptReader, f, Str2PChar(s));
 pfsClose(f);
 
 if ret <> 0 then
@@ -2872,12 +3162,12 @@
     lua_pcall(luaState, 0, 0, 0);
     ScriptLoaded:= true
     end;
-hedgewarsMountPackage(Str2PChar(copy(s, 1, length(s)-4)+'.hwp'));
 end;
 
 procedure SetGlobals;
 begin
 ScriptSetInteger('TurnTimeLeft', TurnTimeLeft);
+ScriptSetInteger('ReadyTimeLeft', ReadyTimeLeft);
 ScriptSetInteger('GameTime', GameTicks);
 ScriptSetInteger('TotalRounds', TotalRounds);
 ScriptSetInteger('WaterLine', cWaterLine);
@@ -2924,6 +3214,7 @@
 // It is inconsistent anyway to have some globals be read-only and others not with no indication whatsoever.
 // -- sheepluva
 TurnTimeLeft:= ScriptGetInteger('TurnTimeLeft');
+ReadyTimeLeft:= ScriptGetInteger('ReadyTimeLeft');
 end;
 
 procedure ScriptCall(fname : shortstring);
@@ -2983,10 +3274,10 @@
     exit(0);
 SetGlobals;
 lua_getglobal(luaState, Str2PChar(fname));
-lua_pushinteger(luaState, par1);
-lua_pushinteger(luaState, par2);
-lua_pushinteger(luaState, par3);
-lua_pushinteger(luaState, par4);
+lua_pushnumber(luaState, par1);
+lua_pushnumber(luaState, par2);
+lua_pushnumber(luaState, par3);
+lua_pushnumber(luaState, par4);
 ScriptCall:= 0;
 if lua_pcall(luaState, 4, 1, 0) <> 0 then
     begin
@@ -2995,7 +3286,7 @@
     end
 else
     begin
-    ScriptCall:= lua_tointeger(luaState, -1);
+    ScriptCall:= Trunc(lua_tonumber(luaState, -1));
     lua_pop(luaState, 1)
     end;
 GetGlobals;
@@ -3010,7 +3301,7 @@
     end;
 lua_getglobal(luaState, Str2PChar(fname));
 ScriptExists:= not lua_isnoneornil(luaState, -1);
-lua_pop(luaState, -1)
+lua_pop(luaState, 1)
 end;
 
 procedure ScriptPrepareAmmoStore;
@@ -3117,6 +3408,7 @@
     cg : TCapGroup;
     spr: TSprite;
     mg : TMapGen;
+    we : TWorldEdge;
 begin
 // initialize lua
 luaState:= lua_open;
@@ -3212,6 +3504,9 @@
 for mg:= Low(TMapGen) to High(TMapGen) do
     ScriptSetInteger(EnumToStr(mg), ord(mg));
 
+for we:= Low(TWorldEdge) to High(TWorldEdge) do
+    ScriptSetInteger(EnumToStr(we), ord(we));
+
 ScriptSetInteger('gstDrowning'      , gstDrowning);
 ScriptSetInteger('gstHHDriven'      , gstHHDriven);
 ScriptSetInteger('gstMoving'        , gstMoving);
@@ -3265,6 +3560,7 @@
 lua_register(luaState, _P'DeleteGear', @lc_deletegear);
 lua_register(luaState, _P'AddVisualGear', @lc_addvisualgear);
 lua_register(luaState, _P'DeleteVisualGear', @lc_deletevisualgear);
+lua_register(luaState, _P'GetVisualGearType', @lc_getvisualgeartype);
 lua_register(luaState, _P'GetVisualGearValues', @lc_getvisualgearvalues);
 lua_register(luaState, _P'SetVisualGearValues', @lc_setvisualgearvalues);
 lua_register(luaState, _P'GetGearValues', @lc_getgearvalues);
@@ -3278,7 +3574,12 @@
 lua_register(luaState, _P'WriteLnToConsole', @lc_writelntoconsole);
 lua_register(luaState, _P'GetGearType', @lc_getgeartype);
 lua_register(luaState, _P'EndGame', @lc_endgame);
+lua_register(luaState, _P'EndTurn', @lc_endturn);
+lua_register(luaState, _P'GetTeamStats', @lc_getteamstats);
 lua_register(luaState, _P'SendStat', @lc_sendstat);
+lua_register(luaState, _P'SendGameResultOff', @lc_sendgameresultoff);
+lua_register(luaState, _P'SendRankingStatsOff', @lc_sendrankingstatsoff);
+lua_register(luaState, _P'SendAchievementsStatsOff', @lc_sendachievementsstatsoff);
 lua_register(luaState, _P'SendHealthStatsOff', @lc_sendhealthstatsoff);
 lua_register(luaState, _P'FindPlace', @lc_findplace);
 lua_register(luaState, _P'SetGearPosition', @lc_setgearposition);
@@ -3290,10 +3591,11 @@
 lua_register(luaState, _P'ParseCommand', @lc_parsecommand);
 lua_register(luaState, _P'ShowMission', @lc_showmission);
 lua_register(luaState, _P'HideMission', @lc_hidemission);
+lua_register(luaState, _P'SetAmmoTexts', @lc_setammotexts);
+lua_register(luaState, _P'SetAmmoDescriptionAppendix', @lc_setammodescriptionappendix);
 lua_register(luaState, _P'AddCaption', @lc_addcaption);
 lua_register(luaState, _P'SetAmmo', @lc_setammo);
 lua_register(luaState, _P'SetAmmoDelay', @lc_setammodelay);
-lua_register(luaState, _P'SetAmmoStore', @lc_setammostore);
 lua_register(luaState, _P'PlaySound', @lc_playsound);
 lua_register(luaState, _P'AddTeam', @lc_addteam);
 lua_register(luaState, _P'AddHog', @lc_addhog);
@@ -3308,7 +3610,9 @@
 lua_register(luaState, _P'SetClanColor', @lc_setclancolor);
 lua_register(luaState, _P'GetHogVoicepack', @lc_gethogvoicepack);
 lua_register(luaState, _P'GetHogFlag', @lc_gethogflag);
+lua_register(luaState, _P'GetHogFort', @lc_gethogfort);
 lua_register(luaState, _P'GetHogGrave', @lc_gethoggrave);
+lua_register(luaState, _P'IsHogLocal', @lc_ishoglocal);
 lua_register(luaState, _P'GetHogTeamName', @lc_gethogteamname);
 lua_register(luaState, _P'SetHogTeamName', @lc_sethogteamname);
 lua_register(luaState, _P'GetHogName', @lc_gethogname);
@@ -3354,6 +3658,7 @@
 lua_register(luaState, _P'EraseSprite', @lc_erasesprite);
 lua_register(luaState, _P'PlaceSprite', @lc_placesprite);
 lua_register(luaState, _P'PlaceGirder', @lc_placegirder);
+lua_register(luaState, _P'PlaceRubber', @lc_placerubber);
 lua_register(luaState, _P'GetCurAmmoType', @lc_getcurammotype);
 lua_register(luaState, _P'TestRectForObstacle', @lc_testrectforobstacle);
 lua_register(luaState, _P'GetGravity', @lc_getgravity);
@@ -3363,6 +3668,7 @@
 lua_register(luaState, _P'SetWeapon', @lc_setweapon);
 lua_register(luaState, _P'SetCinematicMode', @lc_setcinematicmode);
 lua_register(luaState, _P'SetMaxBuildDistance', @lc_setmaxbuilddistance);
+lua_register(luaState, _P'GetAmmoName', @lc_getammoname);
 // drawn map functions
 lua_register(luaState, _P'AddPoint', @lc_addPoint);
 lua_register(luaState, _P'FlushPoints', @lc_flushPoints);