From 2dd9b7e495a5fbf8e3be36b9650fa5a3612e5bfa Mon Sep 17 00:00:00 2001 From: helixhorned Date: Sat, 28 Dec 2013 17:04:34 +0000 Subject: [PATCH] Clean up legacy ROR code and introduce LEGACY_ROR define in game.h. Also, bound-check two .yvel meant as sprite indices in actors.c. git-svn-id: https://svn.eduke32.com/eduke32@4228 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/source/actors.c | 4 +- polymer/eduke32/source/game.c | 134 +++++++++++++++----------------- polymer/eduke32/source/game.h | 7 +- polymer/eduke32/source/premap.c | 4 +- 4 files changed, 71 insertions(+), 78 deletions(-) diff --git a/polymer/eduke32/source/actors.c b/polymer/eduke32/source/actors.c index 75e284da2..1fc8052b4 100644 --- a/polymer/eduke32/source/actors.c +++ b/polymer/eduke32/source/actors.c @@ -2781,7 +2781,7 @@ ACTOR_STATIC void Proj_MoveCustom(int32_t i) } if (!(proj->workslike & PROJECTILE_BOUNCESOFFWALLS) && - s->yvel >= 0 && sprite[s->yvel].sectnum != MAXSECTORS) + (unsigned)s->yvel < MAXSPRITES && sprite[s->yvel].sectnum != MAXSECTORS) if (FindDistance2D(s->x-sprite[s->yvel].x, s->y-sprite[s->yvel].y) < 256) j = 49152|s->yvel; @@ -3059,7 +3059,7 @@ ACTOR_STATIC void G_MoveWeapons(void) } - if (s->picnum == RPG && s->yvel >= 0) + if (s->picnum == RPG && (unsigned)s->yvel < MAXSPRITES) if (FindDistance2D(s->x-sprite[s->yvel].x,s->y-sprite[s->yvel].y) < 256) j = 49152|s->yvel; diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index f26b18219..e750b4813 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -4026,22 +4026,55 @@ void G_DrawBackground(void) pus = pub = NUMPAGES; } -static int32_t ror_sprite = -1; - -extern float r_ambientlight; - +#ifdef LEGACY_ROR char ror_protectedsectors[MAXSECTORS]; static int32_t drawing_ror = 0; +static int32_t ror_sprite = -1; + +static void G_OROR_DupeSprites(const spritetype *sp) +{ + // dupe the sprites touching the portal to the other sector + int32_t k; + const spritetype *refsp; + + if ((unsigned)sp->yvel >= (unsigned)playerswhenstarted) + return; + + refsp = &sprite[sp->yvel]; + + for (SPRITES_OF_SECT(sp->sectnum, k)) + { + if (spritesortcnt >= MAXSPRITESONSCREEN) + break; + + if (sprite[k].picnum != SECTOREFFECTOR && sprite[k].z >= sp->z) + { + Bmemcpy(&tsprite[spritesortcnt], &sprite[k], sizeof(spritetype)); + + tsprite[spritesortcnt].x += (refsp->x - sp->x); + tsprite[spritesortcnt].y += (refsp->y - sp->y); + tsprite[spritesortcnt].z = tsprite[spritesortcnt].z - sp->z + actor[sp->yvel].ceilingz; + tsprite[spritesortcnt].sectnum = refsp->sectnum; + tsprite[spritesortcnt].owner = k; + +// OSD_Printf("duped sprite of pic %d at %d %d %d\n",tsprite[spritesortcnt].picnum,tsprite[spritesortcnt].x,tsprite[spritesortcnt].y,tsprite[spritesortcnt].z); + spritesortcnt++; + } + } +} static void G_SE40(int32_t smoothratio) { - if (ror_sprite != -1) + if ((unsigned)ror_sprite < MAXSPRITES) { int32_t x, y, z; int16_t sect; int32_t level = 0; - spritetype *sp = &sprite[ror_sprite]; - int32_t sprite2 = sp->yvel; + const spritetype *const sp = &sprite[ror_sprite]; + const int32_t sprite2 = sp->yvel; + + if ((unsigned)sprite2 >= MAXSPRITES) + return; if (klabs(sector[sp->sectnum].floorz - sp->z) < klabs(sector[sprite[sprite2].sectnum].floorz - sprite[sprite2].z)) level = 1; @@ -4056,6 +4089,7 @@ static void G_SE40(int32_t smoothratio) if (sect != -1) { int32_t renderz, picnum; + // XXX: PK: too large stack allocation for my taste int16_t backupstat[MAXSECTORS]; int32_t backupz[MAXSECTORS]; int32_t i; @@ -4111,35 +4145,12 @@ static void G_SE40(int32_t smoothratio) if (getrendermode() == REND_POLYMER) polymer_setanimatesprites(G_DoSpriteAnimations, CAMERA(pos.x), CAMERA(pos.y), CAMERA(ang), smoothratio); #endif - drawrooms(sprite[sprite2].x + x, sprite[sprite2].y + y, z + renderz, CAMERA(ang), CAMERA(horiz), sect); drawing_ror = 1 + level; - // dupe the sprites touching the portal to the other sector - if (drawing_ror == 2) // viewing from top - { - int32_t k = headspritesect[sp->sectnum]; - - while (k != -1 && spritesortcnt < MAXSPRITESONSCREEN) - { - if (sprite[k].picnum != SECTOREFFECTOR && (sprite[k].z >= sp->z)) - { - Bmemcpy((spritetype *)&tsprite[spritesortcnt],(spritetype *)&sprite[k],sizeof(spritetype)); - - tsprite[spritesortcnt].x += (sprite[sp->yvel].x-sp->x); - tsprite[spritesortcnt].y += (sprite[sp->yvel].y-sp->y); - tsprite[spritesortcnt].z = tsprite[spritesortcnt].z - sp->z + actor[sp->yvel].ceilingz; - tsprite[spritesortcnt].sectnum = sprite[sp->yvel].sectnum; - tsprite[spritesortcnt].owner = k; - - //OSD_Printf("duped sprite of pic %d at %d %d %d\n",tsprite[spritesortcnt].picnum,tsprite[spritesortcnt].x,tsprite[spritesortcnt].y,tsprite[spritesortcnt].z); - spritesortcnt++; - } - k = nextspritesect[k]; - } - } + G_OROR_DupeSprites(sp); G_DoSpriteAnimations(CAMERA(pos.x),CAMERA(pos.y),CAMERA(ang),smoothratio); drawmasks(); @@ -4166,6 +4177,7 @@ static void G_SE40(int32_t smoothratio) } } } +#endif void G_HandleMirror(int32_t x, int32_t y, int32_t z, int32_t a, int32_t horiz, int32_t smoothratio) { @@ -4258,36 +4270,6 @@ void G_HandleMirror(int32_t x, int32_t y, int32_t z, int32_t a, int32_t horiz, i } } -static void G_OROR_DupeSprites(void) -{ - // dupe the sprites touching the portal to the other sector - // viewing from bottom - int32_t k; - spritetype *sp; - - if ((unsigned) ror_sprite >= MAXSPRITES || drawing_ror != 1) - return; - - sp = &sprite[ror_sprite]; - - for (k = headspritesect[sp->sectnum]; k != -1; k = nextspritesect[k]) - { - if (sprite[k].picnum != SECTOREFFECTOR && (sprite[k].z >= sp->z)) - { - Bmemcpy(&tsprite[spritesortcnt], &sprite[k], sizeof(spritetype)); - - tsprite[spritesortcnt].x += (sprite[sp->yvel].x - sp->x); - tsprite[spritesortcnt].y += (sprite[sp->yvel].y - sp->y); - tsprite[spritesortcnt].z = tsprite[spritesortcnt].z - sp->z + actor[sp->yvel].ceilingz; - tsprite[spritesortcnt].sectnum = sprite[sp->yvel].sectnum; - tsprite[spritesortcnt].owner = k; - - //OSD_Printf("duped sprite of pic %d at %d %d %d\n",tsprite[spritesortcnt].picnum,tsprite[spritesortcnt].x,tsprite[spritesortcnt].y,tsprite[spritesortcnt].z); - spritesortcnt++; - } - } -} - #ifdef USE_OPENGL static void G_ReadGLFrame(void) { @@ -4375,9 +4357,9 @@ void G_DrawRooms(int32_t snum, int32_t smoothratio) CAMERA(ang) = actor[ud.camerasprite].tempang + mulscale16(((s->ang+1024-actor[ud.camerasprite].tempang)&2047)-1024, smoothratio); - +#ifdef LEGACY_ROR G_SE40(smoothratio); - +#endif #ifdef POLYMER if (getrendermode() == REND_POLYMER) polymer_setanimatesprites(G_DoSpriteAnimations, s->x, s->y, CAMERA(ang), smoothratio); @@ -4603,9 +4585,9 @@ void G_DrawRooms(int32_t snum, int32_t smoothratio) "other values are reserved.\n"); G_HandleMirror(CAMERA(pos.x), CAMERA(pos.y), CAMERA(pos.z), CAMERA(ang), CAMERA(horiz), smoothratio); - +#ifdef LEGACY_ROR G_SE40(smoothratio); - +#endif #ifdef POLYMER if (getrendermode() == REND_POLYMER) polymer_setanimatesprites(G_DoSpriteAnimations, CAMERA(pos.x),CAMERA(pos.y),CAMERA(ang),smoothratio); @@ -4619,12 +4601,14 @@ void G_DrawRooms(int32_t snum, int32_t smoothratio) yax_preparedrawrooms(); drawrooms(CAMERA(pos.x),CAMERA(pos.y),CAMERA(pos.z),CAMERA(ang),CAMERA(horiz),CAMERA(sect)); yax_drawrooms(G_DoSpriteAnimations, CAMERA(sect), 0, smoothratio); - - G_OROR_DupeSprites(); - +#ifdef LEGACY_ROR + if ((unsigned)ror_sprite < MAXSPRITES && drawing_ror == 1) // viewing from bottom + G_OROR_DupeSprites(&sprite[ror_sprite]); +#endif G_DoSpriteAnimations(CAMERA(pos.x),CAMERA(pos.y),CAMERA(ang),smoothratio); - +#ifdef LEGACY_ROR drawing_ror = 0; +#endif drawmasks(); #endif } @@ -6293,6 +6277,7 @@ int32_t A_Spawn(int32_t j, int32_t pn) switch (sp->lotag) { +#ifdef LEGACY_ROR case 40: case 41: sp->cstat = 32; @@ -6311,6 +6296,7 @@ int32_t A_Spawn(int32_t j, int32_t pn) case 46: ror_protectedsectors[sp->sectnum] = 1; /* XXX: fall-through intended? */ +#endif case SE_49_POINT_LIGHT: case SE_50_SPOT_LIGHT: { @@ -7081,9 +7067,9 @@ void G_DoSpriteAnimations(int32_t ourx, int32_t oury, int32_t oura, int32_t smoo #endif return; } - +#ifdef LEGACY_ROR ror_sprite = -1; - +#endif for (j=spritesortcnt-1; j>=0; j--) { spritetype *const t = &tsprite[j]; @@ -7096,8 +7082,10 @@ void G_DoSpriteAnimations(int32_t ourx, int32_t oury, int32_t oura, int32_t smoo if (s->lotag == 40 || s->lotag == 41) { t->cstat = 32768; - - if (ror_sprite == -1) ror_sprite = i; +#ifdef LEGACY_ROR + if (ror_sprite == -1) + ror_sprite = i; +#endif } if (t->lotag == SE_27_DEMO_CAM && ud.recstat == 1) diff --git a/polymer/eduke32/source/game.h b/polymer/eduke32/source/game.h index f1e3f1ef2..d53a9a830 100644 --- a/polymer/eduke32/source/game.h +++ b/polymer/eduke32/source/game.h @@ -25,6 +25,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "premap.h" +// Compile game-side legacy Room over Room code? +#define LEGACY_ROR 1 + #define USERQUOTE_LEFTOFFSET 5 #define USERQUOTE_RIGHTOFFSET 14 @@ -254,7 +257,9 @@ extern const char *G_DefaultRtsFile(void); extern char g_modDir[BMAX_PATH]; extern char inputloc; +#ifdef LEGACY_ROR extern char ror_protectedsectors[MAXSECTORS]; +#endif extern float r_ambientlight; @@ -263,7 +268,7 @@ extern int32_t althud_numberpal; extern int32_t althud_numbertile; extern int32_t althud_shadows; extern int32_t cacnum; -//extern int32_t drawing_ror; + extern int32_t g_Shareware; #if !defined LUNATIC extern int32_t g_cameraClock; diff --git a/polymer/eduke32/source/premap.c b/polymer/eduke32/source/premap.c index 768644fa8..03e15ef8d 100644 --- a/polymer/eduke32/source/premap.c +++ b/polymer/eduke32/source/premap.c @@ -1028,9 +1028,9 @@ static inline void prelevel(char g) G_GameExit("OUT OF MEMORY in prelevel()"); Bmemset(show2dsector, 0, sizeof(show2dsector)); - +#ifdef LEGACY_ROR Bmemset(ror_protectedsectors, 0, MAXSECTORS); - +#endif resetprestat(0,g); g_numClouds = 0;