diff -r f71275973737 -r 48a53259fad8 hedgewars/uScript.pas --- a/hedgewars/uScript.pas Mon Feb 02 23:12:56 2015 +0300 +++ b/hedgewars/uScript.pas Sat Feb 07 23:26:14 2015 +0300 @@ -836,33 +836,119 @@ lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); end; - lc_getvisualgearvalues:= 10; + lc_getvisualgearvalues:= 10 end; function lc_setvisualgearvalues(L : Plua_State) : LongInt; Cdecl; var vg : PVisualGear; begin - if CheckLuaParamCount(L, 11, 'SetVisualGearValues', 'vgUid, X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint') then - begin +// 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)); if vg <> nil then begin - vg^.X:= lua_tointeger(L, 2); - vg^.Y:= lua_tointeger(L, 3); - vg^.dX:= lua_tonumber(L, 4); - vg^.dY:= lua_tonumber(L, 5); - vg^.Angle:= lua_tonumber(L, 6); - vg^.Frame:= lua_tointeger(L, 7); - if lua_tointeger(L, 8) <> 0 then - vg^.FrameTicks:= lua_tointeger(L, 8); // find a better way to do this. maybe need to break all these up. - vg^.State:= lua_tointeger(L, 9); - vg^.Timer:= lua_tointeger(L, 10); - vg^.Tint:= lua_tointeger(L, 11); + if not lua_isnoneornil(L, 2) then + vg^.X:= lua_tointeger(L, 2); + if not lua_isnoneornil(L, 3) then + vg^.Y:= lua_tointeger(L, 3); + if not lua_isnoneornil(L, 4) then + vg^.dX:= lua_tonumber(L, 4); + if not lua_isnoneornil(L, 5) then + vg^.dY:= lua_tonumber(L, 5); + 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); + if not lua_isnoneornil(L, 8) then + vg^.FrameTicks:= lua_tointeger(L, 8); + if not lua_isnoneornil(L, 9) then + vg^.State:= lua_tointeger(L, 9); + if not lua_isnoneornil(L, 10) then + vg^.Timer:= lua_tointeger(L, 10); + if not lua_isnoneornil(L, 11) then + vg^.Tint:= lua_tointeger(L, 11) + end; +// end +// else +// lua_pushnil(L); // return value on stack (nil) + lc_setvisualgearvalues:= 0 +end; + +// so. going to use this to get/set some of the more obscure gear values which weren't already exposed elsewhere +// can keep adding things in the future. isnoneornil makes it safe +function lc_getgearvalues(L : Plua_State) : LongInt; Cdecl; +var gear: PGear; +begin + if CheckLuaParamCount(L, 1, 'GetGearValues', 'gearUid') then + begin + gear:= GearByUID(lua_tointeger(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^.DirAngle); + lua_pushinteger(L, gear^.AdvBounce); + lua_pushinteger(L, Integer(gear^.ImpactSound)); + lua_pushinteger(L, gear^.nImpactSounds); + lua_pushinteger(L, gear^.Tint) + end + else + begin + lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); + lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); + lua_pushnil(L) end end else - lua_pushnil(L); // return value on stack (nil) - lc_setvisualgearvalues:= 0; + begin + lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); + lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); + lua_pushnil(L) + end; + lc_getgearvalues:= 11 +end; + +function lc_setgearvalues(L : Plua_State) : LongInt; Cdecl; +var gear : PGear; +begin +// Currently allows 1-12 params +// if CheckLuaParamCount(L, 12, 'SetGearValues', 'gearUid, Angle, Power, WDTimer, Radius, Density, Karma, DirAngle, AdvBounce, ImpactSound, # ImpactSounds, Tint') then +// begin + gear:= GearByUID(lua_tointeger(L, 1)); + if gear <> nil then + begin + if not lua_isnoneornil(L, 2) then + gear^.Angle := lua_tointeger(L, 2); + if not lua_isnoneornil(L, 3) then + gear^.Power := lua_tointeger(L, 3); + if not lua_isnoneornil(L, 4) then + gear^.WDTimer := lua_tointeger(L, 4); + if not lua_isnoneornil(L, 5) then + gear^.Radius := lua_tointeger(L, 5); + if not lua_isnoneornil(L, 6) then + gear^.Density:= int2hwFloat(lua_tointeger(L, 6)) / 10000; + if not lua_isnoneornil(L, 7) then + gear^.Karma := lua_tointeger(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); + if not lua_isnoneornil(L, 10) then + gear^.ImpactSound := TSound(lua_tointeger(L, 10)); + if not lua_isnoneornil(L, 11) then + gear^.nImpactSounds := lua_tointeger(L, 11); + if not lua_isnoneornil(L, 12) then + gear^.Tint := lua_tointeger(L, 12) + end; +// end +// else +// lua_pushnil(L); // return value on stack (nil) + lc_setgearvalues:= 0 end; function lc_getfollowgear(L : Plua_State) : LongInt; Cdecl; @@ -927,6 +1013,46 @@ lc_getgearelasticity:= 1 end; +function lc_setgearelasticity(L : Plua_State) : LongInt; Cdecl; +var gear: PGear; +begin + if CheckLuaParamCount(L, 2, 'SetGearElasticity', 'gearUid, Elasticity') then + begin + gear:= GearByUID(lua_tointeger(L, 1)); + if gear <> nil then + gear^.Elasticity:= int2hwFloat(lua_tointeger(L, 2)) / 10000 + end; + lc_setgearelasticity:= 0 +end; + +function lc_getgearfriction(L : Plua_State) : LongInt; Cdecl; +var gear : PGear; +begin + if CheckLuaParamCount(L, 1, 'GetGearFriction', 'gearUid') then + begin + gear:= GearByUID(lua_tointeger(L, 1)); + if gear <> nil then + lua_pushinteger(L, hwRound(gear^.friction * _10000)) + else + lua_pushnil(L); + end + else + lua_pushnil(L); // return value on stack (nil) + lc_getgearfriction:= 1 +end; + +function lc_setgearfriction(L : Plua_State) : LongInt; Cdecl; +var gear: PGear; +begin + if CheckLuaParamCount(L, 2, 'SetGearFriction', 'gearUid, Friction') then + begin + gear:= GearByUID(lua_tointeger(L, 1)); + if gear <> nil then + gear^.Friction:= int2hwFloat(lua_tointeger(L, 2)) / 10000 + end; + lc_setgearfriction:= 0 +end; + function lc_setgearmessage(L : Plua_State) : LongInt; Cdecl; var gear : PGear; begin @@ -2947,6 +3073,8 @@ lua_register(luaState, _P'DeleteVisualGear', @lc_deletevisualgear); lua_register(luaState, _P'GetVisualGearValues', @lc_getvisualgearvalues); lua_register(luaState, _P'SetVisualGearValues', @lc_setvisualgearvalues); +lua_register(luaState, _P'GetGearValues', @lc_getgearvalues); +lua_register(luaState, _P'SetGearValues', @lc_setgearvalues); lua_register(luaState, _P'SpawnHealthCrate', @lc_spawnhealthcrate); lua_register(luaState, _P'SpawnAmmoCrate', @lc_spawnammocrate); lua_register(luaState, _P'SpawnUtilityCrate', @lc_spawnutilitycrate); @@ -3011,6 +3139,9 @@ lua_register(luaState, _P'CampaignLock', @lc_campaignlock); lua_register(luaState, _P'CampaignUnlock', @lc_campaignunlock); lua_register(luaState, _P'GetGearElasticity', @lc_getgearelasticity); +lua_register(luaState, _P'SetGearElasticity', @lc_setgearelasticity); +lua_register(luaState, _P'GetGearFriction', @lc_getgearfriction); +lua_register(luaState, _P'SetGearFriction', @lc_setgearfriction); lua_register(luaState, _P'GetGearRadius', @lc_getgearradius); lua_register(luaState, _P'GetGearMessage', @lc_getgearmessage); lua_register(luaState, _P'SetGearMessage', @lc_setgearmessage);