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!!
#ifdef _WIN32
putenv("SDL_VIDEO_WINDOW_POS=center") ;
putenv("SDL_VIDEO_CENTERED=1") ;
// Allow -gdi as a shortcut for using the windib driver.

View File

@ -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);
}
//

View File

@ -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(&sectors[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(&sectors[i].soundtarget, mobj_p[(size_t) target]);
else
sectors[i].soundtarget = NULL;
}
}
free(mobj_p); // free translation table