From 8df96343bb7913eb44cbc5422f49cfbf149f5112 Mon Sep 17 00:00:00 2001 From: James Haley Date: Mon, 23 Mar 2009 18:57:44 -0500 Subject: [PATCH] Import EE mouse fix, EE screen centering code, and EE player corpse deferred removal savegame bug fix. --- Source/I_main.c | 2 ++ Source/I_video.c | 8 ++++---- Source/P_saveg.c | 52 +++++++++++++++++++++++++++++++----------------- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/Source/I_main.c b/Source/I_main.c index ef91273c..e329ec7a 100644 --- a/Source/I_main.c +++ b/Source/I_main.c @@ -55,6 +55,8 @@ int main(int argc, char **argv) // SoM: From CHOCODOOM Thank you fraggle!! #ifdef _WIN32 + putenv("SDL_VIDEO_WINDOW_POS=center") ; + putenv("SDL_VIDEO_CENTERED=1") ; // Allow -gdi as a shortcut for using the windib driver. diff --git a/Source/I_video.c b/Source/I_video.c index eced4985..797e1b7e 100644 --- a/Source/I_video.c +++ b/Source/I_video.c @@ -356,8 +356,8 @@ void I_GetEvent() continue; // SoM 1-20-04 Ok, use xrel/yrel for mouse movement because most people like it the most. - mouseevent.data3 = -event.motion.yrel; - mouseevent.data2 = event.motion.xrel; + mouseevent.data3 -= event.motion.yrel; + mouseevent.data2 += event.motion.xrel; sendmouseevent = 1; break; case SDL_MOUSEBUTTONUP: @@ -426,8 +426,8 @@ void I_GetEvent() D_PostEvent(&mouseevent); } - if(paused && !window_focused) - I_WaitVBL(1); + if(paused || !window_focused) + SDL_Delay(1); } // diff --git a/Source/P_saveg.c b/Source/P_saveg.c index 63a8b8a4..10955ee2 100644 --- a/Source/P_saveg.c +++ b/Source/P_saveg.c @@ -336,16 +336,25 @@ void P_ArchiveThinkers (void) // killough 9/14/98: save soundtargets { - int i; - CheckSaveGame(numsectors * sizeof(mobj_t *)); // killough 9/14/98 - for (i = 0; i < numsectors; i++) - { - mobj_t *target = sectors[i].soundtarget; - if (target) - target = (mobj_t *) target->thinker.prev; - memcpy(save_p, &target, sizeof target); - save_p += sizeof target; - } + int i; + CheckSaveGame(numsectors * sizeof(mobj_t *)); // killough 9/14/98 + for (i = 0; i < numsectors; i++) + { + mobj_t *target = sectors[i].soundtarget; + if (target) + { + // haleyjd 03/23/09: Imported from Eternity: + // haleyjd 11/03/06: We must check for P_MobjThinker here as well, + // or player corpses waiting for deferred removal will be saved as + // raw pointer values instead of twizzled numbers, causing a crash + // on savegame load! + target = target->thinker.function == P_MobjThinker ? + (mobj_t *)target->thinker.prev : NULL; + + } + memcpy(save_p, &target, sizeof target); + save_p += sizeof target; + } } // killough 2/14/98: restore prev pointers @@ -382,6 +391,7 @@ void P_UnArchiveThinkers (void) thinker_t *th; mobj_t **mobj_p; // killough 2/14/98: Translation table size_t size; // killough 2/14/98: size of or index into table + size_t idx; // haleyjd 11/03/06: separate index var // killough 3/26/98: Load boss brain state memcpy(&brain, save_p, sizeof brain); @@ -417,12 +427,13 @@ void P_UnArchiveThinkers (void) } // read in saved thinkers - for (size = 1; *save_p++ == tc_mobj; size++) // killough 2/14/98 + // haleyjd 11/03/06: use idx to save "size" for rangechecking + for (idx = 1; *save_p++ == tc_mobj; idx++) // killough 2/14/98 { mobj_t *mobj = Z_Malloc(sizeof(mobj_t), PU_LEVEL, NULL); // killough 2/14/98 -- insert pointers to thinkers into table, in order: - mobj_p[size] = mobj; + mobj_p[idx] = mobj; PADSAVEP(); memcpy (mobj, save_p, sizeof(mobj_t)); @@ -473,12 +484,17 @@ void P_UnArchiveThinkers (void) { // killough 9/14/98: restore soundtargets int i; for (i = 0; i < numsectors; i++) - { - mobj_t *target; - memcpy(&target, save_p, sizeof target); - save_p += sizeof target; - P_SetNewTarget(§ors[i].soundtarget, mobj_p[(size_t) target]); - } + { + mobj_t *target; + memcpy(&target, save_p, sizeof target); + save_p += sizeof target; + + // haleyjd 11/03/06: rangecheck for security + if((size_t)target < size) + P_SetNewTarget(§ors[i].soundtarget, mobj_p[(size_t) target]); + else + sectors[i].soundtarget = NULL; + } } free(mobj_p); // free translation table