diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index 9d0b37006..ed0895220 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -4268,32 +4268,27 @@ 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 = &sprite[ror_sprite]; - if (ror_sprite != -1) + if ((unsigned) ror_sprite >= MAXSPRITES || drawing_ror != 1) + return; + + for (k = headspritesect[sp->sectnum]; k != -1; k = nextspritesect[k]) { - spritetype *sp = &sprite[ror_sprite]; - - // viewing from bottom - if (drawing_ror == 1) + if (sprite[k].picnum != SECTOREFFECTOR && (sprite[k].z >= sp->z)) { - int32_t k; + Bmemcpy(&tsprite[spritesortcnt], &sprite[k], sizeof(spritetype)); - 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; - 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++; - } - } + //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++; } } } @@ -4303,38 +4298,35 @@ static void G_ReadGLFrame(void) { // Save OpenGL screenshot with Duke3D palette // NOTE: maybe need to move this to the engine... - begindrawing(); + palette_t *const frame = (palette_t *const) Bcalloc(xdim * ydim, sizeof(palette_t)); + char *const pic = (char *) waloff[TILE_SAVESHOT]; + + int32_t x, y; + const int32_t xf = divscale16(xdim, 320); // (xdim<<16)/320 + const int32_t yf = divscale16(ydim, 200); // (ydim<<16)/200 + + if (!frame) { - palette_t *const frame = (palette_t *const)Bcalloc(xdim*ydim, 4); - char *const pic = (char *)waloff[TILE_SAVESHOT]; + Bmemset(pic, 0, 320 * 200); + return; + } - int32_t x, y; - const int32_t xf = divscale16(xdim, 320); // (xdim<<16)/320 - const int32_t yf = divscale16(ydim, 200); // (ydim<<16)/200 + begindrawing(); + bglReadPixels(0, 0, xdim, ydim, GL_RGBA, GL_UNSIGNED_BYTE, frame); + enddrawing(); - if (!frame) + for (y = 0; y < 200; y++) + { + const int32_t base = mulscale16(200 - y - 1, yf)*xdim; + + for (x = 0; x < 320; x++) { - Bmemset(pic, 0, 320*200); - } - else - { - bglReadPixels(0,0,xdim,ydim,GL_RGBA,GL_UNSIGNED_BYTE,frame); - - for (y=0; y<200; y++) - { - const int32_t base = mulscale16(200-y-1, yf)*xdim; - - for (x=0; x<320; x++) - { - const palette_t *pix = &frame[base + mulscale16(x, xf)]; - pic[320*y + x] = getclosestcol(pix->r>>2, pix->g>>2, pix->b>>2); - } - } - - Bfree(frame); + const palette_t *pix = &frame[base + mulscale16(x, xf)]; + pic[320 * y + x] = getclosestcol(pix->r >> 2, pix->g >> 2, pix->b >> 2); } } - enddrawing(); + + Bfree(frame); } #endif diff --git a/polymer/eduke32/source/gameexec.c b/polymer/eduke32/source/gameexec.c index 142048608..39837088f 100644 --- a/polymer/eduke32/source/gameexec.c +++ b/polymer/eduke32/source/gameexec.c @@ -105,14 +105,14 @@ void VM_ScriptInfo(void) static void VM_KillIt(int32_t iActor, int32_t iPlayer) { - if (iActor >= 0) - { - // if player was set to squish, first stop that... - if (iPlayer >= 0 && g_player[iPlayer].ps->actorsqu == iActor) - g_player[iPlayer].ps->actorsqu = -1; + if ((unsigned) iActor >= MAXSPRITES) + return; - A_DeleteSprite(iActor); - } + // if player was set to squish, first stop that... + if (iPlayer >= 0 && g_player[iPlayer].ps->actorsqu == iActor) + g_player[iPlayer].ps->actorsqu = -1; + + A_DeleteSprite(iActor); } // May recurse, e.g. through EVENT_XXX -> ... -> EVENT_KILLIT diff --git a/polymer/eduke32/source/player.c b/polymer/eduke32/source/player.c index 7024d4235..499f82a02 100644 --- a/polymer/eduke32/source/player.c +++ b/polymer/eduke32/source/player.c @@ -4230,9 +4230,7 @@ void P_UpdatePosWhenViewingCam(DukePlayer_t *p) { int32_t i = p->newowner; - p->pos.x = SX; - p->pos.y = SY; - p->pos.z = SZ; + Bmemcpy(&p->pos.x, &sprite[i].x, sizeof(vec3_t)); p->ang = SA; p->vel.x = p->vel.y = sprite[p->i].xvel = 0; p->look_ang = 0;