diff --git a/src/k_terrain.c b/src/k_terrain.c index b8edebf03..8c55ac4f2 100644 --- a/src/k_terrain.c +++ b/src/k_terrain.c @@ -41,6 +41,27 @@ UINT16 numTerrainFloorDefs = 0; UINT16 defaultTerrain = UINT16_MAX; +/*-------------------------------------------------- + size_t K_GetTerrainHeapIndex(terrain_t *terrain) + + See header file for description. +--------------------------------------------------*/ +size_t K_GetTerrainHeapIndex(terrain_t *terrain) +{ + size_t i = SIZE_MAX; + + if (terrain == NULL) + { + CONS_Debug(DBG_GAMELOGIC, "NULL terrain in K_GetTerrainHeapIndex.\n"); + } + else + { + i = (terrain - terrainDefs); + } + + return i; +} + terrain_t *K_GetTerrainByIndex(UINT16 checkIndex) { if (checkIndex >= numTerrainDefs) diff --git a/src/k_terrain.h b/src/k_terrain.h index 600656522..c5bf51168 100644 --- a/src/k_terrain.h +++ b/src/k_terrain.h @@ -97,6 +97,7 @@ extern UINT16 numTerrainFloorDefs; // Default terrain definition ID. extern UINT16 defaultTerrain; +size_t K_GetTerrainHeapIndex(terrain_t *terrain); terrain_t *K_GetTerrainByIndex(UINT16 checkIndex); terrain_t *K_GetTerrainByName(const char *checkName); terrain_t *K_GetDefaultTerrain(void); diff --git a/src/p_saveg.c b/src/p_saveg.c index 39a4fec28..bfa6d6e15 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -38,6 +38,7 @@ // SRB2Kart #include "k_battle.h" #include "k_pwrlv.h" +#include "k_terrain.h" savedata_t savedata; UINT8 *save_p; @@ -1540,6 +1541,7 @@ typedef enum MD2_KITEMCAP = 1<<26, MD2_ITNEXT = 1<<27, MD2_LASTMOMZ = 1<<28, + MD2_TERRAIN = 1<<29, } mobj_diff2_t; typedef enum @@ -1782,6 +1784,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) diff2 |= MD2_ITNEXT; if (mobj->lastmomz) diff2 |= MD2_LASTMOMZ; + if (mobj->terrain != NULL) + diff2 |= MD2_TERRAIN; if (diff2 != 0) diff |= MD_MORE; @@ -1979,6 +1983,10 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) { WRITEINT32(save_p, mobj->lastmomz); } + if (diff2 & MD2_TERRAIN) + { + WRITEUINT32(save_p, K_GetTerrainHeapIndex(mobj->terrain)); + } WRITEUINT32(save_p, mobj->mobjnum); } @@ -3077,6 +3085,14 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) { mobj->lastmomz = READINT32(save_p); } + if (diff2 & MD2_TERRAIN) + { + mobj->terrain = (terrain_t *)(size_t)READUINT32(save_p); + } + else + { + mobj->terrain = NULL; + } if (diff & MD_REDFLAG) {