diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uScript.pas --- 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);