mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@1871 3b4a5df2-a311-0410-b5c6-a8a6f20db521
200 lines
5.3 KiB
C++
200 lines
5.3 KiB
C++
#include "Lua Interpreter.h"
|
|
#include "lwstring.h"
|
|
|
|
#include "Overhead.h"
|
|
#include "Isometric Utils.h"
|
|
#include "soldier tile.h"
|
|
#include "Soldier Profile.h"
|
|
#include "Soldier Functions.h"
|
|
#include "ai.h"
|
|
|
|
#define SOLDIER_CLASS "ja2_SoldierClass"
|
|
|
|
static int LuaGetSoldierName( lua_State *L )
|
|
{
|
|
SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) lua_touserdata( L, 1 );
|
|
SOLDIERTYPE *pSoldier = *ppSoldier;
|
|
if (!pSoldier)
|
|
{
|
|
lua_pushnil( L );
|
|
}
|
|
else
|
|
{
|
|
luaWS_newstr( L, pSoldier->name);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
static int LuaGetSoldierFullName( lua_State *L )
|
|
{
|
|
SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) lua_touserdata( L, 1 );
|
|
SOLDIERTYPE *pSoldier = *ppSoldier;
|
|
if (!pSoldier)
|
|
{
|
|
lua_pushnil( L );
|
|
}
|
|
else
|
|
{
|
|
if (pSoldier->ubProfile < NUM_PROFILES)
|
|
{
|
|
luaWS_newstr( L, gMercProfiles[pSoldier->ubProfile].zName );
|
|
}
|
|
else
|
|
{
|
|
return LuaGetSoldierName( L);
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
static int LuaGetSoldierGrid( lua_State *L )
|
|
{
|
|
SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) lua_touserdata( L, 1 );
|
|
SOLDIERTYPE *pSoldier = *ppSoldier;
|
|
if (!pSoldier)
|
|
{
|
|
lua_pushnil( L );
|
|
}
|
|
else
|
|
{
|
|
lua_pushinteger( L, pSoldier->sGridNo);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
static int LuaSetSoldierGrid( lua_State *L )
|
|
{
|
|
SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) lua_touserdata( L, 1 );
|
|
SOLDIERTYPE *pSoldier = *ppSoldier;
|
|
int newgrid = luaL_checkinteger( L, 3);
|
|
luaL_argcheck( L, newgrid > 0 && newgrid <= NOWHERE, 2, "The grid number must be on map" );
|
|
TeleportSoldier( pSoldier, (INT16) newgrid, TRUE);
|
|
return 0;
|
|
}
|
|
|
|
static int LuaGetSoldierLevel( lua_State *L )
|
|
{
|
|
SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) lua_touserdata( L, 1 );
|
|
SOLDIERTYPE *pSoldier = *ppSoldier;
|
|
if (!pSoldier)
|
|
{
|
|
lua_pushnil( L );
|
|
}
|
|
else
|
|
{
|
|
lua_pushinteger( L, pSoldier->pathing.bLevel);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
static int LuaSetSoldierLevel( lua_State *L )
|
|
{
|
|
SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) lua_touserdata( L, 1 );
|
|
SOLDIERTYPE *pSoldier = *ppSoldier;
|
|
int newlevel = luaL_checkinteger( L, 3);
|
|
luaL_argcheck( L, newlevel >= 0 && newlevel <= 1, 2, "The level must be 1 or 0" );
|
|
HandlePlacingRoofMarker( pSoldier, pSoldier->sGridNo, (BOOLEAN) newlevel, TRUE );
|
|
pSoldier->SetSoldierHeight((FLOAT)50*newlevel );
|
|
HandlePlacingRoofMarker( pSoldier, pSoldier->sGridNo, (BOOLEAN) newlevel, TRUE );
|
|
return 0;
|
|
}
|
|
|
|
static int LuaGetSoldierAPs( lua_State *L )
|
|
{
|
|
SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) lua_touserdata( L, 1 );
|
|
SOLDIERTYPE *pSoldier = *ppSoldier;
|
|
if (!pSoldier)
|
|
{
|
|
lua_pushnil( L );
|
|
}
|
|
else
|
|
{
|
|
lua_pushinteger( L, pSoldier->bActionPoints);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
static int LuaSetSoldierAPs( lua_State *L )
|
|
{
|
|
SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) lua_touserdata( L, 1 );
|
|
SOLDIERTYPE *pSoldier = *ppSoldier;
|
|
int newaps = luaL_checkinteger( L, 3);
|
|
luaL_argcheck( L, newaps > 0 && newaps < 256, 2, "The grid number must be on screen!" );
|
|
pSoldier->bActionPoints = (INT8) newaps;
|
|
return 0;
|
|
}
|
|
|
|
static int LuaSoldierWalkTo( lua_State *L )
|
|
{
|
|
SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) luaL_checkudata( L, 1, SOLDIER_CLASS );
|
|
SOLDIERTYPE *pSoldier = *ppSoldier;
|
|
int newgrid = luaL_checkinteger( L, 2);
|
|
luaL_argcheck( L, newgrid > 0 && newgrid <= NOWHERE, 2, "The grid number must be on screen!" );
|
|
pSoldier->aiData.bAction = AI_ACTION_WALK;
|
|
pSoldier->aiData.usActionData = (INT16) newgrid;
|
|
pSoldier->pathing.bPathStored = FALSE;
|
|
pSoldier->aiData.bActionInProgress = ExecuteAction( pSoldier);
|
|
return 0;
|
|
}
|
|
|
|
static int LuaSoldierRunTo( lua_State *L )
|
|
{
|
|
SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) luaL_checkudata( L, 1, SOLDIER_CLASS );
|
|
SOLDIERTYPE *pSoldier = *ppSoldier;
|
|
int newgrid = luaL_checkinteger( L, 2);
|
|
luaL_argcheck( L, newgrid > 0 && newgrid <= NOWHERE, 2, "The grid number must be on screen!" );
|
|
pSoldier->aiData.bAction = AI_ACTION_RUN;
|
|
pSoldier->aiData.usActionData = (INT16) newgrid;
|
|
pSoldier->pathing.bPathStored = FALSE;
|
|
pSoldier->aiData.bActionInProgress = ExecuteAction( pSoldier);
|
|
return 0;
|
|
}
|
|
|
|
static int LuaSoldierChangeStance( lua_State *L )
|
|
{
|
|
SOLDIERTYPE **ppSoldier = (SOLDIERTYPE**) luaL_checkudata( L, 1, SOLDIER_CLASS );
|
|
SOLDIERTYPE *pSoldier = *ppSoldier;
|
|
int newstance = luaL_checkinteger( L, 2);
|
|
pSoldier->ChangeSoldierStance( (UINT8) newstance);
|
|
return 0;
|
|
}
|
|
|
|
static LuaAttrib Soldier[] = {
|
|
{ "name", LuaGetSoldierName, },
|
|
{ "fullname", LuaGetSoldierFullName, },
|
|
{ "grid", LuaGetSoldierGrid, LuaSetSoldierGrid },
|
|
{ "level", LuaGetSoldierLevel, LuaSetSoldierLevel },
|
|
{ "APs", LuaGetSoldierAPs, LuaSetSoldierAPs },
|
|
{ "walkto", NULL, NULL, LuaSoldierWalkTo },
|
|
{ "runto", NULL, NULL, LuaSoldierRunTo },
|
|
{ "changestance", NULL, NULL, LuaSoldierChangeStance },
|
|
{ NULL, },
|
|
};
|
|
|
|
|
|
void LuaTacticalSetup(lua_State *L)
|
|
{
|
|
// Create a soldier type
|
|
CreateLuaClass( L, SOLDIER_CLASS, Soldier );
|
|
lua_setglobal( L, SOLDIER_CLASS); // We also want this class to be known to the script
|
|
|
|
// Create a soldier list type and create its object
|
|
lua_createtable (L, 256, 0);
|
|
for (int sold=0; sold < 256; sold++)
|
|
{
|
|
lua_pushinteger( L, sold);
|
|
if (MercPtrs[ sold ] )
|
|
{
|
|
NewLuaObject( L, SOLDIER_CLASS, MercPtrs[ sold ] );
|
|
}
|
|
else
|
|
{
|
|
lua_pushnil( L );
|
|
}
|
|
lua_settable( L, -3);
|
|
}
|
|
|
|
// Give this new object a name
|
|
lua_setglobal( L, "Soldiers" );
|
|
}
|