mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-20 19:02:34 +00:00
Merge branch 'lua-camera' into 'next'
Allow Lua write access to camera_t variables & expose the cameras globally See merge request STJr/SRB2!1581
This commit is contained in:
commit
bcd7468d25
3 changed files with 110 additions and 0 deletions
|
@ -1885,6 +1885,37 @@ static int lib_pDoSpring(lua_State *L)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int lib_pTryCameraMove(lua_State *L)
|
||||
{
|
||||
camera_t *cam = *((camera_t **)luaL_checkudata(L, 1, META_CAMERA));
|
||||
fixed_t x = luaL_checkfixed(L, 2);
|
||||
fixed_t y = luaL_checkfixed(L, 3);
|
||||
|
||||
if (!cam)
|
||||
return LUA_ErrInvalid(L, "camera_t");
|
||||
lua_pushboolean(L, P_TryCameraMove(x, y, cam));
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int lib_pTeleportCameraMove(lua_State *L)
|
||||
{
|
||||
camera_t *cam = *((camera_t **)luaL_checkudata(L, 1, META_CAMERA));
|
||||
fixed_t x = luaL_checkfixed(L, 2);
|
||||
fixed_t y = luaL_checkfixed(L, 3);
|
||||
fixed_t z = luaL_checkfixed(L, 4);
|
||||
|
||||
if (!cam)
|
||||
return LUA_ErrInvalid(L, "camera_t");
|
||||
cam->x = x;
|
||||
cam->y = y;
|
||||
cam->z = z;
|
||||
P_CheckCameraPosition(x, y, cam);
|
||||
cam->subsector = R_PointInSubsector(x, y);
|
||||
cam->floorz = tmfloorz;
|
||||
cam->ceilingz = tmceilingz;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// P_INTER
|
||||
////////////
|
||||
|
||||
|
@ -3988,6 +4019,8 @@ static luaL_Reg lib[] = {
|
|||
{"P_FloorzAtPos",lib_pFloorzAtPos},
|
||||
{"P_CeilingzAtPos",lib_pCeilingzAtPos},
|
||||
{"P_DoSpring",lib_pDoSpring},
|
||||
{"P_TryCameraMove", lib_pTryCameraMove},
|
||||
{"P_TeleportCameraMove", lib_pTeleportCameraMove},
|
||||
|
||||
// p_inter
|
||||
{"P_RemoveShield",lib_pRemoveShield},
|
||||
|
|
|
@ -401,6 +401,72 @@ static int camera_get(lua_State *L)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int camera_set(lua_State *L)
|
||||
{
|
||||
camera_t *cam = *((camera_t **)luaL_checkudata(L, 1, META_CAMERA));
|
||||
enum cameraf field = luaL_checkoption(L, 2, NULL, camera_opt);
|
||||
|
||||
I_Assert(cam != NULL);
|
||||
|
||||
switch(field)
|
||||
{
|
||||
case camera_subsector:
|
||||
case camera_floorz:
|
||||
case camera_ceilingz:
|
||||
case camera_x:
|
||||
case camera_y:
|
||||
return luaL_error(L, LUA_QL("camera_t") " field " LUA_QS " should not be set directly. Use " LUA_QL("P_TryCameraMove") " or " LUA_QL("P_TeleportCameraMove") " instead.", camera_opt[field]);
|
||||
case camera_chase:
|
||||
if (cam == &camera)
|
||||
CV_SetValue(&cv_chasecam, (INT32)luaL_checkboolean(L, 3));
|
||||
else if (cam == &camera2)
|
||||
CV_SetValue(&cv_chasecam2, (INT32)luaL_checkboolean(L, 3));
|
||||
else // ??? this should never happen, but ok
|
||||
cam->chase = luaL_checkboolean(L, 3);
|
||||
break;
|
||||
case camera_aiming:
|
||||
cam->aiming = luaL_checkangle(L, 3);
|
||||
break;
|
||||
case camera_z:
|
||||
cam->z = luaL_checkfixed(L, 3);
|
||||
P_CheckCameraPosition(cam->x, cam->y, cam);
|
||||
cam->floorz = tmfloorz;
|
||||
cam->ceilingz = tmceilingz;
|
||||
break;
|
||||
case camera_angle:
|
||||
cam->angle = luaL_checkangle(L, 3);
|
||||
break;
|
||||
case camera_radius:
|
||||
cam->radius = luaL_checkfixed(L, 3);
|
||||
if (cam->radius < 0)
|
||||
cam->radius = 0;
|
||||
P_CheckCameraPosition(cam->x, cam->y, cam);
|
||||
cam->floorz = tmfloorz;
|
||||
cam->ceilingz = tmceilingz;
|
||||
break;
|
||||
case camera_height:
|
||||
cam->height = luaL_checkfixed(L, 3);
|
||||
if (cam->height < 0)
|
||||
cam->height = 0;
|
||||
P_CheckCameraPosition(cam->x, cam->y, cam);
|
||||
cam->floorz = tmfloorz;
|
||||
cam->ceilingz = tmceilingz;
|
||||
break;
|
||||
case camera_momx:
|
||||
cam->momx = luaL_checkfixed(L, 3);
|
||||
break;
|
||||
case camera_momy:
|
||||
cam->momy = luaL_checkfixed(L, 3);
|
||||
break;
|
||||
case camera_momz:
|
||||
cam->momz = luaL_checkfixed(L, 3);
|
||||
break;
|
||||
default:
|
||||
return luaL_error(L, LUA_QL("camera_t") " has no field named " LUA_QS, camera_opt[field]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
// lib_draw
|
||||
//
|
||||
|
@ -1350,6 +1416,9 @@ int LUA_HudLib(lua_State *L)
|
|||
luaL_newmetatable(L, META_CAMERA);
|
||||
lua_pushcfunction(L, camera_get);
|
||||
lua_setfield(L, -2, "__index");
|
||||
|
||||
lua_pushcfunction(L, camera_set);
|
||||
lua_setfield(L, -2, "__newindex");
|
||||
lua_pop(L,1);
|
||||
|
||||
luaL_register(L, "hud", lib_hud);
|
||||
|
|
|
@ -393,6 +393,14 @@ int LUA_PushGlobals(lua_State *L, const char *word)
|
|||
} else if (fastcmp(word, "mouse2")) {
|
||||
LUA_PushUserdata(L, &mouse2, META_MOUSE);
|
||||
return 1;
|
||||
} else if (fastcmp(word, "camera")) {
|
||||
LUA_PushUserdata(L, &camera, META_CAMERA);
|
||||
return 1;
|
||||
} else if (fastcmp(word, "camera2")) {
|
||||
if (!splitscreen)
|
||||
return 0;
|
||||
LUA_PushUserdata(L, &camera2, META_CAMERA);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue