diff -r 42efccba0711 -r d9893b1b76a0 hedgewars/uScript.pas --- a/hedgewars/uScript.pas Thu Jun 12 21:25:39 2014 +0200 +++ b/hedgewars/uScript.pas Fri Jun 13 02:31:05 2014 +0200 @@ -354,13 +354,15 @@ lc_parsecommand:= 0; end; +// sets weapon to the desired ammo type function lc_setweapon(L : Plua_State) : LongInt; Cdecl; var at: LongInt; const call = 'SetWeapon'; params = 'ammoType'; begin - if CheckLuaParameterCount(L, 1, call, params) then + // no point to run this without any CurrentHedgehog + if (CurrentHedgehog <> nil) and (CheckLuaParameterCount(L, 1, call, params)) then begin at:= LuaToAmmoTypeOrd(L, 1, call, params); if at >= 0 then @@ -369,6 +371,70 @@ lc_setweapon:= 0; end; +// sets weapon to whatever weapons is next (wraps around, amSkip is skipped) +function lc_setnextweapon(L : Plua_State) : LongInt; Cdecl; +var at : LongInt; + nextAmmo : TAmmo; + s, a, cs, fa: LongInt; +const + call = 'SetNextWeapon'; + params = ''; +begin + if (CurrentHedgehog <> nil) and (CheckLuaParameterCount(L, 0, call, params)) then + begin + at:= -1; + with CurrentHedgehog^ do + begin + cs:= 0; // current slot + fa:= 0; // first ammo item to check + + // if something is selected, find it's successor + if curAmmoType <> amNothing then + begin + // get current slot index + cs:= Ammoz[CurAmmoType].Slot; + // find current ammo index + while (fa < cMaxSlotAmmoIndex) + and (Ammo^[cs, fa].AmmoType <> CurAmmoType) do + inc(fa); + // increase once more because we won't successor + inc(fa); + end; + + // find first available ammo + // revisit current slot too (current item might not be first) + for s:= cs to cs + cMaxSlotIndex + 1 do + begin + for a:= fa to cMaxSlotAmmoIndex do + begin + // check if we went full circle + if (a = fa) and (s = cs + cMaxSlotIndex + 1) then + exit(0); + + // get ammo + nextAmmo:= Ammo^[s mod (cMaxSlotIndex + 1), a]; + // only switch to ammos the hog actually has + if (nextAmmo.AmmoType <> amNothing) + and (nextAmmo.AmmoType <> amSkip) and (nextAmmo.Count > 0) then + begin + at:= ord(nextAmmo.AmmoType); + break; + end; + end; + // stop slot loop if something was found + if at >= 0 then + break; + // check following slots starting with first item + fa:= 0; + end; + end; + + if at >= 0 then + ParseCommand('setweap ' + char(at), true, true); + end; + lc_setnextweapon:= 0; +end; + function lc_showmission(L : Plua_State) : LongInt; Cdecl; begin if CheckLuaParameterCount(L, 5, 'ShowMission', 'caption, subcaption, text, icon, time') then @@ -1522,7 +1588,6 @@ end; function lc_dismissteam(L : Plua_State) : LongInt; Cdecl; -var np: LongInt; begin if CheckLuaParameterCount(L, 1, 'DismissTeam', 'teamname') then ParseCommand('teamgone ' + lua_tostring(L, 1), true, true); @@ -1919,8 +1984,10 @@ function lc_getcurammotype(L : Plua_State): LongInt; Cdecl; begin - if CheckLuaParameterCount(L, 0, 'GetCurAmmoType', '') then - lua_pushinteger(L, ord(CurrentHedgehog^.CurAmmoType)); + if (CurrentHedgehog <> nil) and (CheckLuaParameterCount(L, 0, 'GetCurAmmoType', '')) then + lua_pushinteger(L, ord(CurrentHedgehog^.CurAmmoType)) + else + lua_pushinteger(L, ord(amNothing)); lc_getcurammotype := 1; end; @@ -2748,6 +2815,7 @@ lua_register(luaState, _P'GetGravity', @lc_getgravity); lua_register(luaState, _P'SetGravity', @lc_setgravity); lua_register(luaState, _P'SetWaterLine', @lc_setwaterline); +lua_register(luaState, _P'SetNextWeapon', @lc_setnextweapon); lua_register(luaState, _P'SetWeapon', @lc_setweapon); lua_register(luaState, _P'SetGearAIHints', @lc_setaihintsongear);