diff --git a/src/doomdata.h b/src/doomdata.h index 37e2186fa..d3c43b272 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -200,7 +200,7 @@ typedef struct typedef struct { INT16 x, y; - INT16 angle; + INT16 angle, pitch, roll; UINT16 type; UINT16 options; INT16 z; diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 5b3abe828..dca4721e9 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -31,6 +31,8 @@ enum mobj_e { mobj_snext, mobj_sprev, mobj_angle, + mobj_pitch, + mobj_roll, mobj_rollangle, mobj_sprite, mobj_frame, @@ -97,6 +99,8 @@ static const char *const mobj_opt[] = { "snext", "sprev", "angle", + "pitch", + "roll", "rollangle", "sprite", "frame", @@ -198,6 +202,12 @@ static int mobj_get(lua_State *L) case mobj_angle: lua_pushangle(L, mo->angle); break; + case mobj_pitch: + lua_pushangle(L, mo->pitch); + break; + case mobj_roll: + lua_pushangle(L, mo->roll); + break; case mobj_rollangle: lua_pushangle(L, mo->rollangle); break; @@ -453,6 +463,11 @@ static int mobj_set(lua_State *L) localangle = mo->angle; else if (mo->player == &players[secondarydisplayplayer]) localangle2 = mo->angle; + case mobj_pitch: + mo->pitch = luaL_checkangle(L, 3); + break; + case mobj_roll: + mo->roll = luaL_checkangle(L, 3); break; case mobj_rollangle: mo->rollangle = luaL_checkangle(L, 3); @@ -771,6 +786,10 @@ static int mapthing_get(lua_State *L) number = mt->y; else if(fastcmp(field,"angle")) number = mt->angle; + else if(fastcmp(field,"pitch")) + number = mt->pitch; + else if(fastcmp(field,"roll")) + number = mt->roll; else if(fastcmp(field,"type")) number = mt->type; else if(fastcmp(field,"options")) @@ -812,6 +831,10 @@ static int mapthing_set(lua_State *L) mt->y = (INT16)luaL_checkinteger(L, 3); else if(fastcmp(field,"angle")) mt->angle = (INT16)luaL_checkinteger(L, 3); + else if(fastcmp(field,"pitch")) + mt->pitch = (INT16)luaL_checkinteger(L, 3); + else if(fastcmp(field,"roll")) + mt->roll = (INT16)luaL_checkinteger(L, 3); else if(fastcmp(field,"type")) mt->type = (UINT16)luaL_checkinteger(L, 3); else if(fastcmp(field,"options")) diff --git a/src/p_mobj.c b/src/p_mobj.c index b8dca52a6..0fa75ec47 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -13086,6 +13086,9 @@ static mobj_t *P_SpawnMobjFromMapThing(mapthing_t *mthing, fixed_t x, fixed_t y, if (doangle) mobj->angle = FixedAngle(mthing->angle << FRACBITS); + mobj->pitch = FixedAngle(mthing->pitch << FRACBITS); + mobj->roll = FixedAngle(mthing->roll << FRACBITS); + mthing->mobj = mobj; // ignore MTF_ flags and return early diff --git a/src/p_mobj.h b/src/p_mobj.h index 5deb288e4..c7a36b05c 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -278,7 +278,7 @@ typedef struct mobj_s struct mobj_s **sprev; // killough 8/11/98: change to ptr-to-ptr // More drawing info: to determine current sprite. - angle_t angle; // orientation + angle_t angle, pitch, roll; // orientation angle_t rollangle; spritenum_t sprite; // used to find patch_t and flip value UINT32 frame; // frame number, plus bits see p_pspr.h @@ -398,7 +398,7 @@ typedef struct precipmobj_s struct precipmobj_s **sprev; // killough 8/11/98: change to ptr-to-ptr // More drawing info: to determine current sprite. - angle_t angle; // orientation + angle_t angle, pitch, roll; // orientation angle_t rollangle; spritenum_t sprite; // used to find patch_t and flip value UINT32 frame; // frame number, plus bits see p_pspr.h diff --git a/src/p_saveg.c b/src/p_saveg.c index 34392886d..51d4b75d9 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1451,7 +1451,9 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) if ((mobj->x != mobj->spawnpoint->x << FRACBITS) || (mobj->y != mobj->spawnpoint->y << FRACBITS) || - (mobj->angle != FixedAngle(mobj->spawnpoint->angle*FRACUNIT))) + (mobj->angle != FixedAngle(mobj->spawnpoint->angle*FRACUNIT)) || + (mobj->pitch != FixedAngle(mobj->spawnpoint->pitch*FRACUNIT)) || + (mobj->roll != FixedAngle(mobj->spawnpoint->roll*FRACUNIT)) ) diff |= MD_POS; if (mobj->info->doomednum != mobj->spawnpoint->type) @@ -1633,6 +1635,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) WRITEFIXED(save_p, mobj->x); WRITEFIXED(save_p, mobj->y); WRITEANGLE(save_p, mobj->angle); + WRITEANGLE(save_p, mobj->pitch); + WRITEANGLE(save_p, mobj->roll); } if (diff & MD_MOM) { @@ -2649,12 +2653,16 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) mobj->x = READFIXED(save_p); mobj->y = READFIXED(save_p); mobj->angle = READANGLE(save_p); + mobj->pitch = READANGLE(save_p); + mobj->roll = READANGLE(save_p); } else { mobj->x = mobj->spawnpoint->x << FRACBITS; mobj->y = mobj->spawnpoint->y << FRACBITS; mobj->angle = FixedAngle(mobj->spawnpoint->angle*FRACUNIT); + mobj->pitch = FixedAngle(mobj->spawnpoint->pitch*FRACUNIT); + mobj->roll = FixedAngle(mobj->spawnpoint->roll*FRACUNIT); } if (diff & MD_MOM) { diff --git a/src/p_setup.c b/src/p_setup.c index e342cd9e6..c836f671a 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1283,6 +1283,7 @@ static void P_LoadThings(UINT8 *data) mt->extrainfo = (UINT8)(mt->type >> 12); mt->scale = FRACUNIT; mt->tag = 0; + mt->pitch = mt->roll = 0; mt->type &= 4095; @@ -1569,6 +1570,10 @@ static void ParseTextmapThingParameter(UINT32 i, char *param, char *val) mapthings[i].z = atol(val); else if (fastcmp(param, "angle")) mapthings[i].angle = atol(val); + else if (fastcmp(param, "pitch")) + mapthings[i].pitch = atol(val); + else if (fastcmp(param, "roll")) + mapthings[i].roll = atol(val); else if (fastcmp(param, "type")) mapthings[i].type = atol(val); else if (fastcmp(param, "scale") || fastcmp(param, "scalex") || fastcmp(param, "scaley"))