# HG changeset patch # User sheepluva # Date 1493503910 -7200 # Node ID 24f8d3ec88a192f63fb19f2a7088e3cd4ee16e12 # Parent 1adc078355d1f890dbe6f52bfe485f2e9fbfc992 whoops, temp file was committed... diff -r 1adc078355d1 -r 24f8d3ec88a1 hedgewars/uScript.pas.temp --- a/hedgewars/uScript.pas.temp Sat Apr 29 23:49:39 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3640 +0,0 @@ -(* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2004-2015 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - *) - -{$INCLUDE "options.inc"} - -unit uScript; -(* - * This unit defines, implements and registers functions and - * variables/constants bindings for usage in Lua scripts. - * - * 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 - * unnoticed and render the parameter useless!) - *) -interface - -procedure ScriptPrintStack; -procedure ScriptClearStack; - -procedure ScriptLoad(name : shortstring); -procedure ScriptOnPreviewInit; -procedure ScriptOnGameInit; -procedure ScriptOnScreenResize; -procedure ScriptSetInteger(name : shortstring; value : LongInt); -procedure ScriptSetString(name : shortstring; value : shortstring); - -procedure ScriptCall(fname : shortstring); -function ScriptCall(fname : shortstring; par1: LongInt) : LongInt; -function ScriptCall(fname : shortstring; par1, par2: LongInt) : LongInt; -function ScriptCall(fname : shortstring; par1, par2, par3: LongInt) : LongInt; -function ScriptCall(fname : shortstring; par1, par2, par3, par4 : LongInt) : LongInt; -function ScriptExists(fname : shortstring) : boolean; - -procedure LuaParseString(s: shortString); - -//function ParseCommandOverride(key, value : shortstring) : shortstring; This did not work out well - -procedure initModule; -procedure freeModule; - -implementation - -uses LuaPas, - uConsole, - uConsts, - uGears, - uGearsList, - uGearsUtils, - uFloat, - uWorld, - uAmmos, - uTeams, - uSound, - uChat, - uStats, - uStore, - uRandom, - uTypes, - uVariables, - uCommands, - uCaptions, - uDebug, - uCollisions, - uRenderUtils, - uTextures, - uLandGraphics, - uUtils, - uIO, - uVisualGearsList, - uGearsHandlersMess, - uPhysFSLayer, - SDLh -{$IFNDEF PAS2C} - , typinfo -{$ENDIF} - ; - -var luaState : Plua_State; - ScriptAmmoLoadout : shortstring; - ScriptAmmoProbability : shortstring; - ScriptAmmoDelay : shortstring; - ScriptAmmoReinforcement : shortstring; - ScriptLoaded : boolean; - mapDims : boolean; - PointsBuffer: shortstring; - prevCursorPoint: TPoint; // why is tpoint still in sdlh... - -{$IFDEF USE_LUA_SCRIPT} -procedure ScriptPrepareAmmoStore; forward; -procedure ScriptApplyAmmoStore; forward; -procedure ScriptSetAmmo(ammo : TAmmoType; count, probability, delay, reinforcement: Byte); forward; -procedure ScriptSetAmmoDelay(ammo : TAmmoType; delay: Byte); forward; - -var LuaDebugInfo: lua_Debug; - -procedure SetGlobals; forward; -procedure LuaParseString(s: shortString); -begin - SetGlobals; - AddFileLog('[Lua] input string: ' + s); - AddChatString(#3 + '[Lua] > ' + s); - if luaL_dostring(luaState, Str2PChar(s)) <> 0 then - begin - AddFileLog('[Lua] input string parsing error!'); - AddChatString(#5 + '[Lua] Error while parsing!'); - end; -end; - -function LuaUpdateDebugInfo(): Boolean; -begin - FillChar(LuaDebugInfo, sizeof(LuaDebugInfo), 0); - - if lua_getstack(luaState, 1, @LuaDebugInfo) = 0 then - exit(false); // stack not deep enough - - // get source name and line count - lua_getinfo(luaState, PChar('Sl'), @LuaDebugInfo); - exit(true); -end; - -procedure LuaError(s: shortstring); -var src: shortstring; -const - maxsrclen = 20; -begin - if LuaUpdateDebugInfo() then - begin - src:= StrPas(LuaDebugInfo.source); - s:= 'LUA ERROR [ ... ' - + copy(src, Length(src) - maxsrclen, maxsrclen - 3) + ':' - + inttostr(LuaDebugInfo.currentLine) + ']: ' + s; - end - else - s:= 'LUA ERROR: ' + s; - WriteLnToConsole(s); - AddChatString(#5 + s); - if cTestLua then - halt(HaltTestLuaError); -end; - -procedure LuaCallError(error, call, paramsyntax: shortstring); -begin - LuaError(call + ': ' + error); - LuaError('-- SYNTAX: ' + call + ' ( ' + paramsyntax + ' )'); -end; - -procedure LuaParameterCountError(expected, call, paramsyntax: shortstring; wrongcount: LongInt); inline; -begin - // TODO: i18n? - LuaCallError('Wrong number of parameters! (is: ' + inttostr(wrongcount) + ', should be: '+ expected + ')', call, paramsyntax); -end; - -// compare with allowed count -function CheckLuaParamCount(L : Plua_State; count: LongInt; call, paramsyntax: shortstring): boolean; inline; -var c: LongInt; -begin - c:= lua_gettop(L); - if c <> count then - begin - LuaParameterCountError('exactly ' + inttostr(count), call, paramsyntax, c); - exit(false); - end; - - CheckLuaParamCount:= true; -end; - -// check if is either count1 or count2 -function CheckAndFetchParamCount(L : Plua_State; count1, count2: LongInt; call, paramsyntax: shortstring; out actual: LongInt): boolean; inline; -begin - actual:= lua_gettop(L); - if (actual <> count1) and (actual <> count2) then - begin - LuaParameterCountError('either ' + inttostr(count1) + ' or ' + inttostr(count2), call, paramsyntax, actual); - exit(false); - end; - - CheckAndFetchParamCount:= true; -end; - -// check if is in range of count1 and count2 -function CheckAndFetchParamCountRange(L : Plua_State; count1, count2: LongInt; call, paramsyntax: shortstring; out actual: LongInt): boolean; inline; -begin - actual:= lua_gettop(L); - if (actual < count1) or (actual > count2) then - begin - LuaParameterCountError('at least ' + inttostr(count1) + ', but at most ' + inttostr(count2), call, paramsyntax, actual); - exit(false); - end; - - CheckAndFetchParamCountRange:= true; -end; - -// check if is same or higher as minCount -function CheckAndFetchLuaParamMinCount(L : Plua_State; minCount: LongInt; call, paramsyntax: shortstring; out actual: LongInt): boolean; inline; -begin - actual:= lua_gettop(L); - if (actual < minCount) then - begin - LuaParameterCountError(inttostr(minCount) + ' or more', call, paramsyntax, actual); - exit(false); - end; - - CheckAndFetchLuaParamMinCount:= true; -end; - -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); - if (i < ord(Low(TGearType))) or (i > ord(High(TGearType))) then - begin - LuaCallError('Invalid gearType!', call, paramsyntax); - LuaToGearTypeOrd:= -1; - end - else - LuaToGearTypeOrd:= i; -end; - -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); - if (i < ord(Low(TVisualGearType))) or (i > ord(High(TVisualGearType))) then - begin - LuaCallError('Invalid visualGearType!', call, paramsyntax); - LuaToVisualGearTypeOrd:= -1; - end - else - LuaToVisualGearTypeOrd:= i; -end; - -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); - if (i < ord(Low(TAmmoType))) or (i > ord(High(TAmmoType))) then - begin - LuaCallError('Invalid ammoType!', call, paramsyntax); - LuaToAmmoTypeOrd:= -1; - end - else - LuaToAmmoTypeOrd:= i; -end; - -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); - if (i < ord(Low(TStatInfoType))) or (i > ord(High(TStatInfoType))) then - begin - LuaCallError('Invalid statInfoType!', call, paramsyntax); - LuaToStatInfoTypeOrd:= -1; - end - else - LuaToStatInfoTypeOrd:= i; -end; - -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); - if (i < ord(Low(TSound))) or (i > ord(High(TSound))) then - begin - LuaCallError('Invalid soundId!', call, paramsyntax); - LuaToSoundOrd:= -1; - end - else - LuaToSoundOrd:= i; -end; - -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); - if (i < ord(Low(THogEffect))) or (i > ord(High(THogEffect))) then - begin - LuaCallError('Invalid effect type!', call, paramsyntax); - LuaToHogEffectOrd:= -1; - end - else - LuaToHogEffectOrd:= i; -end; - -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); - if (i < ord(Low(TCapGroup))) or (i > ord(High(TCapGroup))) then - begin - LuaCallError('Invalid capgroup type!', call, paramsyntax); - LuaToCapGroupOrd:= -1; - end - else - LuaToCapGroupOrd:= i; -end; - -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); - if (i < ord(Low(TSprite))) or (i > ord(High(TSprite))) then - begin - LuaCallError('Invalid sprite id!', call, paramsyntax); - LuaToSpriteOrd:= -1; - end - else - LuaToSpriteOrd:= i; -end; - -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); - if (i < ord(Low(TMapGen))) or (i > ord(High(TMapGen))) then - begin - LuaCallError('Invalid mapgen id!', call, paramsyntax); - LuaToMapGenOrd:= -1; - end - else - LuaToMapGenOrd:= i; -end; - -// wrapped calls - -// functions called from Lua: -// function(L : Plua_State) : LongInt; Cdecl; -// where L contains the state, returns the number of return values on the stack -// call CheckLuaParamCount or CheckAndFetchParamCount -// to validate/get the number of passed arguments (see their call definitions) -// -// use as return value the number of variables pushed back to the lua script - -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)) - else - lua_pushnil(L); - lc_band := 1; -end; - -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)) - else - lua_pushnil(L); - lc_bor := 1; -end; - -function lc_bnot(L: PLua_State): LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 1, 'bnot', 'value') then - lua_pushinteger(L, (not lua_tointeger(L, 1))) - else - lua_pushnil(L); - lc_bnot := 1; -end; - -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)) - else - lua_pushnil(L); - lc_div := 1; -end; - -function lc_getinputmask(L : Plua_State) : LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 0, 'GetInputMask', '') then - lua_pushinteger(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); - lc_setinputmask:= 0 -end; - -function lc_writelntoconsole(L : Plua_State) : LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 1, 'WriteLnToConsole', 'string') then - WriteLnToConsole('Lua: ' + lua_tostring(L ,1)); - lc_writelntoconsole:= 0; -end; - -function lc_parsecommand(L : Plua_State) : LongInt; Cdecl; -var t: PChar; - i,c: LongWord; - s: shortstring; -begin - if CheckLuaParamCount(L, 1, 'ParseCommand', 'string') then - begin - t:= lua_tolstring(L, 1, Psize_t(@c)); - - for i:= 1 to c do s[i]:= t[i-1]; - s[0]:= char(c); - - ParseCommand(s, true, true); - - end; - 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 - // no point to run this without any CurrentHedgehog - if (CurrentHedgehog <> nil) and (CheckLuaParamCount(L, 1, call, params)) then - begin - at:= LuaToAmmoTypeOrd(L, 1, call, params); - if at >= 0 then - ParseCommand('setweap ' + char(at), true, true); - end; - lc_setweapon:= 0; -end; - -// enable/disable cinematic effects -function lc_setcinematicmode(L : Plua_State) : LongInt; Cdecl; -const - call = 'SetCinematicMode'; - params = 'enable'; -begin - if (CheckLuaParamCount(L, 1, call, params)) then - begin - CinematicScript:= lua_toboolean(L, 1); - end; - lc_setcinematicmode:= 0; -end; - -// no parameter means reset to default (and 0 means unlimited) -function lc_setmaxbuilddistance(L : Plua_State) : LongInt; Cdecl; -var np: LongInt; -const - call = 'SetMaxBuildDistance'; - params = '[ distInPx ]'; -begin - if CheckAndFetchParamCountRange(L, 0, 1, call, params, np) then - begin - if np = 0 then - begin - // no args? reset - cBuildMaxDist:= cDefaultBuildMaxDist; - end - else - CBuildMaxDist:= lua_tointeger(L, 1); - end; - lc_setmaxbuilddistance:= 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 (CheckLuaParamCount(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 is 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 will not 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 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)); - lc_showmission:= 0; -end; - -function lc_hidemission(L : Plua_State) : LongInt; Cdecl; -begin - L:= L; // avoid compiler hint - HideMission; - 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 - // can have 1 or more arguments - if CheckAndFetchLuaParamMinCount(L, 1, 'EnableGameFlags', 'gameFlag, ... ', n) then - begin - for i:= 1 to n do - GameFlags := GameFlags or LongWord(lua_tointeger(L, i)); - ScriptSetInteger('GameFlags', GameFlags); - end; - lc_enablegameflags:= 0; -end; - -function lc_disablegameflags(L : Plua_State) : LongInt; Cdecl; -var i , n: integer; -begin - // can have 1 or more arguments - if CheckAndFetchLuaParamMinCount(L, 1, 'DisableGameFlags', 'gameFlag, ... ', n) then - begin - for i:= 1 to n do - GameFlags := GameFlags and (not LongWord(lua_tointeger(L, i))); - ScriptSetInteger('GameFlags', GameFlags); - end; - lc_disablegameflags:= 0; -end; - -function lc_cleargameflags(L : Plua_State) : LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 0, 'ClearGameFlags', '') then - begin - GameFlags:= 0; - ScriptSetInteger('GameFlags', GameFlags); - end; - lc_cleargameflags:= 0; -end; - -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)) - else - lua_pushnil(L); - lc_getgameflag:= 1; -end; - -function lc_addcaption(L : Plua_State) : LongInt; Cdecl; -var cg: LongInt; -const - call = 'AddCaption'; - params = 'text [, color, captiongroup]'; -begin - if CheckAndFetchParamCount(L, 1, 3, call, params, cg) then - begin - if cg = 1 then - AddCaption(lua_tostringA(L, 1), cWhiteColor, capgrpMessage) - else - begin - cg:= LuaToCapGroupOrd(L, 3, call, params); - if cg >= 0 then - AddCaption(lua_tostringA(L, 1), lua_tointeger(L, 2) shr 8, TCapGroup(cg)); - end - end; - lc_addcaption:= 0; -end; - -function lc_campaignlock(L : Plua_State) : LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 1, 'CampaignLock', 'TODO') then - begin - // TODO - end; - lc_campaignlock:= 0; -end; - -function lc_campaignunlock(L : Plua_State) : LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 1, 'CampaignUnlock', 'TODO') then - begin - // TODO - end; - lc_campaignunlock:= 0; -end; - -function lc_spawnfakehealthcrate(L: Plua_State) : LongInt; Cdecl; -var gear: PGear; -begin - if CheckLuaParamCount(L, 4,'SpawnFakeHealthCrate', 'x, y, explode, poison') then - begin - gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), - HealthCrate, lua_toboolean(L, 3), lua_toboolean(L, 4)); - if gear <> nil then - lua_pushinteger(L, gear^.uid) - else lua_pushnil(L) - end - else - lua_pushnil(L); - lc_spawnfakehealthcrate := 1; -end; - -function lc_spawnfakeammocrate(L: PLua_State): LongInt; Cdecl; -var gear: PGear; -begin - if CheckLuaParamCount(L, 4,'SpawnFakeAmmoCrate', 'x, y, explode, poison') then - begin - gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), - AmmoCrate, lua_toboolean(L, 3), lua_toboolean(L, 4)); - if gear <> nil then - lua_pushinteger(L, gear^.uid) - else lua_pushnil(L) - end - else - lua_pushnil(L); - lc_spawnfakeammocrate := 1; -end; - -function lc_spawnfakeutilitycrate(L: PLua_State): LongInt; Cdecl; -var gear: PGear; -begin - if CheckLuaParamCount(L, 4,'SpawnFakeUtilityCrate', 'x, y, explode, poison') then - begin - gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), - UtilityCrate, lua_toboolean(L, 3), lua_toboolean(L, 4)); - if gear <> nil then - lua_pushinteger(L, gear^.uid) - else lua_pushnil(L) - end - else - lua_pushnil(L); - lc_spawnfakeutilitycrate := 1; -end; - -function lc_spawnhealthcrate(L: Plua_State) : LongInt; Cdecl; -var gear: PGear; -var health, n: LongInt; -begin - if CheckAndFetchParamCount(L, 2, 3, 'SpawnHealthCrate', 'x, y [, health]', n) then - begin - if n = 3 then - health:= lua_tointeger(L, 3) - else - health:= cHealthCaseAmount; - gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), HealthCrate, health, 0); - if gear <> nil then - lua_pushinteger(L, gear^.uid) - else lua_pushnil(L); - end - else - lua_pushnil(L); - lc_spawnhealthcrate := 1; -end; - -function lc_spawnammocrate(L: PLua_State): LongInt; Cdecl; -var gear: PGear; - n : LongInt; -begin - 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)); - if gear <> nil then - lua_pushinteger(L, gear^.uid) - else lua_pushnil(L); - end - else - lua_pushnil(L); - lc_spawnammocrate := 1; -end; - -function lc_spawnutilitycrate(L: PLua_State): LongInt; Cdecl; -var gear: PGear; - n : LongInt; -begin - 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)); - if gear <> nil then - lua_pushinteger(L, gear^.uid) - else lua_pushnil(L); - end - else - lua_pushnil(L); - lc_spawnutilitycrate := 1; -end; - -function lc_addgear(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; - x, y, s, t: LongInt; - dx, dy: hwFloat; - gt: TGearType; -const - call = 'AddGear'; - params = 'x, y, gearType, state, dx, dy, timer'; -begin - if CheckLuaParamCount(L, 7, call, params) then - begin - t:= LuaToGearTypeOrd(L, 3, call, params); - 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); - - gear:= AddGear(x, y, gt, s, dx, dy, t); - lastGearByUID:= gear; - lua_pushinteger(L, gear^.uid) - end - else - lua_pushnil(L); - end - else - lua_pushnil(L); - lc_addgear:= 1; // 1 return value -end; - -function lc_deletegear(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'DeleteGear', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - gear^.Message:= gear^.Message or gmDelete; - end; - lc_deletegear:= 0 -end; - -function lc_addvisualgear(L : Plua_State) : LongInt; Cdecl; -var vg : PVisualGear; - x, y, s, n, layer: LongInt; - c: Boolean; - vgt: TVisualGearType; - uid: Longword; -const - call = 'AddVisualGear'; - params = 'x, y, visualGearType, state, critical [, layer]'; -begin - uid:= 0; - if CheckAndFetchParamCount(L, 5, 6, call, params, n) then - begin - s:= LuaToVisualGearTypeOrd(L, 3, call, params); - if s >= 0 then - begin - vgt:= TVisualGearType(s); - x:= lua_tointeger(L, 1); - y:= lua_tointeger(L, 2); - s:= lua_tointeger(L, 4); - c:= lua_toboolean(L, 5); - - if n = 6 then - begin - layer:= lua_tointeger(L, 6); - vg:= AddVisualGear(x, y, vgt, s, c, layer); - end - else - vg:= AddVisualGear(x, y, vgt, s, c); - - if vg <> nil then - begin - lastVisualGearByUID:= vg; - uid:= vg^.uid; - lua_pushinteger(L, uid); - end; - end - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_addvisualgear:= 1; // 1 return value -end; - -function lc_deletevisualgear(L : Plua_State) : LongInt; Cdecl; -var vg : PVisualGear; -begin - vg:= nil; - if CheckLuaParamCount(L, 1, 'DeleteVisualGear', 'vgUid') then - begin - vg:= VisualGearByUID(lua_tointeger(L, 1)); - if vg <> nil then - DeleteVisualGear(vg); - end; - // allow caller to know whether there was something to delete - lua_pushboolean(L, vg <> nil); - 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(lua_tointeger(L, 1)); - if vg <> nil then - lua_pushinteger(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)); - if vg <> nil then - begin - lua_pushinteger(L, round(vg^.X)); - lua_pushinteger(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); - 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); - end - 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); - end; - lc_getvisualgearvalues:= 10 -end; - -function lc_setvisualgearvalues(L : Plua_State) : LongInt; Cdecl; -var vg : PVisualGear; -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 - 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 were not 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); - lua_pushinteger(L, gear^.Damage); - lua_pushinteger(L, gear^.Boom) - 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); lua_pushnil(L); lua_pushnil(L) - end - 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); lua_pushnil(L); lua_pushnil(L) - end; - lc_getgearvalues:= 13 -end; - -function lc_setgearvalues(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin -// 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)); - 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); - if not lua_isnoneornil(L, 13) then - gear^.Damage := lua_tointeger(L, 13); - if not lua_isnoneornil(L, 14) then - gear^.Boom := lua_tointeger(L, 14); - end; -// end -// else -// lua_pushnil(L); // return value on stack (nil) - lc_setgearvalues:= 0 -end; - -function lc_getfollowgear(L : Plua_State) : LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 0, 'GetFollowGear', '') then - begin - if FollowGear = nil then - lua_pushnil(L) - else - lua_pushinteger(L, FollowGear^.uid); - end - else - lua_pushnil(L); - lc_getfollowgear:= 1; // 1 return value -end; - -function lc_getgeartype(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetGearType', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - lua_pushinteger(L, ord(gear^.Kind)) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_getgeartype:= 1 -end; - -function lc_getgearmessage(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetGearMessage', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - lua_pushinteger(L, gear^.message) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_getgearmessage:= 1 -end; - -function lc_getgearelasticity(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetGearElasticity', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - lua_pushinteger(L, hwRound(gear^.elasticity * _10000)) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - 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 - if CheckLuaParamCount(L, 2, 'SetGearMessage', 'gearUid, message') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - gear^.message:= lua_tointeger(L, 2); - end; - lc_setgearmessage:= 0 -end; - -function lc_getgearpos(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetGearPos', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - lua_pushinteger(L, gear^.Pos) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_getgearpos:= 1 -end; - -function lc_setgearpos(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 2, 'SetGearPos', 'gearUid, value') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - gear^.Pos:= lua_tointeger(L, 2); - end; - lc_setgearpos:= 0 -end; - -function lc_getgearcollisionmask(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetGearCollisionMask', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - lua_pushinteger(L, gear^.CollisionMask) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_getgearcollisionmask:= 1 -end; - -function lc_setgearcollisionmask(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 2, 'SetGearCollisionMask', 'gearUid, mask') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - gear^.CollisionMask:= lua_tointeger(L, 2); - end; - lc_setgearcollisionmask:= 0 -end; - -function lc_gethoglevel(L : Plua_State): LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetHogLevel', 'gearUid') then - begin - gear := GearByUID(lua_tointeger(L, 1)); - if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then - lua_pushinteger(L, gear^.Hedgehog^.BotLevel) - else - lua_pushnil(L); - end; - lc_gethoglevel := 1; -end; - -function lc_sethoglevel(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 2, 'SetHogLevel', 'gearUid, level') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then - gear^.Hedgehog^.BotLevel:= lua_tointeger(L, 2); - end; - lc_sethoglevel:= 0 -end; - -function lc_gethogclan(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetHogClan', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(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) - end - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_gethogclan:= 1 -end; - -function lc_getclancolor(L : Plua_State) : LongInt; Cdecl; -var idx: integer; -begin - if CheckLuaParamCount(L, 1, 'GetClanColor', 'clanIdx') then - begin - idx:= lua_tointeger(L, 1); - if (not lua_isnumber(L, 1)) then - begin - LuaError('Argument ''clanIdx'' must be a number!'); - lua_pushnil(L); - end - else if (idx < 0) or (idx >= ClansCount) then - begin - LuaError('Argument ''clanIdx'' out of range! (There are currently ' + IntToStr(ClansCount) + ' clans, so valid range is: 0-' + IntToStr(ClansCount-1) + ')'); - lua_pushnil(L); - end - else - lua_pushinteger(L, ClansArray[idx]^.Color shl 8 or $FF); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_getclancolor:= 1 -end; - -function lc_setclancolor(L : Plua_State) : LongInt; Cdecl; -var clan : PClan; - team : PTeam; - hh : THedgehog; - i, j : LongInt; -begin - if CheckLuaParamCount(L, 2, 'SetClanColor', 'clan, color') then - begin - i:= lua_tointeger(L,1); - if i >= ClansCount then exit(0); - clan := ClansArray[i]; - clan^.Color:= lua_tointeger(L, 2) shr 8; - - for i:= 0 to Pred(clan^.TeamsNumber) do - begin - team:= clan^.Teams[i]; - for j:= 0 to 7 do - begin - hh:= team^.Hedgehogs[j]; - if (hh.Gear <> nil) or (hh.GearHidden <> nil) then - begin - FreeAndNilTexture(hh.NameTagTex); - hh.NameTagTex:= RenderStringTex(ansistring(hh.Name), clan^.Color, fnt16); - RenderHealth(hh); - end; - end; - FreeAndNilTexture(team^.NameTagTex); - team^.NameTagTex:= RenderStringTex(ansistring(clan^.Teams[i]^.TeamName), clan^.Color, fnt16); - end; - - FreeAndNilTexture(clan^.HealthTex); - clan^.HealthTex:= makeHealthBarTexture(cTeamHealthWidth + 5, clan^.Teams[0]^.NameTagTex^.h, clan^.Color); - end; - - lc_setclancolor:= 0 -end; - -function lc_gethogvoicepack(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetHogVoicepack', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then - lua_pushstring(L, str2pchar(gear^.Hedgehog^.Team^.Voicepack^.name)) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_gethogvoicepack:= 1 -end; - -function lc_gethoggrave(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetHogGrave', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(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 - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_gethoggrave:= 1 -end; - -function lc_gethogflag(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetHogFlag', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(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 - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - 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(lua_tointeger(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(lua_tointeger(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)); - // 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 - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_gethogteamname:= 1 -end; - -function lc_sethogteamname(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 2, 'SetHogTeamName', 'gearUid, name') then - begin - gear := GearByUID(lua_tointeger(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); - - FreeAndNilTexture(gear^.Hedgehog^.Team^.NameTagTex); - gear^.Hedgehog^.Team^.NameTagTex:= RenderStringTex(ansistring(gear^.Hedgehog^.Team^.TeamName), gear^.Hedgehog^.Team^.Clan^.Color, fnt16); - end - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_sethogteamname:= 1 -end; - -function lc_gethogname(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetHogName', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(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)) - end - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_gethogname:= 1 -end; - -function lc_sethogname(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 2, 'SetHogName', 'gearUid, name') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then - begin - gear^.Hedgehog^.Name:= lua_tostring(L, 2); - - FreeAndNilTexture(gear^.Hedgehog^.NameTagTex); - gear^.Hedgehog^.NameTagTex:= RenderStringTex(ansistring(gear^.Hedgehog^.Name), gear^.Hedgehog^.Team^.Clan^.Color, fnt16) - end - end; - lc_sethogname:= 0; -end; - -function lc_gettimer(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetTimer', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - lua_pushinteger(L, gear^.Timer) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_gettimer:= 1 -end; - -function lc_getflighttime(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetFlightTime', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - lua_pushinteger(L, gear^.FlightTime) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_getflighttime:= 1 -end; - -function lc_gethealth(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetHealth', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - lua_pushinteger(L, gear^.Health) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_gethealth:= 1 -end; - -function lc_getx(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetX', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - lua_pushinteger(L, hwRound(gear^.X)) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_getx:= 1 -end; - -function lc_gety(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetY', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - lua_pushinteger(L, hwRound(gear^.Y)) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_gety:= 1 -end; - -function lc_copypv(L : Plua_State) : LongInt; Cdecl; -var gears, geard : PGear; -begin - if CheckLuaParamCount(L, 2, 'CopyPV', 'fromGearUid, toGearUid') then - begin - gears:= GearByUID(lua_tointeger(L, 1)); - geard:= GearByUID(lua_tointeger(L, 2)); - if (gears <> nil) and (geard <> nil) then - begin - geard^.X:= gears^.X; - geard^.Y:= gears^.Y; - geard^.dX:= gears^.dX; - geard^.dY:= gears^.dY; - end - end; - lc_copypv:= 0 -end; - -function lc_followgear(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'FollowGear', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then FollowGear:= gear - end; - lc_followgear:= 0 -end; - -function lc_hogsay(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; - vgear : PVisualGear; - s : LongWord; - n : LongInt; -begin - if CheckAndFetchParamCount(L, 3, 4, 'HogSay', 'gearUid, text, manner [, vgState]', n) then - begin - gear:= GearByUID(lua_tointeger(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) - else - s:= 0; - vgear:= AddVisualGear(0, 0, vgtSpeechBubble, s, true); - if vgear <> nil then - begin - vgear^.Text:= lua_tostring(L, 2); - if Gear^.Kind = gtHedgehog then - begin - AddChatString(#9+'[' + gear^.Hedgehog^.Name + '] '+vgear^.text); - vgear^.Hedgehog:= gear^.Hedgehog - end - else vgear^.Frame:= gear^.uid; - - vgear^.FrameTicks:= lua_tointeger(L, 3); - if (vgear^.FrameTicks < 1) or (vgear^.FrameTicks > 3) then - vgear^.FrameTicks:= 1; - lua_pushinteger(L, vgear^.Uid); - end - end - else - lua_pushnil(L) - end - else - lua_pushnil(L); - lc_hogsay:= 1 -end; - -function lc_switchhog(L : Plua_State) : LongInt; Cdecl; -var gear, prevgear : PGear; -begin - if CheckLuaParamCount(L, 1, 'SwitchHog', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(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 - prevgear := CurrentHedgehog^.Gear; - if prevgear <> nil then - begin - prevgear^.Active := false; - prevgear^.State:= prevgear^.State and (not gstHHDriven); - prevgear^.Z := cHHZ; - prevgear^.Message:= prevgear^.Message or gmRemoveFromList or gmAddToList; - end; - - SwitchCurrentHedgehog(gear^.Hedgehog); - CurrentTeam:= CurrentHedgehog^.Team; - - gear^.State:= gear^.State or gstHHDriven; - gear^.Active := true; - gear^.Z := cCurrHHZ; - gear^.Message:= gear^.Message or gmRemoveFromList or gmAddToList; - end - end; - lc_switchhog:= 0 -end; - -function lc_addammo(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; - at, n: LongInt; -const - call = 'AddAmmo'; - params = 'gearUid, ammoType [, ammoCount]'; -begin - if CheckAndFetchParamCount(L, 2, 3, call, params, n) then - begin - at:= LuaToAmmoTypeOrd(L, 2, call, params); - if at >= 0 then - begin - gear:= GearByUID(lua_tointeger(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)) - end; - end; - lc_addammo:= 0 -end; - -function lc_getammocount(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; - ammo : PAmmo; - at : LongInt; -const - call = 'GetAmmoCount'; - params = 'gearUid, ammoType'; -begin - if CheckLuaParamCount(L, 2, call, params) then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if (gear <> nil) and (gear^.Hedgehog <> nil) then - begin - at:= LuaToAmmoTypeOrd(L, 2, call, params); - if at >= 0 then - begin - ammo:= GetAmmoEntry(gear^.Hedgehog^, TAmmoType(at)); - if ammo^.AmmoType = amNothing then - lua_pushinteger(L, 0) - else - lua_pushinteger(L, ammo^.Count); - end; - end - else lua_pushinteger(L, 0); - end - else - lua_pushnil(L); - lc_getammocount:= 1 -end; - -function lc_sethealth(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 2, 'SetHealth', 'gearUid, health') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - begin - gear^.Health:= lua_tointeger(L, 2); - - if (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then - begin - RenderHealth(gear^.Hedgehog^); - RecountTeamHealth(gear^.Hedgehog^.Team) - end; - // Why did this do a "setalltoactive" ? - //SetAllToActive; - Gear^.Active:= true; - AllInactive:= false - end - end; - lc_sethealth:= 0 -end; - -function lc_settimer(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -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) - end; - lc_settimer:= 0 -end; - -function lc_setflighttime(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -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) - end; - lc_setflighttime:= 0 -end; - -function lc_seteffect(L : Plua_State) : LongInt; Cdecl; -var gear: PGear; - t : LongInt; -const - call = 'SetEffect'; - params = 'gearUid, effect, effectState'; -begin - if CheckLuaParamCount(L, 3, call, params) then - begin - t:= LuaToHogEffectOrd(L, 2, call, params); - if t >= 0 then - begin - gear := GearByUID(lua_tointeger(L, 1)); - if (gear <> nil) and (gear^.Hedgehog <> nil) then - gear^.Hedgehog^.Effects[THogEffect(t)]:= lua_tointeger(L, 3); - end; - end; - lc_seteffect := 0; -end; - -function lc_geteffect(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; - t : LongInt; -const - call = 'GetEffect'; - params = 'gearUid, effect'; -begin - if CheckLuaParamCount(L, 2, call, params) then - begin - t:= LuaToHogEffectOrd(L, 2, call, params); - if t >= 0 then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if (gear <> nil) and (gear^.Hedgehog <> nil) then - lua_pushinteger(L, gear^.Hedgehog^.Effects[THogEffect(t)]) - else - lua_pushinteger(L, 0) - end; - end - else - lua_pushinteger(L, 0); - lc_geteffect:= 1 -end; - -function lc_setstate(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 2, 'SetState', 'gearUid, state') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - begin - gear^.State:= lua_tointeger(L, 2); - SetAllToActive; - end - end; - lc_setstate:= 0 -end; - -function lc_getstate(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetState', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - lua_pushinteger(L, gear^.State) - else - lua_pushnil(L) - end - else - lua_pushnil(L); // return value on stack (nil) - lc_getstate:= 1 -end; - -function lc_gettag(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetTag', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - lua_pushinteger(L, gear^.Tag) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_gettag:= 1 -end; - -function lc_settag(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 2, 'SetTag', 'gearUid, tag') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - begin - gear^.Tag:= lua_tointeger(L, 2); - SetAllToActive; - end - end; - lc_settag:= 0 -end; - -function lc_endgame(L : Plua_State) : LongInt; Cdecl; -begin - L:= L; // avoid compiler hint - AddGear(0, 0, gtATFinishGame, 0, _0, _0, 3000); - lc_endgame:= 0 -end; - -function lc_sendstat(L : Plua_State) : LongInt; Cdecl; -var statInfo : TStatInfoType; - i, n : LongInt; - color, tn: shortstring; - needsTn : boolean; -const - call = 'SendStat'; - params = 'statInfoType, color [, teamname]'; -begin - if CheckAndFetchParamCount(L, 2, 3, call, params, n) then - begin - i:= LuaToStatInfoTypeOrd(L, 1, call, params); - if i >= 0 then - begin - statInfo:= TStatInfoType(i); - needsTn:= ((statInfo = siPlayerKills) or (statInfo = siClanHealth)); - // check if param count is correct for the used statInfo - if (n = 3) <> needsTn then - begin - if n = 3 then - LuaCallError(EnumToStr(statInfo) + ' does not support the teamname parameter', call, params) - else - LuaCallError(EnumToStr(statInfo) + ' requires the teamname parameter', call, params); - end - else // count is correct! - begin - if needsTn then - begin - // 3: team name - for i:= 0 to Pred(TeamsCount) do - begin - color:= _S'0'; - tn:= lua_tostring(L, 3); - with TeamsArray[i]^ do - begin - if TeamName = tn then - begin - color := uUtils.IntToStr(Clan^.Color); - Break; - end - end - end; - if (statInfo = siPlayerKills) then - begin - SendStat(siPlayerKills, color + ' ' + - lua_tostring(L, 2) + ' ' + tn); - end - else if (statInfo = siClanHealth) then - begin - SendStat(siClanHealth, color + ' ' + - lua_tostring(L, 2)); - end - end - else - begin - SendStat(statInfo,lua_tostring(L, 2)); - end; - end; - end; - end; - lc_sendstat:= 0 -end; - -function lc_sendhealthstatsoff(L : Plua_State) : LongInt; Cdecl; -begin - L:= L; // avoid compiler hint - uStats.SendHealthStatsOn := false; - lc_sendhealthstatsoff:= 0 -end; - -function lc_findplace(L : Plua_State) : LongInt; Cdecl; -var gear: PGear; - fall: boolean; - tryhard: boolean; - left, right, n: LongInt; -begin - if CheckAndFetchParamCount(L, 4, 5, 'FindPlace', 'gearUid, fall, left, right [, tryHarder]', n) then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - fall:= lua_toboolean(L, 2); - left:= lua_tointeger(L, 3); - right:= lua_tointeger(L, 4); - if n = 5 then - tryhard:= lua_toboolean(L, 5) - else - tryhard:= false; - if gear <> nil then - FindPlace(gear, fall, left, right, tryhard); - if gear <> nil then - lua_pushinteger(L, gear^.uid) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_findplace:= 1 -end; - -function lc_playsound(L : Plua_State) : LongInt; Cdecl; -var gear: PGear; - n, s: LongInt; -const - call = 'PlaySound'; - params = 'soundId [, hhGearUid]'; -begin - if CheckAndFetchParamCount(L, 1, 2, call, params, n) then - begin - s:= LuaToSoundOrd(L, 1, call, params); - if s >= 0 then - begin - // no gear specified - if n = 1 then - PlaySound(TSound(s)) - else - begin - gear:= GearByUID(lua_tointeger(L, 2)); - if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then - AddVoice(TSound(s),gear^.Hedgehog^.Team^.Voicepack) - end; - end; - end; - lc_playsound:= 0; -end; - -function lc_addteam(L : Plua_State) : LongInt; Cdecl; -var np: LongInt; -begin - if CheckAndFetchParamCount(L, 5, 6, 'AddTeam', 'teamname, color, grave, fort, voicepack [, flag]', np) then - begin - ParseCommand('addteam x ' + lua_tostring(L, 2) + ' ' + lua_tostring(L, 1), true, true); - ParseCommand('grave ' + lua_tostring(L, 3), true, true); - ParseCommand('fort ' + lua_tostring(L, 4), true, true); - ParseCommand('voicepack ' + lua_tostring(L, 5), true, true); - if (np = 6) then ParseCommand('flag ' + lua_tostring(L, 6), true, true); - CurrentTeam^.Binds:= DefaultBinds - // fails on x64 - //lua_pushinteger(L, LongInt(CurrentTeam)); - end; - //else - //lua_pushnil(L) - lc_addteam:= 0;//1; -end; - -function lc_dismissteam(L : Plua_State) : LongInt; Cdecl; -var HHGear: PGear; - i, h : LongInt; - hidden: boolean; -begin - if CheckLuaParamCount(L, 1, 'DismissTeam', '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; - - // destroy all hogs of matching team, including the hidden ones - for h:= 0 to cMaxHHIndex do - begin - hidden:= (TeamsArray[i]^.Hedgehogs[h].GearHidden <> nil); - if hidden then - RestoreHog(@TeamsArray[i]^.Hedgehogs[h]); - // destroy hedgehog gear, if any - HHGear:= TeamsArray[i]^.Hedgehogs[h].Gear; - if HHGear <> nil then - begin - // smoke effect - if (not hidden) then - begin - AddVisualGear(hwRound(HHGear^.X), hwRound(HHGear^.Y), vgtSmokeWhite); - AddVisualGear(hwRound(HHGear^.X) - 16 + Random(32), hwRound(HHGear^.Y) - 16 + Random(32), vgtSmokeWhite); - AddVisualGear(hwRound(HHGear^.X) - 16 + Random(32), hwRound(HHGear^.Y) - 16 + Random(32), vgtSmokeWhite); - AddVisualGear(hwRound(HHGear^.X) - 16 + Random(32), hwRound(HHGear^.Y) - 16 + Random(32), vgtSmokeWhite); - AddVisualGear(hwRound(HHGear^.X) - 16 + Random(32), hwRound(HHGear^.Y) - 16 + Random(32), vgtSmokeWhite); - end; - HHGear^.Message:= HHGear^.Message or gmDestroy; - end; - end; - // can't dismiss more than one team - break; - end; - end; - lc_dismissteam:= 0; -end; - -function lc_addhog(L : Plua_State) : LongInt; Cdecl; -var temp: ShortString; -begin - if CheckLuaParamCount(L, 4, 'AddHog', 'hogname, botlevel, health, hat') then - begin - 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); - end - else - lua_pushnil(L); - lc_addhog:= 1; -end; - -function lc_hogturnleft(L : Plua_State) : LongInt; Cdecl; -var gear: PGear; -begin - if CheckLuaParamCount(L, 2, 'HogTurnLeft', 'gearUid, boolean') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - gear^.dX.isNegative:= lua_toboolean(L, 2); - end; - lc_hogturnleft:= 0; -end; - -function lc_getgearposition(L : Plua_State) : LongInt; Cdecl; -var gear: PGear; -begin - if CheckLuaParamCount(L, 1, 'GetGearPosition', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - begin - lua_pushinteger(L, hwRound(gear^.X)); - lua_pushinteger(L, hwRound(gear^.Y)) - end - else - begin - lua_pushnil(L); - lua_pushnil(L) - end; - end - else - begin - lua_pushnil(L); - lua_pushnil(L) - end; - lc_getgearposition:= 2; -end; - -function lc_setgearposition(L : Plua_State) : LongInt; Cdecl; -var gear: PGear; - col: boolean; - x, y: LongInt; -begin - if CheckLuaParamCount(L, 3, 'SetGearPosition', 'gearUid, x, y') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - begin - col:= gear^.CollisionIndex >= 0; - x:= lua_tointeger(L, 2); - y:= lua_tointeger(L, 3); - if col then - DeleteCI(gear); - gear^.X:= int2hwfloat(x); - gear^.Y:= int2hwfloat(y); - if col then - AddCI(gear); - SetAllToActive - end - end; - lc_setgearposition:= 0 -end; - -function lc_getgeartarget(L : Plua_State) : LongInt; Cdecl; -var gear: PGear; -begin - if CheckLuaParamCount(L, 1, 'GetGearTarget', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - begin - lua_pushinteger(L, gear^.Target.X); - lua_pushinteger(L, gear^.Target.Y) - end - else - begin - lua_pushnil(L); - lua_pushnil(L) - end - end - else - begin - lua_pushnil(L); - lua_pushnil(L) - end; - lc_getgeartarget:= 2; -end; - -function lc_setgeartarget(L : Plua_State) : LongInt; Cdecl; -var gear: PGear; -begin - if CheckLuaParamCount(L, 3, 'SetGearTarget', 'gearUid, x, y') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - begin - gear^.Target.X:= lua_tointeger(L, 2); - gear^.Target.Y:= lua_tointeger(L, 3) - end - end; - lc_setgeartarget:= 0 -end; - -function lc_getgearvelocity(L : Plua_State) : LongInt; Cdecl; -var gear: PGear; -var t: LongInt; -begin - if CheckLuaParamCount(L, 1, 'GetGearVelocity', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(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)) - end - end - else - begin - lua_pushnil(L); - lua_pushnil(L); - end; - lc_getgearvelocity:= 2; -end; - -function lc_setgearvelocity(L : Plua_State) : LongInt; Cdecl; -var gear: PGear; -begin - if CheckLuaParamCount(L, 3, 'SetGearVelocity', 'gearUid, dx, dy') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - begin - gear^.dX:= int2hwFloat(lua_tointeger(L, 2)) / 1000000; - gear^.dY:= int2hwFloat(lua_tointeger(L, 3)) / 1000000; - SetAllToActive; - end - end; - lc_setgearvelocity:= 0 -end; - -function lc_setzoom(L : Plua_State) : LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 1, 'SetZoom', 'zoomLevel') then - begin - ZoomValue:= lua_tonumber(L, 1); - if ZoomValue < cMaxZoomLevel then - ZoomValue:= cMaxZoomLevel; - if ZoomValue > cMinZoomLevel then - ZoomValue:= cMinZoomLevel; - end; - lc_setzoom:= 0 -end; - -function lc_getzoom(L : Plua_State) : LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 0, 'GetZoom', '') then - lua_pushnumber(L, ZoomValue) - else - lua_pushnil(L); - lc_getzoom:= 1 -end; - -function lc_setammo(L : Plua_State) : LongInt; Cdecl; -var np, at: LongInt; -const - call = 'SetAmmo'; - params = 'ammoType, count, probability, delay [, numberInCrate]'; -begin - if CheckAndFetchParamCount(L, 4, 5, call, params, np) then - begin - at:= LuaToAmmoTypeOrd(L, 1, call, params); - 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) - else - ScriptSetAmmo(TAmmoType(at), lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5)); - end; - end; - lc_setammo:= 0 -end; - -function lc_setammodelay(L : Plua_State) : LongInt; Cdecl; -var at: LongInt; -const - call = 'SetAmmoDelay'; - params = 'ammoType, delay'; -begin - if CheckLuaParamCount(L, 2, call, params) then - begin - at:= LuaToAmmoTypeOrd(L, 1, call, params); - if at >= 0 then - ScriptSetAmmoDelay(TAmmoType(at), lua_tointeger(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); - if (m > 0) then - lua_pushinteger(L, GetRandom(m)) - else - begin - LuaError('Lua: Tried to pass 0 to GetRandom!'); - lua_pushnil(L); - end - end - else - lua_pushnil(L); // return value on stack (nil) - lc_getrandom:= 1 -end; - -function lc_setwind(L : Plua_State) : LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 1, 'SetWind', 'windSpeed') then - begin - cWindSpeed:= int2hwfloat(lua_tointeger(L, 1)) / 100 * cMaxWindSpeed; - cWindSpeedf:= SignAs(cWindSpeed,cWindSpeed).QWordValue / SignAs(_1,_1).QWordValue; - if cWindSpeed.isNegative then - CWindSpeedf := -cWindSpeedf; - AddVisualGear(0, 0, vgtSmoothWindBar); - end; - lc_setwind:= 0 -end; - -function lc_maphasborder(L : Plua_State) : LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 0, 'MapHasBorder', '') then - lua_pushboolean(L, hasBorder) - else - lua_pushnil(L); - lc_maphasborder:= 1 -end; - -function lc_getgearradius(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetGearRadius', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - lua_pushinteger(L, gear^.Radius) - else - lua_pushnil(L); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_getgearradius:= 1 -end; - -function lc_gethoghat(L : Plua_State): LongInt; Cdecl; -var gear : PGear; -begin - if CheckLuaParamCount(L, 1, 'GetHogHat', 'gearUid') then - begin - gear := GearByUID(lua_tointeger(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 - lua_pushnil(L); - end - else - lua_pushnil(L); - lc_gethoghat := 1; -end; - -function lc_sethoghat(L : Plua_State) : LongInt; Cdecl; -var gear : PGear; - hat: ShortString; -begin - if CheckLuaParamCount(L, 2, 'SetHogHat', 'gearUid, hat') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then - begin - hat:= lua_tostring(L, 2); - gear^.Hedgehog^.Hat:= hat; - AddFileLog('Changed hat to: '+hat); - if (Length(hat) > 39) and (Copy(hat,1,8) = 'Reserved') and (Copy(hat,9,32) = gear^.Hedgehog^.Team^.PlayerHash) then - LoadHedgehogHat(gear^.Hedgehog^, 'Reserved/' + Copy(hat,9,Length(hat)-8)) - else - LoadHedgehogHat(gear^.Hedgehog^, hat) - end - end; - lc_sethoghat:= 0; -end; - -function lc_placesprite(L : Plua_State) : LongInt; Cdecl; -var spr : TSprite; - lf : Word; - tint : LongWord; - i, n : LongInt; - placed, behind, flipHoriz, flipVert : boolean; -const - call = 'PlaceSprite'; - params = 'x, y, sprite, frameIdx, tint, behind, flipHoriz, flipVert, [, landFlag, ... ]'; -begin - placed:= false; - if CheckAndFetchLuaParamMinCount(L, 4, call, params, n) then - begin - if not lua_isnoneornil(L, 5) then - tint := lua_tointeger(L, 5) - else tint := $FFFFFFFF; - if not lua_isnoneornil(L, 6) then - behind := lua_toboolean(L, 6) - else behind := false; - if not lua_isnoneornil(L, 7) then - flipHoriz := lua_toboolean(L, 7) - else flipHoriz := false; - if not lua_isnoneornil(L, 8) then - flipVert := lua_toboolean(L, 8) - else flipVert := false; - lf:= 0; - - // 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); - - n:= LuaToSpriteOrd(L, 3, call, params); - if n >= 0 then - begin - spr:= TSprite(n); - if SpritesData[spr].Surface = nil then - 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); - end; - end; - - lua_pushboolean(L, placed); - lc_placesprite:= 1 -end; - -function lc_erasesprite(L : Plua_State) : LongInt; Cdecl; -var spr : TSprite; - lf : Word; - i, n : LongInt; - eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert : boolean; -const - call = 'EraseSprite'; - params = 'x, y, sprite, frameIdx, eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert, [, landFlag, ... ]'; -begin - if CheckAndFetchLuaParamMinCount(L, 4, call, params, n) then - begin - if not lua_isnoneornil(L, 5) then - eraseOnLFMatch := lua_toboolean(L, 5) - else eraseOnLFMatch := false; - if not lua_isnoneornil(L, 6) then - onlyEraseLF := lua_toboolean(L, 6) - else onlyEraseLF := false; - if not lua_isnoneornil(L, 7) then - flipHoriz := lua_toboolean(L, 7) - else flipHoriz := false; - if not lua_isnoneornil(L, 8) then - flipVert := lua_toboolean(L, 8) - else flipVert := false; - lf:= 0; - - // 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); - - n:= LuaToSpriteOrd(L, 3, call, params); - if n >= 0 then - begin - spr:= TSprite(n); - if SpritesData[spr].Surface = nil then - 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); - end; - end; - lc_erasesprite:= 0 -end; - -function lc_placegirder(L : Plua_State) : LongInt; Cdecl; -var placed: boolean; -begin - 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); - - 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( - lua_tointeger(L, 1) - SpritesData[sprAmRubber].Width div 2, - lua_tointeger(L, 2) - SpritesData[sprAmRubber].Height div 2, - sprAmRubber, lua_tointeger(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)) - else - lua_pushinteger(L, ord(amNothing)); - lc_getcurammotype := 1; -end; - -function lc_savecampaignvar(L : Plua_State): LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 2, 'SaveCampaignVar', 'varname, value') then - SendIPC('V!' + lua_tostring(L, 1) + ' ' + lua_tostring(L, 2) + #0); - lc_savecampaignvar := 0; -end; - -function lc_getcampaignvar(L : Plua_State): LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 1, 'GetCampaignVar', 'varname') then - SendIPCAndWaitReply('V?' + lua_tostring(L, 1) + #0); - lua_pushstring(L, str2pchar(CampaignVariable)); - lc_getcampaignvar := 1; -end; - -function lc_hidehog(L: Plua_State): LongInt; Cdecl; -var gear: PGear; -begin - if CheckLuaParamCount(L, 1, 'HideHog', 'gearUid') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - HideHog(gear^.hedgehog) - end; - lc_hidehog := 0; -end; - -function lc_restorehog(L: Plua_State): LongInt; Cdecl; -var i, h: LongInt; - uid: LongWord; -begin - if CheckLuaParamCount(L, 1, 'RestoreHog', 'gearUid') then - begin - uid:= LongWord(lua_tointeger(L, 1)); - if TeamsCount > 0 then - for i:= 0 to Pred(TeamsCount) do - for h:= 0 to cMaxHHIndex do - if (TeamsArray[i]^.Hedgehogs[h].GearHidden <> nil) and (TeamsArray[i]^.Hedgehogs[h].GearHidden^.uid = uid) then - begin - RestoreHog(@TeamsArray[i]^.Hedgehogs[h]); - exit(0) - end - end; - lc_restorehog := 0; -end; - -// boolean TestRectForObstacle(x1, y1, x2, y2, landOnly) -function lc_testrectforobstacle(L : Plua_State) : LongInt; Cdecl; -var rtn: Boolean; -begin - 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), - lua_toboolean(L, 5) - ); - lua_pushboolean(L, rtn); - end - else - lua_pushnil(L); // return value on stack (nil) - lc_testrectforobstacle:= 1 -end; - - -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))); - lc_getgravity:= 1 -end; - -function lc_setgravity(L : Plua_State) : LongInt; Cdecl; -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 - end; - lc_setgravity:= 0 -end; - -function lc_setwaterline(L : Plua_State) : LongInt; Cdecl; -var iterator: PGear; -begin - if CheckLuaParamCount(L, 1, 'SetWaterLine', 'waterline') then - begin - cWaterLine:= lua_tointeger(L,1); - AllInactive:= false; - iterator:= GearsList; - while iterator <> nil do - begin - if not (iterator^.Kind in [gtPortal, gtAirAttack]) and (iterator^.Message and (gmAllStoppable or gmLJump or gmHJump) = 0) then - begin - iterator^.Active:= true; - if iterator^.dY.QWordValue = 0 then iterator^.dY.isNegative:= false; - iterator^.State:= iterator^.State or gstMoving; - DeleteCI(iterator) - end; - iterator:= iterator^.NextGear - end - end; - lc_setwaterline:= 0 -end; - -function lc_setgearaihints(L : Plua_State) : LongInt; Cdecl; -var gear: PGear; -begin - if CheckLuaParamCount(L, 2, 'SetAIHintOnGear', 'gearUid, aiHints') then - begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then - gear^.aihints:= lua_tointeger(L, 2); - end; - lc_setgearaihints:= 0 -end; - - -function lc_hedgewarsscriptload(L : Plua_State) : LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 1, 'HedgewarsScriptLoad', 'scriptPath') then - ScriptLoad(lua_tostring(L, 1)) - else - lua_pushnil(L); - lc_hedgewarsscriptload:= 0; -end; - - -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)); - 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)); - 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)); - lc_dumppoint:= 0 -end; - - -procedure ScriptFlushPoints(); -begin - ParseCommand('draw ' + PointsBuffer, true, true); - PointsBuffer:= ''; -end; - - -function lc_addPoint(L : Plua_State) : LongInt; Cdecl; -var np, param: LongInt; -begin - if CheckAndFetchParamCountRange(L, 2, 4, 'AddPoint', 'x, y [, width [, erase] ]', np) then - begin - // x - param:= LongInt(lua_tointeger(L,1)); - PointsBuffer:= PointsBuffer + char((param shr 8) and $FF); - PointsBuffer:= PointsBuffer + char((param and $FF)); - // y - param:= LongInt(lua_tointeger(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:= (param or $80); - // erase - if (np > 3) and lua_toboolean(L, 4) then - param:= (param or $40); - PointsBuffer:= PointsBuffer + char(param); - end - // no width defined - else - PointsBuffer:= PointsBuffer + char(0); - - // flush before shortstring limit length is reached - if length(PointsBuffer) > 245 then - ScriptFlushPoints(); - end; - lc_addPoint:= 0 -end; - - -function lc_flushPoints(L : Plua_State) : LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 0, 'FlushPoints', '') then - if length(PointsBuffer) > 0 then - ScriptFlushPoints(); - lc_flushPoints:= 0 -end; - -// stuff for lua tests -function lc_endluatest(L : Plua_State) : LongInt; Cdecl; -var rstring: shortstring; -const - call = 'EndLuaTest'; - params = 'TEST_SUCCESSFUL or TEST_FAILED'; -begin - if CheckLuaParamCount(L, 1, call, params) then - begin - - case lua_tointeger(L, 1) of - HaltTestSuccess : rstring:= 'Success'; - HaltTestFailed: rstring:= 'FAILED'; - else - begin - LuaCallError('Parameter must be either ' + params, call, params); - exit(0); - end; - end; - - if cTestLua then - begin - WriteLnToConsole('Lua test finished, result: ' + rstring); - halt(lua_tointeger(L, 1)); - end - else LuaError('Not in lua test mode, engine will keep running. Reported test result: ' + rstring); - - end; - - lc_endluatest:= 0; -end; -/////////////////// - -procedure ScriptPrintStack; -var n, i : LongInt; -begin - n:= lua_gettop(luaState); - WriteLnToConsole('Lua: Stack (' + inttostr(n) + ' elements):'); - for i:= 1 to n do - if not lua_isboolean(luaState, i) then - WriteLnToConsole('Lua: ' + inttostr(i) + ': ' + lua_tostring(luaState, i)) - else if lua_toboolean(luaState, i) then - WriteLnToConsole('Lua: ' + inttostr(i) + ': true') - else - WriteLnToConsole('Lua: ' + inttostr(i) + ': false'); -end; - -procedure ScriptClearStack; -begin - lua_settop(luaState, 0) -end; - -procedure ScriptSetNil(name : shortstring); -begin - lua_pushnil(luaState); - lua_setglobal(luaState, Str2PChar(name)); -end; - -procedure ScriptSetInteger(name : shortstring; value : LongInt); -begin - lua_pushinteger(luaState, value); - lua_setglobal(luaState, Str2PChar(name)); -end; - -procedure ScriptSetString(name : shortstring; value : shortstring); -begin - lua_pushstring(luaState, Str2PChar(value)); - lua_setglobal(luaState, Str2PChar(name)); -end; - -function ScriptGetInteger(name : shortstring) : LongInt; -begin - lua_getglobal(luaState, Str2PChar(name)); - ScriptGetInteger:= lua_tointeger(luaState, -1); - lua_pop(luaState, 1); -end; - -function ScriptGetString(name : shortstring) : shortstring; -begin - lua_getglobal(luaState, Str2PChar(name)); - ScriptGetString:= lua_tostring(luaState, -1); - lua_pop(luaState, 1); -end; - -procedure ScriptOnPreviewInit; -begin -// not required if there is no script to run -if not ScriptLoaded then - exit; - -ScriptSetString('Seed', cSeed); -ScriptSetInteger('TemplateFilter', cTemplateFilter); -ScriptSetInteger('TemplateNumber', LuaTemplateNumber); -ScriptSetInteger('MapGen', ord(cMapGen)); -ScriptSetInteger('MapFeatureSize', cFeatureSize); - -ScriptCall('onPreviewInit'); - -// pop game variables -ParseCommand('seed ' + ScriptGetString('Seed'), true, true); -cTemplateFilter := ScriptGetInteger('TemplateFilter'); -LuaTemplateNumber:= ScriptGetInteger('TemplateNumber'); -cMapGen := TMapGen(ScriptGetInteger('MapGen')); -cFeatureSize := ScriptGetInteger('MapFeatureSize'); -end; - -procedure ScriptOnGameInit; -var i, j, k: LongInt; -begin -// not required if there is no script to run -if not ScriptLoaded then - exit; - -// 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); -ScriptSetInteger('MapGen', ord(cMapGen)); -ScriptSetInteger('MapFeatureSize', cFeatureSize); -ScriptSetInteger('ScreenHeight', cScreenHeight); -ScriptSetInteger('ScreenWidth', cScreenWidth); -ScriptSetInteger('TurnTime', cHedgehogTurnTime); -ScriptSetInteger('CaseFreq', cCaseFactor); -ScriptSetInteger('HealthCaseProb', cHealthCaseProb); -ScriptSetInteger('HealthCaseAmount', cHealthCaseAmount); -ScriptSetInteger('DamagePercent', cDamagePercent); -ScriptSetInteger('RopePercent', cRopePercent); -ScriptSetInteger('MinesNum', cLandMines); -ScriptSetInteger('MinesTime', cMinesTime); -ScriptSetInteger('MineDudPercent', cMineDudPercent); -ScriptSetInteger('AirMinesNum', cAirMines); -ScriptSetInteger('Explosives', cExplosives); -ScriptSetInteger('Delay', cInactDelay); -ScriptSetInteger('Ready', cReadyDelay); -ScriptSetInteger('SuddenDeathTurns', cSuddenDTurns); -ScriptSetInteger('WaterRise', cWaterRise); -ScriptSetInteger('HealthDecrease', cHealthDecrease); -ScriptSetInteger('GetAwayTime', cGetAwayTime); -ScriptSetString('Map', cMapName); -ScriptSetString('Theme', Theme); -ScriptSetString('Goals', ''); - -ScriptCall('onGameInit'); - -// pop game variables -ParseCommand('seed ' + ScriptGetString('Seed'), true, true); -cTemplateFilter := ScriptGetInteger('TemplateFilter'); -LuaTemplateNumber:= ScriptGetInteger('TemplateNumber'); -cMapGen := TMapGen(ScriptGetInteger('MapGen')); -cFeatureSize := ScriptGetInteger('MapFeatureSize'); -GameFlags := ScriptGetInteger('GameFlags'); -WorldEdge := TWorldEdge(ScriptGetInteger('WorldEdge')); -cHedgehogTurnTime:= ScriptGetInteger('TurnTime'); -cCaseFactor := ScriptGetInteger('CaseFreq'); -cHealthCaseProb := ScriptGetInteger('HealthCaseProb'); -cHealthCaseAmount:= ScriptGetInteger('HealthCaseAmount'); -cDamagePercent := ScriptGetInteger('DamagePercent'); -cRopePercent := ScriptGetInteger('RopePercent'); -cLandMines := ScriptGetInteger('MinesNum'); -cMinesTime := ScriptGetInteger('MinesTime'); -cMineDudPercent := ScriptGetInteger('MineDudPercent'); -cAirMines := ScriptGetInteger('AirMinesNum'); -cExplosives := ScriptGetInteger('Explosives'); -cInactDelay := ScriptGetInteger('Delay'); -cReadyDelay := ScriptGetInteger('Ready'); -cSuddenDTurns := ScriptGetInteger('SuddenDeathTurns'); -cWaterRise := ScriptGetInteger('WaterRise'); -cHealthDecrease := ScriptGetInteger('HealthDecrease'); -cGetAwayTime := ScriptGetInteger('GetAwayTime'); - -if cMapName <> ScriptGetString('Map') then - ParseCommand('map ' + ScriptGetString('Map'), true, true); -if ScriptGetString('Theme') <> '' then - ParseCommand('theme ' + ScriptGetString('Theme'), true, true); -LuaGoals:= ScriptGetString('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; -if (GameFlags and gfSharedAmmo) <> 0 then - for i:= 0 to Pred(ClansCount) do - for j:= 0 to Pred(ClansArray[i]^.TeamsNumber) do - for k:= 0 to Pred(ClansArray[i]^.Teams[j]^.HedgehogsNumber) do - ClansArray[i]^.Teams[j]^.Hedgehogs[k].AmmoStore:= i -else if (GameFlags and gfPerHogAmmo) <> 0 then - for i:= 0 to Pred(TeamsCount) do - for j:= 0 to Pred(TeamsArray[i]^.HedgehogsNumber) do - begin - TeamsArray[i]^.Hedgehogs[j].AmmoStore:= k; - if StoreCnt-1 < k then AddAmmoStore; - inc(k) - end -else - for i:= 0 to Pred(TeamsCount) do - begin - for j:= 0 to Pred(TeamsArray[i]^.HedgehogsNumber) do - TeamsArray[i]^.Hedgehogs[j].AmmoStore:= k; - if StoreCnt-1 < k then AddAmmoStore; - inc(k) - end; -if ScriptExists('onAmmoStoreInit') or ScriptExists('onNewAmmoStore') then - begin - // reset ammostore (quite unclean, but works?) - uAmmos.freeModule; - uAmmos.initModule; - if ScriptExists('onAmmoStoreInit') then - begin - ScriptPrepareAmmoStore; - ScriptCall('onAmmoStoreInit'); - SetAmmoLoadout(ScriptAmmoLoadout); - SetAmmoProbability(ScriptAmmoProbability); - SetAmmoDelay(ScriptAmmoDelay); - SetAmmoReinforcement(ScriptAmmoReinforcement) - end; - ScriptApplyAmmoStore - end; - -ScriptSetInteger('ClansCount', ClansCount); -ScriptSetInteger('TeamsCount', TeamsCount); -mapDims:= false -end; - - -// Update values of screen dimensions and allow script to react to resolution change -procedure ScriptOnScreenResize(); -begin -ScriptSetInteger('ScreenHeight', cScreenHeight); -ScriptSetInteger('ScreenWidth', cScreenWidth); -ScriptCall('onScreenResize'); -end; - -// custom script loader via physfs, passed to lua_load -const BUFSIZE = 1024; - -procedure ScriptLoad(name : shortstring); -var ret : LongInt; - s : shortstring; - f : PFSFile; - buf : array[0..Pred(BUFSIZE)] of byte; -//lua_buf : luaL_Buffer; -begin -s:= cPathz[ptData] + name; -if not pfsExists(s) then - begin - AddFileLog('[LUA] Script not found: ' + name); - exit; - end; - -f:= pfsOpenRead(s); -if f = nil then - exit; - -physfsReaderSetBuffer(@buf); -ret:= lua_load(luaState, @physfsReader, f, Str2PChar(s)); -pfsClose(f); - -if ret <> 0 then - begin - LuaError('Failed to load ' + name + '(error ' + IntToStr(ret) + ')'); - LuaError(lua_tostring(luaState, -1)); - end -else - begin - WriteLnToConsole('Lua: ' + name + ' loaded'); - // dump and hash all functions currently known by lua - // use hash to salt map hash -// init buffer -//luaL_buffinit(luaState, @lua_buf); -//lua_dump(luaState, @lua_dump_digester, @lua_buf); -// cleanup buffer -//luaL_pushresult(@lua_buf); - // -- - // could first read the file, then hash it, then use load_string - // call the script file - 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('GameTime', GameTicks); -ScriptSetInteger('TotalRounds', TotalRounds); -ScriptSetInteger('WaterLine', cWaterLine); -if isCursorVisible and (not bShowAmmoMenu) then - begin - if (prevCursorPoint.X <> CursorPoint.X) or - (prevCursorPoint.Y <> CursorPoint.Y) then - begin - ScriptSetInteger('CursorX', CursorPoint.X - WorldDx); - ScriptSetInteger('CursorY', cScreenHeight - CursorPoint.Y- WorldDy); - prevCursorPoint.X:= CursorPoint.X; - prevCursorPoint.Y:= CursorPoint.Y; - end - end -else - begin - ScriptSetInteger('CursorX', NoPointX); - ScriptSetInteger('CursorY', NoPointX); - prevCursorPoint.X:= NoPointX; - prevCursorPoint.Y:= NoPointX - end; - -if not mapDims then - begin - mapDims:= true; - ScriptSetInteger('LAND_WIDTH', LAND_WIDTH); - ScriptSetInteger('LAND_HEIGHT', LAND_HEIGHT); - ScriptSetInteger('LeftX', leftX); - ScriptSetInteger('RightX', rightX); - ScriptSetInteger('TopY', topY) - end; -if (CurrentHedgehog <> nil) and (CurrentHedgehog^.Gear <> nil) then - ScriptSetInteger('CurrentHedgehog', CurrentHedgehog^.Gear^.UID) -else - ScriptSetNil('CurrentHedgehog'); -end; - -procedure GetGlobals; -begin -// TODO -// Use setters instead, because globals should be read-only! -// Otherwise globals might be changed by Lua, but then unexpectatly overwritten by engine when a ScriptCall is triggered by whatever Lua is doing! -// Sure, one could work around that in engine (e.g. by setting writable globals in SetGlobals only when their engine-side value has actually changed since SetGlobals was called the last time...), but things just get messier and messier then. -// It is inconsistent anyway to have some globals be read-only and others not with no indication whatsoever. -// -- sheepluva -TurnTimeLeft:= ScriptGetInteger('TurnTimeLeft'); -end; - -procedure ScriptCall(fname : shortstring); -begin -if (not ScriptLoaded) or (not ScriptExists(fname)) then - exit; -SetGlobals; -lua_getglobal(luaState, Str2PChar(fname)); -if lua_pcall(luaState, 0, 0, 0) <> 0 then - begin - LuaError('Error while calling ' + fname + ': ' + lua_tostring(luaState, -1)); - lua_pop(luaState, 1) - end; -GetGlobals; -end; - -(* -function ParseCommandOverride(key, value : shortstring) : shortstring; -begin -ParseCommandOverride:= value; -if not ScriptExists('ParseCommandOverride') then - exit; -lua_getglobal(luaState, Str2PChar('ParseCommandOverride')); -lua_pushstring(luaState, Str2PChar(key)); -lua_pushstring(luaState, Str2PChar(value)); -if lua_pcall(luaState, 2, 1, 0) <> 0 then - begin - LuaError('Lua: Error while calling ParseCommandOverride: ' + lua_tostring(luaState, -1)); - lua_pop(luaState, 1) - end -else - begin - ParseCommandOverride:= lua_tostring(luaState, -1); - lua_pop(luaState, 1) - end; -end; -*) - -function ScriptCall(fname : shortstring; par1: LongInt) : LongInt; -begin -ScriptCall:= ScriptCall(fname, par1, 0, 0, 0) -end; - -function ScriptCall(fname : shortstring; par1, par2: LongInt) : LongInt; -begin -ScriptCall:= ScriptCall(fname, par1, par2, 0, 0) -end; - -function ScriptCall(fname : shortstring; par1, par2, par3: LongInt) : LongInt; -begin -ScriptCall:= ScriptCall(fname, par1, par2, par3, 0) -end; - -function ScriptCall(fname : shortstring; par1, par2, par3, par4 : LongInt) : LongInt; -begin -if (not ScriptLoaded) or (not ScriptExists(fname)) then - exit(0); -SetGlobals; -lua_getglobal(luaState, Str2PChar(fname)); -lua_pushinteger(luaState, par1); -lua_pushinteger(luaState, par2); -lua_pushinteger(luaState, par3); -lua_pushinteger(luaState, par4); -ScriptCall:= 0; -if lua_pcall(luaState, 4, 1, 0) <> 0 then - begin - LuaError('Error while calling ' + fname + ': ' + lua_tostring(luaState, -1)); - lua_pop(luaState, 1) - end -else - begin - ScriptCall:= lua_tointeger(luaState, -1); - lua_pop(luaState, 1) - end; -GetGlobals; -end; - -function ScriptExists(fname : shortstring) : boolean; -begin -if not ScriptLoaded then - begin - ScriptExists:= false; - exit - end; -lua_getglobal(luaState, Str2PChar(fname)); -ScriptExists:= not lua_isnoneornil(luaState, -1); -lua_pop(luaState, 1) -end; - -procedure ScriptPrepareAmmoStore; -var i: ShortInt; -begin -ScriptAmmoLoadout:= ''; -ScriptAmmoDelay:= ''; -ScriptAmmoProbability:= ''; -ScriptAmmoReinforcement:= ''; -for i:=1 to ord(High(TAmmoType)) do - begin - ScriptAmmoLoadout:= ScriptAmmoLoadout + '0'; - ScriptAmmoProbability:= ScriptAmmoProbability + '0'; - ScriptAmmoDelay:= ScriptAmmoDelay + '0'; - ScriptAmmoReinforcement:= ScriptAmmoReinforcement + '0'; - end; -end; - -procedure ScriptSetAmmo(ammo : TAmmoType; count, probability, delay, reinforcement: Byte); -begin -//if (ord(ammo) < 1) or (count > 9) or (count < 0) or (probability < 0) or (probability > 8) or (delay < 0) or (delay > 9) or (reinforcement < 0) or (reinforcement > 8) then -if (ord(ammo) < 1) or (count > 9) or (probability > 8) or (delay > 9) or (reinforcement > 8) then - exit; -ScriptAmmoLoadout[ord(ammo)]:= inttostr(count)[1]; -ScriptAmmoProbability[ord(ammo)]:= inttostr(probability)[1]; -ScriptSetAmmoDelay(ammo, delay); -ScriptAmmoReinforcement[ord(ammo)]:= inttostr(reinforcement)[1]; -end; - -procedure ScriptSetAmmoDelay(ammo : TAmmoType; delay: Byte); -begin -// change loadout string if ammo store has not been initialized yet -if (StoreCnt = 0) then -begin - if (delay <= 9) then - ScriptAmmoDelay[ord(ammo)]:= inttostr(delay)[1]; -end -// change 'live' delay values -else if (CurrentTeam <> nil) then - ammoz[ammo].SkipTurns:= CurrentTeam^.Clan^.TurnNumber + delay; -end; - -procedure ScriptApplyAmmoStore; -var i, j, k : LongInt; -begin -if (GameFlags and gfSharedAmmo) <> 0 then - for i:= 0 to Pred(ClansCount) do - begin - if ScriptExists('onNewAmmoStore') then - begin - ScriptPrepareAmmoStore; - ScriptCall('onNewAmmoStore',i,-1); - SetAmmoLoadout(ScriptAmmoLoadout); - SetAmmoProbability(ScriptAmmoProbability); - SetAmmoDelay(ScriptAmmoDelay); - SetAmmoReinforcement(ScriptAmmoReinforcement) - end; - AddAmmoStore; - for j:= 0 to Pred(ClansArray[i]^.TeamsNumber) do - for k:= 0 to Pred(ClansArray[i]^.Teams[j]^.HedgehogsNumber) do - ClansArray[i]^.Teams[j]^.Hedgehogs[k].AmmoStore:= StoreCnt - 1 - end -else if (GameFlags and gfPerHogAmmo) <> 0 then - for i:= 0 to Pred(TeamsCount) do - for j:= 0 to Pred(TeamsArray[i]^.HedgehogsNumber) do - begin - if ScriptExists('onNewAmmoStore') then - begin - ScriptPrepareAmmoStore; - ScriptCall('onNewAmmoStore',i,j); - SetAmmoLoadout(ScriptAmmoLoadout); - SetAmmoProbability(ScriptAmmoProbability); - SetAmmoDelay(ScriptAmmoDelay); - SetAmmoReinforcement(ScriptAmmoReinforcement) - end; - AddAmmoStore; - TeamsArray[i]^.Hedgehogs[j].AmmoStore:= StoreCnt - 1 - end -else - for i:= 0 to Pred(TeamsCount) do - begin - if ScriptExists('onNewAmmoStore') then - begin - ScriptPrepareAmmoStore; - ScriptCall('onNewAmmoStore',i,-1); - SetAmmoLoadout(ScriptAmmoLoadout); - SetAmmoProbability(ScriptAmmoProbability); - SetAmmoDelay(ScriptAmmoDelay); - SetAmmoReinforcement(ScriptAmmoReinforcement) - end; - AddAmmoStore; - for j:= 0 to Pred(TeamsArray[i]^.HedgehogsNumber) do - TeamsArray[i]^.Hedgehogs[j].AmmoStore:= StoreCnt - 1 - end -end; - -procedure initModule; -var at : TGearType; - vgt: TVisualGearType; - am : TAmmoType; - si : TStatInfoType; - st : TSound; - he : THogEffect; - cg : TCapGroup; - spr: TSprite; - mg : TMapGen; - we : TWorldEdge; -begin -// initialize lua -luaState:= lua_open; -if checkFails(luaState <> nil, 'lua_open failed', true) then exit; - -// open internal libraries -luaopen_base(luaState); -luaopen_string(luaState); -luaopen_math(luaState); -luaopen_table(luaState); - -// import some variables -ScriptSetString(_S'L', cLocale); - -// import game flags -ScriptSetInteger('gfForts', gfForts); -ScriptSetInteger('gfMultiWeapon', gfMultiWeapon); -ScriptSetInteger('gfSolidLand', gfSolidLand); -ScriptSetInteger('gfBorder', gfBorder); -ScriptSetInteger('gfBottomBorder', gfBottomBorder); -ScriptSetInteger('gfDivideTeams', gfDivideTeams); -ScriptSetInteger('gfLowGravity', gfLowGravity); -ScriptSetInteger('gfLaserSight', gfLaserSight); -ScriptSetInteger('gfInvulnerable', gfInvulnerable); -ScriptSetInteger('gfResetHealth', gfResetHealth); -ScriptSetInteger('gfVampiric', gfVampiric); -ScriptSetInteger('gfKarma', gfKarma); -ScriptSetInteger('gfArtillery', gfArtillery); -ScriptSetInteger('gfOneClanMode', gfOneClanMode); -ScriptSetInteger('gfRandomOrder', gfRandomOrder); -ScriptSetInteger('gfKing', gfKing); -ScriptSetInteger('gfPlaceHog', gfPlaceHog); -ScriptSetInteger('gfSharedAmmo', gfSharedAmmo); -ScriptSetInteger('gfDisableGirders', gfDisableGirders); -ScriptSetInteger('gfDisableLandObjects', gfDisableLandObjects); -ScriptSetInteger('gfAISurvival', gfAISurvival); -ScriptSetInteger('gfInfAttack', gfInfAttack); -ScriptSetInteger('gfResetWeps', gfResetWeps); -ScriptSetInteger('gfPerHogAmmo', gfPerHogAmmo); -ScriptSetInteger('gfDisableWind', gfDisableWind); -ScriptSetInteger('gfMoreWind', gfMoreWind); -ScriptSetInteger('gfTagTeam', gfTagTeam); -ScriptSetInteger('gfShoppaBorder', gfShoppaBorder); - -ScriptSetInteger('gmLeft', gmLeft); -ScriptSetInteger('gmRight', gmRight); -ScriptSetInteger('gmUp', gmUp); -ScriptSetInteger('gmDown', gmDown); -ScriptSetInteger('gmSwitch', gmSwitch); -ScriptSetInteger('gmAttack', gmAttack); -ScriptSetInteger('gmLJump', gmLJump); -ScriptSetInteger('gmHJump', gmHJump); -ScriptSetInteger('gmDestroy', gmDestroy); -ScriptSetInteger('gmSlot', gmSlot); -ScriptSetInteger('gmWeapon', gmWeapon); -ScriptSetInteger('gmTimer', gmTimer); -ScriptSetInteger('gmAnimate', gmAnimate); -ScriptSetInteger('gmPrecise', gmPrecise); -ScriptSetInteger('gmAllStoppable', gmAllStoppable); - -// speech bubbles -ScriptSetInteger('SAY_SAY', 1); -ScriptSetInteger('SAY_THINK', 2); -ScriptSetInteger('SAY_SHOUT', 3); - -// register gear types -for at:= Low(TGearType) to High(TGearType) do - ScriptSetInteger(EnumToStr(at), ord(at)); - -for vgt:= Low(TVisualGearType) to High(TVisualGearType) do - ScriptSetInteger(EnumToStr(vgt), ord(vgt)); - -// register sounds -for st:= Low(TSound) to High(TSound) do - ScriptSetInteger(EnumToStr(st), ord(st)); - -// register ammo types -for am:= Low(TAmmoType) to High(TAmmoType) do - ScriptSetInteger(EnumToStr(am), ord(am)); - -for si:= Low(TStatInfoType) to High(TStatInfoType) do - ScriptSetInteger(EnumToStr(si), ord(si)); - -for he:= Low(THogEffect) to High(THogEffect) do - ScriptSetInteger(EnumToStr(he), ord(he)); - -for cg:= Low(TCapGroup) to High(TCapGroup) do - ScriptSetInteger(EnumToStr(cg), ord(cg)); - -for spr:= Low(TSprite) to High(TSprite) do - ScriptSetInteger(EnumToStr(spr), ord(spr)); - -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); -ScriptSetInteger('gstAttacked' , gstAttacked); -ScriptSetInteger('gstAttacking' , gstAttacking); -ScriptSetInteger('gstCollision' , gstCollision); -ScriptSetInteger('gstChooseTarget' , gstChooseTarget); -ScriptSetInteger('gstHHJumping' , gstHHJumping); -ScriptSetInteger('gsttmpFlag' , gsttmpFlag); -ScriptSetInteger('gstHHThinking' , gstHHThinking); -ScriptSetInteger('gstNoDamage' , gstNoDamage); -ScriptSetInteger('gstHHHJump' , gstHHHJump); -ScriptSetInteger('gstAnimation' , gstAnimation); -ScriptSetInteger('gstHHDeath' , gstHHDeath); -ScriptSetInteger('gstWinner' , gstWinner); -ScriptSetInteger('gstWait' , gstWait); -ScriptSetInteger('gstNotKickable' , gstNotKickable); -ScriptSetInteger('gstLoser' , gstLoser); -ScriptSetInteger('gstHHGone' , gstHHGone); -ScriptSetInteger('gstInvisible' , gstInvisible); -ScriptSetInteger('gstSubmersible' , gstSubmersible); -ScriptSetInteger('gstFrozen' , gstFrozen); -ScriptSetInteger('gstNoGravity' , gstNoGravity); - -// ai hints -ScriptSetInteger('aihUsualProcessing', aihUsualProcessing); -ScriptSetInteger('aihDoesntMatter' , aihDoesntMatter); - -// land flags -ScriptSetInteger('lfIndestructible', lfIndestructible); -ScriptSetInteger('lfIce' , lfIce); -ScriptSetInteger('lfBouncy' , lfBouncy); - -// register functions -lua_register(luaState, _P'HideHog', @lc_hidehog); -lua_register(luaState, _P'RestoreHog', @lc_restorehog); -lua_register(luaState, _P'SaveCampaignVar', @lc_savecampaignvar); -lua_register(luaState, _P'GetCampaignVar', @lc_getcampaignvar); -lua_register(luaState, _P'band', @lc_band); -lua_register(luaState, _P'bor', @lc_bor); -lua_register(luaState, _P'bnot', @lc_bnot); -lua_register(luaState, _P'div', @lc_div); -lua_register(luaState, _P'GetInputMask', @lc_getinputmask); -lua_register(luaState, _P'SetInputMask', @lc_setinputmask); -lua_register(luaState, _P'AddGear', @lc_addgear); -lua_register(luaState, _P'DismissTeam', @lc_dismissteam); -lua_register(luaState, _P'EnableGameFlags', @lc_enablegameflags); -lua_register(luaState, _P'DisableGameFlags', @lc_disablegameflags); -lua_register(luaState, _P'ClearGameFlags', @lc_cleargameflags); -lua_register(luaState, _P'GetGameFlag', @lc_getgameflag); -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); -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); -lua_register(luaState, _P'SpawnFakeHealthCrate', @lc_spawnfakehealthcrate); -lua_register(luaState, _P'SpawnFakeAmmoCrate', @lc_spawnfakeammocrate); -lua_register(luaState, _P'SpawnFakeUtilityCrate', @lc_spawnfakeutilitycrate); -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'SendStat', @lc_sendstat); -lua_register(luaState, _P'SendHealthStatsOff', @lc_sendhealthstatsoff); -lua_register(luaState, _P'FindPlace', @lc_findplace); -lua_register(luaState, _P'SetGearPosition', @lc_setgearposition); -lua_register(luaState, _P'GetGearPosition', @lc_getgearposition); -lua_register(luaState, _P'SetGearTarget', @lc_setgeartarget); -lua_register(luaState, _P'GetGearTarget', @lc_getgeartarget); -lua_register(luaState, _P'SetGearVelocity', @lc_setgearvelocity); -lua_register(luaState, _P'GetGearVelocity', @lc_getgearvelocity); -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); -lua_register(luaState, _P'AddAmmo', @lc_addammo); -lua_register(luaState, _P'GetAmmoCount', @lc_getammocount); -lua_register(luaState, _P'SetHealth', @lc_sethealth); -lua_register(luaState, _P'GetHealth', @lc_gethealth); -lua_register(luaState, _P'SetEffect', @lc_seteffect); -lua_register(luaState, _P'GetEffect', @lc_geteffect); -lua_register(luaState, _P'GetHogClan', @lc_gethogclan); -lua_register(luaState, _P'GetClanColor', @lc_getclancolor); -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); -lua_register(luaState, _P'SetHogName', @lc_sethogname); -lua_register(luaState, _P'GetHogLevel', @lc_gethoglevel); -lua_register(luaState, _P'SetHogLevel', @lc_sethoglevel); -lua_register(luaState, _P'GetX', @lc_getx); -lua_register(luaState, _P'GetY', @lc_gety); -lua_register(luaState, _P'CopyPV', @lc_copypv); -lua_register(luaState, _P'FollowGear', @lc_followgear); -lua_register(luaState, _P'GetFollowGear', @lc_getfollowgear); -lua_register(luaState, _P'SetState', @lc_setstate); -lua_register(luaState, _P'GetState', @lc_getstate); -lua_register(luaState, _P'GetTag', @lc_gettag); -lua_register(luaState, _P'SetTag', @lc_settag); -lua_register(luaState, _P'SetTimer', @lc_settimer); -lua_register(luaState, _P'GetTimer', @lc_gettimer); -lua_register(luaState, _P'SetFlightTime', @lc_setflighttime); -lua_register(luaState, _P'GetFlightTime', @lc_getflighttime); -lua_register(luaState, _P'SetZoom', @lc_setzoom); -lua_register(luaState, _P'GetZoom', @lc_getzoom); -lua_register(luaState, _P'HogSay', @lc_hogsay); -lua_register(luaState, _P'SwitchHog', @lc_switchhog); -lua_register(luaState, _P'HogTurnLeft', @lc_hogturnleft); -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); -lua_register(luaState, _P'GetGearPos', @lc_getgearpos); -lua_register(luaState, _P'SetGearPos', @lc_setgearpos); -lua_register(luaState, _P'GetGearCollisionMask', @lc_getgearcollisionmask); -lua_register(luaState, _P'SetGearCollisionMask', @lc_setgearcollisionmask); -lua_register(luaState, _P'GetRandom', @lc_getrandom); -lua_register(luaState, _P'SetWind', @lc_setwind); -lua_register(luaState, _P'MapHasBorder', @lc_maphasborder); -lua_register(luaState, _P'GetHogHat', @lc_gethoghat); -lua_register(luaState, _P'SetHogHat', @lc_sethoghat); -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); -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'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); - -lua_register(luaState, _P'SetGearAIHints', @lc_setgearaihints); -lua_register(luaState, _P'HedgewarsScriptLoad', @lc_hedgewarsscriptload); -lua_register(luaState, _P'DeclareAchievement', @lc_declareachievement); -lua_register(luaState, _P'StartGhostPoints', @lc_startghostpoints); -lua_register(luaState, _P'DumpPoint', @lc_dumppoint); - -ScriptSetInteger('TEST_SUCCESSFUL' , HaltTestSuccess); -ScriptSetInteger('TEST_FAILED' , HaltTestFailed); -lua_register(luaState, _P'EndLuaTest', @lc_endluatest); - -ScriptClearStack; // just to be sure stack is empty -ScriptLoaded:= false; -end; - -procedure freeModule; -begin -lua_close(luaState); -end; - -{$ELSE} -procedure ScriptPrintStack; -begin -end; - -procedure ScriptClearStack; -begin -end; - -procedure ScriptLoad(name : shortstring); -begin - name:= name; // avoid hint -end; - -procedure ScriptOnGameInit; -begin -end; - -procedure ScriptCall(fname : shortstring); -begin - fname:= fname; // avoid hint -end; - -function ScriptCall(fname : shortstring; par1, par2, par3, par4 : LongInt) : LongInt; -begin - // avoid hints - fname:= fname; - par1:= par1; - par2:= par2; - par3:= par3; - par4:= par4; - ScriptCall:= 0 -end; - -function ScriptCall(fname : shortstring; par1: LongInt) : LongInt; -begin - // avoid hints - fname:= fname; - par1:= par1; - ScriptCall:= 0 -end; - -function ScriptCall(fname : shortstring; par1, par2: LongInt) : LongInt; -begin - // avoid hints - fname:= fname; - par1:= par1; - par2:= par2; - ScriptCall:= 0 -end; - -function ScriptCall(fname : shortstring; par1, par2, par3: LongInt) : LongInt; -begin - // avoid hints - fname:= fname; - par1:= par1; - par2:= par2; - par3:= par3; - ScriptCall:= 0 -end; - -function ScriptExists(fname : shortstring) : boolean; -begin - fname:= fname; // avoid hint - ScriptExists:= false -end; -(* -function ParseCommandOverride(key, value : shortstring) : shortstring; -begin - // avoid hints - key:= key; - value:= value; - ParseCommandOverride:= '' -end; -*) - -procedure ScriptOnScreenResize; -begin -end; - -procedure ScriptOnPreviewInit; -begin -end; - -procedure ScriptSetInteger(name : shortstring; value : LongInt); -begin -end; - -procedure ScriptSetString(name : shortstring; value : shortstring); -begin -end; - -procedure LuaParseString(s : ShortString); -begin -end; - -procedure initModule; -begin -mapDims:= false; -PointsBuffer:= ''; -prevCursorPoint.X:= NoPointX; -prevCursorPoint.Y:= 0; -end; - -procedure freeModule; -begin -end; - -{$ENDIF} -end.