From b53e5867e1d98f3d4cc8c92b04c3e3cc005b6bb5 Mon Sep 17 00:00:00 2001 From: rt Date: Sun, 3 Mar 2013 21:52:42 +0100 Subject: [PATCH] LuaSynced: add Spring.GetProjectileTarget(number projectileID) --> number targetID, string targetType --- rts/Lua/LuaSyncedCtrl.cpp | 10 ++--- rts/Lua/LuaSyncedRead.cpp | 85 ++++++++++++++++++++++++++------------- rts/Lua/LuaSyncedRead.h | 1 + 3 files changed, 62 insertions(+), 34 deletions(-) diff --git a/rts/Lua/LuaSyncedCtrl.cpp b/rts/Lua/LuaSyncedCtrl.cpp index 4e2382f4d96..1fd632798e9 100644 --- a/rts/Lua/LuaSyncedCtrl.cpp +++ b/rts/Lua/LuaSyncedCtrl.cpp @@ -2741,7 +2741,7 @@ int LuaSyncedCtrl::SetProjectileSpinAngle(lua_State* L) return 0; } - CPieceProjectile* pproj = dynamic_cast(proj); + CPieceProjectile* pproj = static_cast(proj); pproj->spinAngle = luaL_optfloat(L, 2, 0.0f); return 0; } @@ -2753,7 +2753,7 @@ int LuaSyncedCtrl::SetProjectileSpinSpeed(lua_State* L) return 0; } - CPieceProjectile* pproj = dynamic_cast(proj); + CPieceProjectile* pproj = static_cast(proj); pproj->spinSpeed = luaL_optfloat(L, 2, 0.0f); return 0; } @@ -2765,7 +2765,7 @@ int LuaSyncedCtrl::SetProjectileSpinVec(lua_State* L) return 0; } - CPieceProjectile* pproj = dynamic_cast(proj); + CPieceProjectile* pproj = static_cast(proj); pproj->spinVec.x = luaL_optfloat(L, 2, 0.0f); pproj->spinVec.y = luaL_optfloat(L, 3, 0.0f); pproj->spinVec.z = luaL_optfloat(L, 4, 0.0f); @@ -2783,13 +2783,13 @@ int LuaSyncedCtrl::SetProjectileCEG(lua_State* L) assert(proj->weapon || proj->piece); if (proj->weapon) { - CWeaponProjectile* wproj = dynamic_cast(proj); + CWeaponProjectile* wproj = static_cast(proj); if (wproj != NULL) { wproj->cegID = gCEG->Load(explGenHandler, luaL_checkstring(L, 2)); } } if (proj->piece) { - CPieceProjectile* pproj = dynamic_cast(proj); + CPieceProjectile* pproj = static_cast(proj); if (pproj != NULL) { pproj->cegID = gCEG->Load(explGenHandler, luaL_checkstring(L, 2)); } diff --git a/rts/Lua/LuaSyncedRead.cpp b/rts/Lua/LuaSyncedRead.cpp index 8a3705adb95..622b365d996 100644 --- a/rts/Lua/LuaSyncedRead.cpp +++ b/rts/Lua/LuaSyncedRead.cpp @@ -270,6 +270,7 @@ bool LuaSyncedRead::PushEntries(lua_State* L) REGISTER_LUA_CFUNC(GetProjectileSpinAngle); REGISTER_LUA_CFUNC(GetProjectileSpinSpeed); REGISTER_LUA_CFUNC(GetProjectileSpinVec); + REGISTER_LUA_CFUNC(GetProjectileTarget); REGISTER_LUA_CFUNC(GetProjectileType); REGISTER_LUA_CFUNC(GetProjectileName); @@ -4406,11 +4407,10 @@ int LuaSyncedRead::GetFeatureCollisionVolumeData(lua_State* L) int LuaSyncedRead::GetProjectilePosition(lua_State* L) { - CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); + const CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); - if (pro == NULL) { + if (pro == NULL) return 0; - } lua_pushnumber(L, pro->pos.x); lua_pushnumber(L, pro->pos.y); @@ -4420,11 +4420,10 @@ int LuaSyncedRead::GetProjectilePosition(lua_State* L) int LuaSyncedRead::GetProjectileVelocity(lua_State* L) { - CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); + const CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); - if (pro == NULL) { + if (pro == NULL) return 0; - } lua_pushnumber(L, pro->speed.x); lua_pushnumber(L, pro->speed.y); @@ -4435,11 +4434,10 @@ int LuaSyncedRead::GetProjectileVelocity(lua_State* L) int LuaSyncedRead::GetProjectileGravity(lua_State* L) { - CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); + const CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); - if (pro == NULL) { + if (pro == NULL) return 0; - } lua_pushnumber(L, pro->mygravity); return 1; @@ -4447,39 +4445,36 @@ int LuaSyncedRead::GetProjectileGravity(lua_State* L) int LuaSyncedRead::GetProjectileSpinAngle(lua_State* L) { - CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); + const CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); - if (pro == NULL || !pro->piece) { + if (pro == NULL || !pro->piece) return 0; - } - CPieceProjectile* ppro = dynamic_cast(pro); + const CPieceProjectile* ppro = static_cast(pro); lua_pushnumber(L, ppro->spinAngle); return 1; } int LuaSyncedRead::GetProjectileSpinSpeed(lua_State* L) { - CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); + const CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); - if (pro == NULL || !pro->piece) { + if (pro == NULL || !pro->piece) return 0; - } - CPieceProjectile* ppro = dynamic_cast(pro); + const CPieceProjectile* ppro = static_cast(pro); lua_pushnumber(L, ppro->spinSpeed); return 1; } int LuaSyncedRead::GetProjectileSpinVec(lua_State* L) { - CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); + const CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); - if (pro == NULL || !pro->piece) { + if (pro == NULL || !pro->piece) return 0; - } - CPieceProjectile* ppro = dynamic_cast(pro); + const CPieceProjectile* ppro = static_cast(pro); lua_pushnumber(L, ppro->spinVec.x); lua_pushnumber(L, ppro->spinVec.y); @@ -4488,13 +4483,46 @@ int LuaSyncedRead::GetProjectileSpinVec(lua_State* L) } -int LuaSyncedRead::GetProjectileType(lua_State* L) +int LuaSyncedRead::GetProjectileTarget(lua_State* L) { - CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); + const CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); - if (pro == NULL) { + if (pro == NULL || !pro->weapon) return 0; + + const CWeaponProjectile* wpro = static_cast(pro); + const CWorldObject* wtgt = wpro->target; + + if (wtgt == NULL) + return 0; + + if (dynamic_cast(wtgt) != NULL) { + lua_pushnumber(L, wtgt->id); + lua_pushstring(L, "u"); + return 2; } + if (dynamic_cast(wtgt) != NULL) { + lua_pushnumber(L, wtgt->id); + lua_pushstring(L, "f"); + return 2; + } + if (dynamic_cast(wtgt) != NULL) { + lua_pushnumber(L, wtgt->id); + lua_pushstring(L, "p"); + return 2; + } + + // projectile target cannot be anything else + assert(false); + return 0; +} + +int LuaSyncedRead::GetProjectileType(lua_State* L) +{ + const CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); + + if (pro == NULL) + return 0; lua_pushboolean(L, pro->weapon); lua_pushboolean(L, pro->piece); @@ -4503,14 +4531,13 @@ int LuaSyncedRead::GetProjectileType(lua_State* L) int LuaSyncedRead::GetProjectileName(lua_State* L) { - CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); + const CProjectile* pro = ParseProjectile(L, __FUNCTION__, 1); - if (pro == NULL) { + if (pro == NULL) return 0; - } if (pro->weapon) { - const CWeaponProjectile* wpro = dynamic_cast(pro); + const CWeaponProjectile* wpro = static_cast(pro); if (wpro != NULL && wpro->weaponDef != NULL) { // maybe CWeaponProjectile derivatives @@ -4520,7 +4547,7 @@ int LuaSyncedRead::GetProjectileName(lua_State* L) } } if (pro->piece) { - const CPieceProjectile* ppro = dynamic_cast(pro); + const CPieceProjectile* ppro = static_cast(pro); if (ppro != NULL && ppro->omp != NULL) { lua_pushsstring(L, ppro->omp->name); diff --git a/rts/Lua/LuaSyncedRead.h b/rts/Lua/LuaSyncedRead.h index 3afcf9275d4..c00f3496caf 100644 --- a/rts/Lua/LuaSyncedRead.h +++ b/rts/Lua/LuaSyncedRead.h @@ -180,6 +180,7 @@ class LuaSyncedRead { static int GetProjectileSpinAngle(lua_State* L); static int GetProjectileSpinSpeed(lua_State* L); static int GetProjectileSpinVec(lua_State* L); + static int GetProjectileTarget(lua_State* L); static int GetProjectileType(lua_State* L); static int GetProjectileName(lua_State* L);