diff options
author | Simon Howard | 2013-09-24 21:10:57 +0000 |
---|---|---|
committer | Simon Howard | 2013-09-24 21:10:57 +0000 |
commit | 5932e291009cbbb534bb6b4e009e4830692d0748 (patch) | |
tree | 07b3cc2fa5ac2bd42f904c31319247bc3e83557b /src/heretic | |
parent | 551df9d933a3f8d4c7dd633f62671433dc70cc1d (diff) | |
download | chocolate-doom-5932e291009cbbb534bb6b4e009e4830692d0748.tar.gz chocolate-doom-5932e291009cbbb534bb6b4e009e4830692d0748.tar.bz2 chocolate-doom-5932e291009cbbb534bb6b4e009e4830692d0748.zip |
Add portable functions to read/write player_t structures and use this
rather than copying chunks of memory.
Subversion-branch: /branches/v2-branch
Subversion-revision: 2683
Diffstat (limited to 'src/heretic')
-rw-r--r-- | src/heretic/p_saveg.c | 495 |
1 files changed, 476 insertions, 19 deletions
diff --git a/src/heretic/p_saveg.c b/src/heretic/p_saveg.c index 1b77b8b2..63d27920 100644 --- a/src/heretic/p_saveg.c +++ b/src/heretic/p_saveg.c @@ -139,9 +139,16 @@ void SV_WriteLong(unsigned int val) SV_Write(&val, sizeof(int)); } +void SV_WritePtr(void *ptr) +{ + long val = (long) ptr; + + SV_WriteLong(val & 0xffffffff); +} + //========================================================================== // -// SV_Write +// SV_Read // //========================================================================== @@ -179,6 +186,471 @@ uint32_t SV_ReadLong(void) return LONG(result); } +// +// ticcmd_t +// + +static void saveg_read_ticcmd_t(ticcmd_t *str) +{ + // char forwardmove; + str->forwardmove = SV_ReadByte(); + + // char sidemove; + str->sidemove = SV_ReadByte(); + + // short angleturn; + str->angleturn = SV_ReadWord(); + + // short consistancy; + str->consistancy = SV_ReadWord(); + + // byte chatchar; + str->chatchar = SV_ReadByte(); + + // byte buttons; + str->buttons = SV_ReadByte(); + + // byte lookfly; + str->lookfly = SV_ReadByte(); + + // byte arti; + str->arti = SV_ReadByte(); +} + +static void saveg_write_ticcmd_t(ticcmd_t *str) +{ + // char forwardmove; + SV_WriteByte(str->forwardmove); + + // char sidemove; + SV_WriteByte(str->sidemove); + + // short angleturn; + SV_WriteWord(str->angleturn); + + // short consistancy; + SV_WriteWord(str->consistancy); + + // byte chatchar; + SV_WriteByte(str->chatchar); + + // byte buttons; + SV_WriteByte(str->buttons); + + // byte lookfly; + SV_WriteByte(str->lookfly); + + // byte arti; + SV_WriteByte(str->arti); +} + +// +// inventory_t +// + +static void saveg_read_inventory_t(inventory_t *str) +{ + // int type; + str->type = SV_ReadLong(); + + // int count; + str->count = SV_ReadLong(); +} + +static void saveg_write_inventory_t(inventory_t *str) +{ + // int type; + SV_WriteLong(str->type); + + // int count; + SV_WriteLong(str->count); +} + + +// +// pspdef_t +// + +static void saveg_read_pspdef_t(pspdef_t *str) +{ + int i; + + // state_t *state; + i = SV_ReadLong(); + if (i == 0) + { + str->state = NULL; + } + else + { + str->state = &states[i]; + } + + // int tics; + str->tics = SV_ReadLong(); + + // fixed_t sx, sy; + str->sx = SV_ReadLong(); + str->sy = SV_ReadLong(); +} + +static void saveg_write_pspdef_t(pspdef_t *str) +{ + // state_t *state; + if (str->state != NULL) + { + SV_WriteLong(str->state - states); + } + else + { + SV_WriteLong(0); + } + + // int tics; + SV_WriteLong(str->tics); + + // fixed_t sx, sy; + SV_WriteLong(str->sx); + SV_WriteLong(str->sy); +} + + +// +// player_t +// + +static void saveg_read_player_t(player_t *str) +{ + int i; + + // mobj_t *mo; + SV_ReadLong(); + str->mo = NULL; + + // playerstate_t playerstate; + str->playerstate = SV_ReadLong(); + + // ticcmd_t cmd; + saveg_read_ticcmd_t(&str->cmd); + + // fixed_t viewz; + str->viewz = SV_ReadLong(); + + // fixed_t viewheight; + str->viewheight = SV_ReadLong(); + + // fixed_t deltaviewheight; + str->deltaviewheight = SV_ReadLong(); + + // fixed_t bob; + str->bob = SV_ReadLong(); + + // int flyheight; + str->flyheight = SV_ReadLong(); + + // int lookdir; + str->lookdir = SV_ReadLong(); + + // boolean centering; + str->centering = SV_ReadLong(); + + // int health; + str->health = SV_ReadLong(); + + // int armorpoints, armortype; + str->armorpoints = SV_ReadLong(); + str->armortype = SV_ReadLong(); + + // inventory_t inventory[NUMINVENTORYSLOTS]; + for (i=0; i<NUMINVENTORYSLOTS; ++i) + { + saveg_read_inventory_t(&str->inventory[i]); + } + + // artitype_t readyArtifact; + str->readyArtifact = SV_ReadLong(); + + // int artifactCount; + str->artifactCount = SV_ReadLong(); + + // int inventorySlotNum; + str->inventorySlotNum = SV_ReadLong(); + + // int powers[NUMPOWERS]; + for (i=0; i<NUMPOWERS; ++i) + { + str->powers[i] = SV_ReadLong(); + } + + // boolean keys[NUMKEYS]; + for (i=0; i<NUMKEYS; ++i) + { + str->keys[i] = SV_ReadLong(); + } + + // boolean backpack; + str->backpack = SV_ReadLong(); + + // signed int frags[MAXPLAYERS]; + for (i=0; i<MAXPLAYERS; ++i) + { + str->frags[i] = SV_ReadLong(); + } + + // weapontype_t readyweapon; + str->readyweapon = SV_ReadLong(); + + // weapontype_t pendingweapon; + str->pendingweapon = SV_ReadLong(); + + // boolean weaponowned[NUMWEAPONS]; + for (i=0; i<NUMWEAPONS; ++i) + { + str->weaponowned[i] = SV_ReadLong(); + } + + // int ammo[NUMAMMO]; + for (i=0; i<NUMAMMO; ++i) + { + str->ammo[i] = SV_ReadLong(); + } + + // int maxammo[NUMAMMO]; + for (i=0; i<NUMAMMO; ++i) + { + str->maxammo[i] = SV_ReadLong(); + } + + // int attackdown, usedown; + str->attackdown = SV_ReadLong(); + str->usedown = SV_ReadLong(); + + // int cheats; + str->cheats = SV_ReadLong(); + + // int refire; + str->refire = SV_ReadLong(); + + // int killcount, itemcount, secretcount; + str->killcount = SV_ReadLong(); + str->itemcount = SV_ReadLong(); + str->secretcount = SV_ReadLong(); + + // char *message; + SV_ReadLong(); + str->message = NULL; + + // int messageTics; + str->messageTics = SV_ReadLong(); + + // int damagecount, bonuscount; + str->damagecount = SV_ReadLong(); + str->bonuscount = SV_ReadLong(); + + // int flamecount; + str->flamecount = SV_ReadLong(); + + // mobj_t *attacker; + SV_ReadLong(); + str->attacker = NULL; + + // int extralight; + str->extralight = SV_ReadLong(); + + // int fixedcolormap; + str->fixedcolormap = SV_ReadLong(); + + // int colormap; + str->colormap = SV_ReadLong(); + + // pspdef_t psprites[NUMPSPRITES]; + for (i=0; i<NUMPSPRITES; ++i) + { + saveg_read_pspdef_t(&str->psprites[i]); + } + + // boolean didsecret; + str->didsecret = SV_ReadLong(); + + // int chickenTics; + str->chickenTics = SV_ReadLong(); + + // int chickenPeck; + str->chickenPeck = SV_ReadLong(); + + // mobj_t *rain1; + SV_ReadLong(); + str->rain1 = NULL; + + // mobj_t *rain2; + SV_ReadLong(); + str->rain2 = NULL; +} + +static void saveg_write_player_t(player_t *str) +{ + int i; + + // mobj_t *mo; + SV_WritePtr(str->mo); + + // playerstate_t playerstate; + SV_WriteLong(str->playerstate); + + // ticcmd_t cmd; + saveg_write_ticcmd_t(&str->cmd); + + // fixed_t viewz; + SV_WriteLong(str->viewz); + + // fixed_t viewheight; + SV_WriteLong(str->viewheight); + + // fixed_t deltaviewheight; + SV_WriteLong(str->deltaviewheight); + + // fixed_t bob; + SV_WriteLong(str->bob); + + // int flyheight; + SV_WriteLong(str->flyheight); + + // int lookdir; + SV_WriteLong(str->lookdir); + + // boolean centering; + SV_WriteLong(str->centering); + + // int health; + SV_WriteLong(str->health); + + // int armorpoints, armortype; + SV_WriteLong(str->armorpoints); + SV_WriteLong(str->armortype); + + // inventory_t inventory[NUMINVENTORYSLOTS]; + for (i=0; i<NUMINVENTORYSLOTS; ++i) + { + saveg_write_inventory_t(&str->inventory[i]); + } + + // artitype_t readyArtifact; + SV_WriteLong(str->readyArtifact); + + // int artifactCount; + SV_WriteLong(str->artifactCount); + + // int inventorySlotNum; + SV_WriteLong(str->inventorySlotNum); + + // int powers[NUMPOWERS]; + for (i=0; i<NUMPOWERS; ++i) + { + SV_WriteLong(str->powers[i]); + } + + // boolean keys[NUMKEYS]; + for (i=0; i<NUMKEYS; ++i) + { + SV_WriteLong(str->keys[i]); + } + + // boolean backpack; + SV_WriteLong(str->backpack); + + // signed int frags[MAXPLAYERS]; + for (i=0; i<MAXPLAYERS; ++i) + { + SV_WriteLong(str->frags[i]); + } + + // weapontype_t readyweapon; + SV_WriteLong(str->readyweapon); + + // weapontype_t pendingweapon; + SV_WriteLong(str->pendingweapon); + + // boolean weaponowned[NUMWEAPONS]; + for (i=0; i<NUMWEAPONS; ++i) + { + SV_WriteLong(str->weaponowned[i]); + } + + // int ammo[NUMAMMO]; + for (i=0; i<NUMAMMO; ++i) + { + SV_WriteLong(str->ammo[i]); + } + + // int maxammo[NUMAMMO]; + for (i=0; i<NUMAMMO; ++i) + { + SV_WriteLong(str->maxammo[i]); + } + + // int attackdown, usedown; + SV_WriteLong(str->attackdown); + SV_WriteLong(str->usedown); + + // int cheats; + SV_WriteLong(str->cheats); + + // int refire; + SV_WriteLong(str->refire); + + // int killcount, itemcount, secretcount; + SV_WriteLong(str->killcount); + SV_WriteLong(str->itemcount); + SV_WriteLong(str->secretcount); + + // char *message; + SV_WritePtr(str->message); + + // int messageTics; + SV_WriteLong(str->messageTics); + + // int damagecount, bonuscount; + SV_WriteLong(str->damagecount); + SV_WriteLong(str->bonuscount); + + // int flamecount; + SV_WriteLong(str->flamecount); + + // mobj_t *attacker; + SV_WritePtr(str->attacker); + + // int extralight; + SV_WriteLong(str->extralight); + + // int fixedcolormap; + SV_WriteLong(str->fixedcolormap); + + // int colormap; + SV_WriteLong(str->colormap); + + // pspdef_t psprites[NUMPSPRITES]; + for (i=0; i<NUMPSPRITES; ++i) + { + saveg_write_pspdef_t(&str->psprites[i]); + } + + // boolean didsecret; + SV_WriteLong(str->didsecret); + + // int chickenTics; + SV_WriteLong(str->chickenTics); + + // int chickenPeck; + SV_WriteLong(str->chickenPeck); + + // mobj_t *rain1; + SV_WritePtr(str->rain1); + + // mobj_t *rain2; + SV_WritePtr(str->rain2); +} + + /* ==================== @@ -191,8 +663,6 @@ uint32_t SV_ReadLong(void) void P_ArchivePlayers(void) { int i; - int j; - player_t dest; for (i = 0; i < MAXPLAYERS; i++) { @@ -200,16 +670,7 @@ void P_ArchivePlayers(void) { continue; } - memcpy(&dest, &players[i], sizeof(player_t)); - for (j = 0; j < NUMPSPRITES; j++) - { - if (dest.psprites[j].state) - { - dest.psprites[j].state = - (state_t *) (dest.psprites[j].state - states); - } - } - SV_Write(&dest, sizeof(player_t)); + saveg_write_player_t(&players[i]); } } @@ -223,20 +684,16 @@ void P_ArchivePlayers(void) void P_UnArchivePlayers(void) { - int i, j; + int i; for (i = 0; i < MAXPLAYERS; i++) { if (!playeringame[i]) continue; - SV_Read(&players[i], sizeof(player_t)); + saveg_read_player_t(&players[i]); players[i].mo = NULL; // will be set when unarc thinker players[i].message = NULL; players[i].attacker = NULL; - for (j = 0; j < NUMPSPRITES; j++) - if (players[i].psprites[j].state) - players[i].psprites[j].state - = &states[(int) players[i].psprites[j].state]; } } |