Import EE mouse fix, EE screen centering code, and EE player corpse deferred removal savegame bug fix.

This commit is contained in:
James Haley 2009-03-23 18:57:44 -05:00
parent 5d5f2a10f2
commit 8df96343bb
3 changed files with 40 additions and 22 deletions

View File

@ -55,6 +55,8 @@ int main(int argc, char **argv)
// SoM: From CHOCODOOM Thank you fraggle!! // SoM: From CHOCODOOM Thank you fraggle!!
#ifdef _WIN32 #ifdef _WIN32
putenv("SDL_VIDEO_WINDOW_POS=center") ;
putenv("SDL_VIDEO_CENTERED=1") ;
// Allow -gdi as a shortcut for using the windib driver. // Allow -gdi as a shortcut for using the windib driver.

View File

@ -356,8 +356,8 @@ void I_GetEvent()
continue; continue;
// SoM 1-20-04 Ok, use xrel/yrel for mouse movement because most people like it the most. // SoM 1-20-04 Ok, use xrel/yrel for mouse movement because most people like it the most.
mouseevent.data3 = -event.motion.yrel; mouseevent.data3 -= event.motion.yrel;
mouseevent.data2 = event.motion.xrel; mouseevent.data2 += event.motion.xrel;
sendmouseevent = 1; sendmouseevent = 1;
break; break;
case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONUP:
@ -426,8 +426,8 @@ void I_GetEvent()
D_PostEvent(&mouseevent); D_PostEvent(&mouseevent);
} }
if(paused && !window_focused) if(paused || !window_focused)
I_WaitVBL(1); SDL_Delay(1);
} }
// //

View File

@ -336,16 +336,25 @@ void P_ArchiveThinkers (void)
// killough 9/14/98: save soundtargets // killough 9/14/98: save soundtargets
{ {
int i; int i;
CheckSaveGame(numsectors * sizeof(mobj_t *)); // killough 9/14/98 CheckSaveGame(numsectors * sizeof(mobj_t *)); // killough 9/14/98
for (i = 0; i < numsectors; i++) for (i = 0; i < numsectors; i++)
{ {
mobj_t *target = sectors[i].soundtarget; mobj_t *target = sectors[i].soundtarget;
if (target) if (target)
target = (mobj_t *) target->thinker.prev; {
memcpy(save_p, &target, sizeof target); // haleyjd 03/23/09: Imported from Eternity:
save_p += sizeof target; // 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 // killough 2/14/98: restore prev pointers
@ -382,6 +391,7 @@ void P_UnArchiveThinkers (void)
thinker_t *th; thinker_t *th;
mobj_t **mobj_p; // killough 2/14/98: Translation table 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 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 // killough 3/26/98: Load boss brain state
memcpy(&brain, save_p, sizeof brain); memcpy(&brain, save_p, sizeof brain);
@ -417,12 +427,13 @@ void P_UnArchiveThinkers (void)
} }
// read in saved thinkers // 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); mobj_t *mobj = Z_Malloc(sizeof(mobj_t), PU_LEVEL, NULL);
// killough 2/14/98 -- insert pointers to thinkers into table, in order: // killough 2/14/98 -- insert pointers to thinkers into table, in order:
mobj_p[size] = mobj; mobj_p[idx] = mobj;
PADSAVEP(); PADSAVEP();
memcpy (mobj, save_p, sizeof(mobj_t)); memcpy (mobj, save_p, sizeof(mobj_t));
@ -473,12 +484,17 @@ void P_UnArchiveThinkers (void)
{ // killough 9/14/98: restore soundtargets { // killough 9/14/98: restore soundtargets
int i; int i;
for (i = 0; i < numsectors; i++) for (i = 0; i < numsectors; i++)
{ {
mobj_t *target; mobj_t *target;
memcpy(&target, save_p, sizeof target); memcpy(&target, save_p, sizeof target);
save_p += sizeof target; save_p += sizeof target;
P_SetNewTarget(&sectors[i].soundtarget, mobj_p[(size_t) target]);
} // haleyjd 11/03/06: rangecheck for security
if((size_t)target < size)
P_SetNewTarget(&sectors[i].soundtarget, mobj_p[(size_t) target]);
else
sectors[i].soundtarget = NULL;
}
} }
free(mobj_p); // free translation table free(mobj_p); // free translation table