diff --git a/polymer/eduke32/build/include/build.h b/polymer/eduke32/build/include/build.h index 5cc596680..bd16fb164 100644 --- a/polymer/eduke32/build/include/build.h +++ b/polymer/eduke32/build/include/build.h @@ -147,9 +147,6 @@ void yax_drawrooms(void (*SpriteAnimFunc)(int32_t,int32_t,int32_t,int32_t), # define YAX_SKIPWALL(i) (i)=(i) #endif -#define PICANM_TEXHITSCAN_BIT (1<<28) -#define PICANM_NOFULLBRIGHT_BIT (1<<30) - #define CLIPMASK0 (((1L)<<16)+1L) #define CLIPMASK1 (((256L)<<16)+64L) @@ -485,7 +482,32 @@ EXTERN int32_t pow2long[32]; #ifdef __cplusplus }; #endif -EXTERN int32_t picanm[MAXTILES]; + +// picanm[].sf: +// |bit(1<<7) +// |animtype|animtype|texhitscan|nofullbright|speed|speed|speed|speed| +enum { + PICANM_ANIMTYPE_NONE = 0, + PICANM_ANIMTYPE_OSC = (1<<6), + PICANM_ANIMTYPE_FWD = (2<<6), + PICANM_ANIMTYPE_BACK = (3<<6), + + PICANM_ANIMTYPE_SHIFT = 6, + PICANM_ANIMTYPE_MASK = (3<<6), // must be 192 + PICANM_MISC_MASK = (3<<4), + PICANM_TEXHITSCAN_BIT = (2<<4), + PICANM_NOFULLBRIGHT_BIT = (1<<4), + PICANM_ANIMSPEED_MASK = 15, // must be 15 +}; + +// NOTE: If the layout of this struct is changed, loadpics() must be modified +// accordingly. +typedef struct { + uint8_t num; // animate number + int8_t xofs, yofs; + uint8_t sf; // anim. speed and flags +} picanm_t; +EXTERN picanm_t picanm[MAXTILES]; EXTERN intptr_t waloff[MAXTILES]; // stores pointers to cache -- SA EXTERN int32_t windowpos, windowx, windowy; @@ -694,7 +716,7 @@ void delete_maphack_lights(); int32_t clipmapinfo_load(void); #endif int32_t saveboard(const char *filename, const vec3_t *dapos, int16_t daang, int16_t dacursectnum); -void set_picsizanm(int32_t picnum, int16_t dasizx, int16_t dasizy, int32_t daanm); +void set_tilesiz(int32_t picnum, int16_t dasizx, int16_t dasizy); int32_t loadpics(const char *filename, int32_t askedsize); void loadtile(int16_t tilenume); int32_t qloadkvx(int32_t voxindex, const char *filename); diff --git a/polymer/eduke32/build/src/build.c b/polymer/eduke32/build/src/build.c index d561d5459..4baf3beb6 100644 --- a/polymer/eduke32/build/src/build.c +++ b/polymer/eduke32/build/src/build.c @@ -2159,7 +2159,7 @@ static int32_t insert_sprite_common(int32_t sectnum, int32_t dax, int32_t day) void correct_sprite_yoffset(int32_t i) { - int32_t tileyofs = (int8_t)((picanm[sprite[i].picnum]>>16)&255); + int32_t tileyofs = picanm[sprite[i].picnum].yofs; int32_t tileysiz = tilesizy[sprite[i].picnum]; if (klabs(tileyofs) >= tileysiz) diff --git a/polymer/eduke32/build/src/defs.c b/polymer/eduke32/build/src/defs.c index a2f0bd127..1dda03cc8 100644 --- a/polymer/eduke32/build/src/defs.c +++ b/polymer/eduke32/build/src/defs.c @@ -475,18 +475,28 @@ static int32_t defsparser(scriptfile *script) if (check_tile_range("animtilerange", &tile1, &tile2, script, cmdtokptr)) break; - if (tile2-tile1 >= 64) + if (tile2-tile1 > 255) { - initprintf("Error: animtilerange: tile difference can be at most 64 on line %s:%d\n", + initprintf("Error: animtilerange: tile difference can be at most 255 on line %s:%d\n", script->filename, scriptfile_getlinum(script,cmdtokptr)); break; } spd = clamp(spd, 0, 15); - type = clamp(type, 0, 3); + if (type&~3) + { + initprintf("Error: animtilerange: animation type must be 0, 1, 2 or 3 on line %s:%d\n", + script->filename, scriptfile_getlinum(script,cmdtokptr)); + } - picanm[tile1] &= 0xf0ffff00; // clear animation fields - picanm[tile1] |= (spd<<24)+(type<<6)+tile2-tile1; + // set anim speed + picanm[tile1].sf &= ~PICANM_ANIMSPEED_MASK; + picanm[tile1].sf |= spd; + // set anim type + picanm[tile1].sf &= ~PICANM_ANIMTYPE_MASK; + picanm[tile1].sf |= type< { texhitscan } sets the bit but doesn't change tile data if (texhitscan) - picanm[tile] |= PICANM_TEXHITSCAN_BIT; + picanm[tile].sf |= PICANM_TEXHITSCAN_BIT; else initprintf("Error: missing 'file name' for tilefromtexture definition near line %s:%d\n", script->filename, scriptfile_getlinum(script,texturetokptr)); @@ -568,13 +578,11 @@ static int32_t defsparser(scriptfile *script) if (xsiz <= 0 || ysiz <= 0) break; - xoffset = clamp(xoffset, -128, 127)&255; - yoffset = clamp(yoffset, -128, 127)&255; - - set_picsizanm(tile, xsiz, ysiz, (picanm[tile]&0xff0000ff)+ - (xoffset<<8)+(yoffset<<16)); + set_tilesiz(tile, xsiz, ysiz); + picanm[tile].xofs = clamp(xoffset, -128, 127); + picanm[tile].yofs = clamp(yoffset, -128, 127); if (texhitscan) - picanm[tile] |= PICANM_TEXHITSCAN_BIT; + picanm[tile].sf |= PICANM_TEXHITSCAN_BIT; tile_from_truecolpic(tile, picptr, alphacut); @@ -604,7 +612,8 @@ static int32_t defsparser(scriptfile *script) if (check_tile("importtile", &tile, script, cmdtokptr)) break; - set_picsizanm(tile, xsiz, ysiz, 0); + set_tilesiz(tile, xsiz, ysiz); + Bmemset(&picanm[tile], 0, sizeof(picanm_t)); tile_from_truecolpic(tile, picptr, 255); @@ -621,7 +630,8 @@ static int32_t defsparser(scriptfile *script) if (xsiz > 0 && ysiz > 0) { - set_picsizanm(tile, xsiz, ysiz, 0); + set_tilesiz(tile, xsiz, ysiz); + Bmemset(&picanm[tile], 0, sizeof(picanm_t)); faketilesiz[tile] = -1; } @@ -644,7 +654,8 @@ static int32_t defsparser(scriptfile *script) for (i=tile1; i<=tile2; i++) { - set_picsizanm(i, xsiz, ysiz, 0); + set_tilesiz(i, xsiz, ysiz); + Bmemset(&picanm[i], 0, sizeof(picanm_t)); faketilesiz[i] = -1; } @@ -1950,7 +1961,7 @@ static int32_t defsparser(scriptfile *script) e = min(e, MAXTILES-1); for (i=b; i<=e; i++) - picanm[i] |= PICANM_TEXHITSCAN_BIT; + picanm[i].sf |= PICANM_TEXHITSCAN_BIT; } break; diff --git a/polymer/eduke32/build/src/engine.c b/polymer/eduke32/build/src/engine.c index bc8c20db8..5ba96d5ca 100644 --- a/polymer/eduke32/build/src/engine.c +++ b/polymer/eduke32/build/src/engine.c @@ -3096,30 +3096,32 @@ static void prepwall(int32_t z, const walltype *wal) // int32_t animateoffs(int16_t tilenum, int16_t fakevar) { - int32_t i, k, offs; + int32_t i, k, offs=0, animnum=picanm[tilenum].num; UNREFERENCED_PARAMETER(fakevar); - offs = 0; - i = (totalclocklock>>((picanm[tilenum]>>24)&15)); - if ((picanm[tilenum]&63) > 0) + i = totalclocklock>>(picanm[tilenum].sf&PICANM_ANIMSPEED_MASK); + + if (picanm[tilenum].num > 0) { - switch (picanm[tilenum]&192) + switch (picanm[tilenum].sf&PICANM_ANIMTYPE_MASK) { - case 64: - k = (i%((picanm[tilenum]&63)<<1)); - if (k < (picanm[tilenum]&63)) + case PICANM_ANIMTYPE_OSC: + k = (i%(animnum<<1)); + if (k < animnum) offs = k; else - offs = (((picanm[tilenum]&63)<<1)-k); + offs = (animnum<<1)-k; break; - case 128: - offs = (i%((picanm[tilenum]&63)+1)); + case PICANM_ANIMTYPE_FWD: + offs = i%(animnum+1); + break; + case PICANM_ANIMTYPE_BACK: + offs = -(i%(animnum+1)); break; - case 192: - offs = -(i%((picanm[tilenum]&63)+1)); } } + return(offs); } @@ -5529,8 +5531,8 @@ static void drawsprite(int32_t snum) if (cstat&512) settransreverse(); else settransnormal(); } - xoff = (int32_t)((int8_t)((picanm[tilenum]>>8)&255))+((int32_t)tspr->xoffset); - yoff = (int32_t)((int8_t)((picanm[tilenum]>>16)&255))+((int32_t)tspr->yoffset); + xoff = picanm[tilenum].xofs + tspr->xoffset; + yoff = picanm[tilenum].yofs + tspr->yoffset; if ((cstat&48) == 0) { @@ -6312,7 +6314,7 @@ draw_as_face_sprite: } if (!(cstat&128)) tspr->z -= mulscale22(B_LITTLE32(longptr[5]),nyrepeat); - yoff = /*(int32_t) ((int8_t)((picanm[sprite[tspr->owner].picnum]>>16)&255)) +*/ (int32_t)tspr->yoffset; + yoff = /*picanm[sprite[tspr->owner].picnum].yofs +*/ tspr->yoffset; tspr->z -= mulscale14(yoff,nyrepeat); globvis = globalvisibility; @@ -7037,8 +7039,8 @@ static void dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16_t { // Bit 1<<4 clear: origin is center of tile, and per-tile offset is applied. // TODO: split the two? - xoff = (int32_t)((int8_t)((picanm[picnum]>>8)&255))+(xsiz>>1); - yoff = (int32_t)((int8_t)((picanm[picnum]>>16)&255))+(ysiz>>1); + xoff = picanm[picnum].xofs + (xsiz>>1); + yoff = picanm[picnum].yofs + (ysiz>>1); } // Bit 1<<2: invert y @@ -8909,7 +8911,7 @@ killsprite: spritesz[k] = tspriteptr[k]->z; if ((tspriteptr[k]->cstat&48) != 32) { - yoff = (int32_t)((int8_t)((picanm[tspriteptr[k]->picnum]>>16)&255))+((int32_t)tspriteptr[k]->yoffset); + yoff = picanm[tspriteptr[k]->picnum].yofs + tspriteptr[k]->yoffset; spritesz[k] -= ((yoff*tspriteptr[k]->yrepeat)<<2); yspan = (tilesizy[tspriteptr[k]->picnum]*tspriteptr[k]->yrepeat<<2); if (!(tspriteptr[k]->cstat&128)) spritesz[k] -= (yspan>>1); @@ -9223,8 +9225,8 @@ void drawmapview(int32_t dax, int32_t day, int32_t zoome, int16_t ang) npoints = 0; tilenum = spr->picnum; - xoff = (int32_t)((int8_t)((picanm[tilenum]>>8)&255))+((int32_t)spr->xoffset); - yoff = (int32_t)((int8_t)((picanm[tilenum]>>16)&255))+((int32_t)spr->yoffset); + xoff = picanm[tilenum].xofs + spr->xoffset; + yoff = picanm[tilenum].yofs + spr->yoffset; if ((spr->cstat&4) > 0) xoff = -xoff; if ((spr->cstat&8) > 0) yoff = -yoff; @@ -10445,24 +10447,27 @@ void nextpage(void) numframes++; } -void set_picsizanm(int32_t picnum, int16_t dasizx, int16_t dasizy, int32_t daanm) +static void set_picsiz(int32_t picnum) { int32_t j; - tilesizx[picnum] = dasizx; - tilesizy[picnum] = dasizy; - - picanm[picnum] = daanm; - j = 15; - while ((j > 1) && (pow2long[j] > dasizx)) + while ((j > 1) && (pow2long[j] > tilesizx[picnum])) j--; picsiz[picnum] = j; j = 15; - while ((j > 1) && (pow2long[j] > dasizy)) + while ((j > 1) && (pow2long[j] > tilesizy[picnum])) j--; - picsiz[picnum] += j<<4; + picsiz[picnum] |= j<<4; +} + +void set_tilesiz(int32_t picnum, int16_t dasizx, int16_t dasizy) +{ + tilesizx[picnum] = dasizx; + tilesizy[picnum] = dasizy; + + set_picsiz(picnum); } // @@ -10528,7 +10533,16 @@ int32_t loadpics(const char *filename, int32_t askedsize) { tilesizx[i] = B_LITTLE16(tilesizx[i]); tilesizy[i] = B_LITTLE16(tilesizy[i]); - picanm[i] = B_LITTLE32(picanm[i]); + + Bassert(sizeof(picanm_t)==4); + Bassert(PICANM_ANIMTYPE_MASK == 192); + // Old on-disk format: anim type is in the 2 highest bits of the lowest byte. + picanm[i].sf &= ~192; + picanm[i].sf |= picanm[i].num&192; + picanm[i].num &= ~192; + + // don't allow setting texhitscan/nofullbright from ART (yet?) + picanm[i].sf &= ~PICANM_MISC_MASK; } offscount = 4+4+4+4+(localnumtiles<<3); @@ -10572,7 +10586,7 @@ int32_t loadpics(const char *filename, int32_t askedsize) initcache((intptr_t)pic, cachesize); for (i=0; i>1; if (alsotileyofs && (unsigned)sprite[i].picnum < MAXTILES) - if (picanm[sprite[i].picnum]&0x00ff0000) - *zofs -= ((int8_t)((picanm[sprite[i].picnum]>>16)&255))*sprite[i].yrepeat<<2; + if (picanm[sprite[i].picnum].yofs) + *zofs -= picanm[sprite[i].picnum].yofs*sprite[i].yrepeat<<2; } *height = hei; } @@ -11441,7 +11456,7 @@ restart_grand: i = (tilesizy[spr->picnum]*spr->yrepeat<<2); if (cstat&128) z1 += (i>>1); - if (picanm[spr->picnum]&0x00ff0000) z1 -= ((int32_t)((int8_t)((picanm[spr->picnum]>>16)&255))*spr->yrepeat<<2); + if (picanm[spr->picnum].yofs) z1 -= (picanm[spr->picnum].yofs*spr->yrepeat<<2); if ((intz > z1) || (intz < z1-i)) continue; topu = vx*(y1-sv->y) - vy*(x1-sv->x); @@ -11466,7 +11481,7 @@ restart_grand: //These lines get the 2 points of the rotated sprite //Given: (x1, y1) starts out as the center point tilenum = spr->picnum; - xoff = (int32_t)((int8_t)((picanm[tilenum]>>8)&255))+((int32_t)spr->xoffset); + xoff = picanm[tilenum].xofs + spr->xoffset; if ((cstat&4) > 0) xoff = -xoff; k = spr->ang; l = spr->xrepeat; dax = sintable[k&2047]*l; day = sintable[(k+1536)&2047]*l; @@ -11484,10 +11499,10 @@ restart_grand: k = ((tilesizy[tilenum]*spr->yrepeat)<<2); if (cstat&128) daz = spr->z+(k>>1); else daz = spr->z; - if (picanm[tilenum]&0x00ff0000) daz -= ((int32_t)((int8_t)((picanm[tilenum]>>16)&255))*spr->yrepeat<<2); + if (picanm[tilenum].yofs) daz -= (picanm[tilenum].yofs*spr->yrepeat<<2); if (intz > daz-k && intz < daz) { - if (picanm[tilenum]&PICANM_TEXHITSCAN_BIT) + if (picanm[tilenum].sf&PICANM_TEXHITSCAN_BIT) { // daz-intz > 0 && daz-intz < k int32_t xtex = mulscale16(ucoefup16, tilesizx[tilenum]); @@ -11529,8 +11544,8 @@ restart_grand: if (klabs(intx-sv->x)+klabs(inty-sv->y) > klabs((hit->pos.x)-sv->x)+klabs((hit->pos.y)-sv->y)) continue; tilenum = spr->picnum; - xoff = (int32_t)((int8_t)((picanm[tilenum]>>8)&255))+((int32_t)spr->xoffset); - yoff = (int32_t)((int8_t)((picanm[tilenum]>>16)&255))+((int32_t)spr->yoffset); + xoff = picanm[tilenum].xofs + spr->xoffset; + yoff = picanm[tilenum].yofs + spr->yoffset; if ((cstat&4) > 0) xoff = -xoff; if ((cstat&8) > 0) yoff = -yoff; @@ -11729,7 +11744,7 @@ void neartag(int32_t xs, int32_t ys, int32_t zs, int16_t sectnum, int16_t ange, intz = zs+scale(vz,topt,bot); i = tilesizy[spr->picnum]*spr->yrepeat; if (spr->cstat&128) z1 += (i<<1); - if (picanm[spr->picnum]&0x00ff0000) z1 -= ((int32_t)((int8_t)((picanm[spr->picnum]>>16)&255))*spr->yrepeat<<2); + if (picanm[spr->picnum].yofs) z1 -= (picanm[spr->picnum].yofs*spr->yrepeat<<2); if ((intz <= z1) && (intz >= z1-(i<<2))) { topu = vx*(y1-ys) - vy*(x1-xs); @@ -12298,7 +12313,7 @@ int32_t clipmove(vec3_t *pos, int16_t *sectnum, { k = ((tilesizy[spr->picnum]*spr->yrepeat)<<2); if (cstat&128) daz = spr->z+(k>>1); else daz = spr->z; - if (picanm[spr->picnum]&0x00ff0000) daz -= ((int32_t)((int8_t)((picanm[spr->picnum]>>16)&255))*spr->yrepeat<<2); + if (picanm[spr->picnum].yofs) daz -= (picanm[spr->picnum].yofs*spr->yrepeat<<2); if (((pos->z) < daz+ceildist) && ((pos->z) > daz-k-flordist)) { bsz = (spr->clipdist<<2)+walldist; if (gx < 0) bsz = -bsz; @@ -12311,7 +12326,7 @@ int32_t clipmove(vec3_t *pos, int16_t *sectnum, case 16: k = ((tilesizy[spr->picnum]*spr->yrepeat)<<2); if (cstat&128) daz = spr->z+(k>>1); else daz = spr->z; - if (picanm[spr->picnum]&0x00ff0000) daz -= ((int32_t)((int8_t)((picanm[spr->picnum]>>16)&255))*spr->yrepeat<<2); + if (picanm[spr->picnum].yofs) daz -= (picanm[spr->picnum].yofs*spr->yrepeat<<2); daz2 = daz-k; daz += ceildist; daz2 -= flordist; if (((pos->z) < daz) && ((pos->z) > daz2)) @@ -12319,7 +12334,7 @@ int32_t clipmove(vec3_t *pos, int16_t *sectnum, //These lines get the 2 points of the rotated sprite //Given: (x1, y1) starts out as the center point tilenum = spr->picnum; - xoff = (int32_t)((int8_t)((picanm[tilenum]>>8)&255))+((int32_t)spr->xoffset); + xoff = picanm[tilenum].xofs + spr->xoffset; if ((cstat&4) > 0) xoff = -xoff; k = spr->ang; l = spr->xrepeat; dax = sintable[k&2047]*l; day = sintable[(k+1536)&2047]*l; @@ -12358,8 +12373,8 @@ int32_t clipmove(vec3_t *pos, int16_t *sectnum, if (((pos->z) > spr->z) == ((cstat&8)==0)) continue; tilenum = spr->picnum; - xoff = (int32_t)((int8_t)((picanm[tilenum]>>8)&255))+((int32_t)spr->xoffset); - yoff = (int32_t)((int8_t)((picanm[tilenum]>>16)&255))+((int32_t)spr->yoffset); + xoff = picanm[tilenum].xofs + spr->xoffset; + yoff = picanm[tilenum].yofs + spr->yoffset; if ((cstat&4) > 0) xoff = -xoff; if ((cstat&8) > 0) yoff = -yoff; @@ -12556,7 +12571,7 @@ int32_t pushmove(vec3_t *vect, int16_t *sectnum, { t = ((tilesizy[spr->picnum]*spr->yrepeat)<<2); if (spr->cstat&128) daz = spr->z+(t>>1); else daz = spr->z; - if (picanm[spr->picnum]&0x00ff0000) daz -= ((int32_t)((int8_t)((picanm[spr->picnum]>>16)&255))*spr->yrepeat<<2); + if (picanm[spr->picnum].yofs) daz -= ((int32_t)picanm[spr->picnum].yofs*spr->yrepeat<<2); if (((vect->z) < daz+ceildist) && ((vect->z) > daz-t-flordist)) { t = (spr->clipdist<<2)+walldist; @@ -13208,15 +13223,15 @@ restart_grand: daz = spr->z; k = ((tilesizy[spr->picnum]*spr->yrepeat)<<1); if (cstat&128) daz += k; - if (picanm[spr->picnum]&0x00ff0000) - daz -= ((int32_t)((int8_t)((picanm[spr->picnum]>>16)&255))*spr->yrepeat<<2); + if (picanm[spr->picnum].yofs) + daz -= (picanm[spr->picnum].yofs*spr->yrepeat<<2); daz2 = daz - (k<<1); clipyou = 1; } break; case 16: tilenum = spr->picnum; - xoff = (int32_t)((int8_t)((picanm[tilenum]>>8)&255))+((int32_t)spr->xoffset); + xoff = picanm[tilenum].xofs + spr->xoffset; if ((cstat&4) > 0) xoff = -xoff; k = spr->ang; l = spr->xrepeat; dax = sintable[k&2047]*l; day = sintable[(k+1536)&2047]*l; @@ -13227,8 +13242,8 @@ restart_grand: { daz = spr->z; k = ((tilesizy[spr->picnum]*spr->yrepeat)<<1); if (cstat&128) daz += k; - if (picanm[spr->picnum]&0x00ff0000) - daz -= ((int32_t)((int8_t)((picanm[spr->picnum]>>16)&255))*spr->yrepeat<<2); + if (picanm[spr->picnum].yofs) + daz -= (picanm[spr->picnum].yofs*spr->yrepeat<<2); daz2 = daz-(k<<1); clipyou = 1; } @@ -13240,8 +13255,8 @@ restart_grand: if ((pos->z > daz) == ((cstat&8)==0)) continue; tilenum = spr->picnum; - xoff = (int32_t)((int8_t)((picanm[tilenum]>>8)&255))+((int32_t)spr->xoffset); - yoff = (int32_t)((int8_t)((picanm[tilenum]>>16)&255))+((int32_t)spr->yoffset); + xoff = picanm[tilenum].xofs + spr->xoffset; + yoff = picanm[tilenum].yofs + spr->yoffset; if ((cstat&4) > 0) xoff = -xoff; if ((cstat&8) > 0) yoff = -yoff; diff --git a/polymer/eduke32/build/src/engine_priv.h b/polymer/eduke32/build/src/engine_priv.h index fe8a7285c..6226be985 100644 --- a/polymer/eduke32/build/src/engine_priv.h +++ b/polymer/eduke32/build/src/engine_priv.h @@ -81,8 +81,8 @@ extern palette_t palookupfog[MAXPALOOKUPS]; int32_t wallfront(int32_t l1, int32_t l2); int32_t animateoffs(int16_t tilenum, int16_t fakevar); -#define DO_TILE_ANIM(Picnum, Fakevar) do { \ - if (picanm[Picnum]&192) Picnum += animateoffs(Picnum, Fakevar); \ +#define DO_TILE_ANIM(Picnum, Fakevar) do { \ + if (picanm[Picnum].sf&PICANM_ANIMTYPE_MASK) Picnum += animateoffs(Picnum, Fakevar); \ } while (0) void dorotspr_handle_bit2(int32_t *sx, int32_t *sy, int32_t *z, int32_t dastat, diff --git a/polymer/eduke32/build/src/polymer.c b/polymer/eduke32/build/src/polymer.c index 328f5cfe1..110648d8c 100644 --- a/polymer/eduke32/build/src/polymer.c +++ b/polymer/eduke32/build/src/polymer.c @@ -3559,8 +3559,8 @@ void polymer_updatesprite(int32_t snum) tilexoff = (int32_t)tspr->xoffset; tileyoff = (int32_t)tspr->yoffset; - tilexoff += (int8_t)((usehightile&&h_xsize[curpicnum])?(h_xoffs[curpicnum]):((picanm[curpicnum]>>8)&255)); - tileyoff += (int8_t)((usehightile&&h_xsize[curpicnum])?(h_yoffs[curpicnum]):((picanm[curpicnum]>>16)&255)); + tilexoff += (usehightile && h_xsize[curpicnum]) ? h_xoffs[curpicnum] : picanm[curpicnum].xofs; + tileyoff += (usehightile && h_xsize[curpicnum]) ? h_yoffs[curpicnum] : picanm[curpicnum].yofs; xoff = (int32_t)(tilexoff * xratio); yoff = (int32_t)(tileyoff * yratio); diff --git a/polymer/eduke32/build/src/polymost.c b/polymer/eduke32/build/src/polymost.c index 9e993254f..8e51d9173 100644 --- a/polymer/eduke32/build/src/polymost.c +++ b/polymer/eduke32/build/src/polymost.c @@ -1210,7 +1210,7 @@ static int32_t gloadtile_art(int32_t dapic, int32_t dapal, int32_t dameth, pthty } else { - const int32_t dofullbright = !(picanm[dapic]&PICANM_NOFULLBRIGHT_BIT); + const int32_t dofullbright = !(picanm[dapic].sf&PICANM_NOFULLBRIGHT_BIT); int32_t y; for (y=0; yxoffset; yoff = (int32_t)tspr->yoffset; - xoff += (int8_t)(flag ? h_xoffs[globalpicnum] : ((picanm[globalpicnum]>>8)&255)); - yoff += (int8_t)(flag ? h_yoffs[globalpicnum] : ((picanm[globalpicnum]>>16)&255)); + xoff += flag ? h_xoffs[globalpicnum] : picanm[globalpicnum].xofs; + yoff += flag ? h_yoffs[globalpicnum] : picanm[globalpicnum].yofs; } method = 1+4; @@ -5437,8 +5437,8 @@ void polymost_dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16 if (dastat&16) { xsiz = tilesizx[picnum]; ysiz = tilesizy[picnum]; - xoff = (int32_t)((int8_t)((picanm[picnum]>>8)&255))+(xsiz>>1); - yoff = (int32_t)((int8_t)((picanm[picnum]>>16)&255))+(ysiz>>1); + xoff = picanm[picnum].xofs + (xsiz>>1); + yoff = picanm[picnum].yofs + (ysiz>>1); d = (double)z/(65536.0*16384.0); cosang2 = cosang = (double)sintable[(a+512)&2047]*d; @@ -5653,8 +5653,8 @@ void polymost_dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16 } else { - xoff = (int32_t)((int8_t)((picanm[globalpicnum]>>8)&255))+(xsiz>>1); - yoff = (int32_t)((int8_t)((picanm[globalpicnum]>>16)&255))+(ysiz>>1); + xoff = picanm[globalpicnum].xofs + (xsiz>>1); + yoff = picanm[globalpicnum].yofs + (ysiz>>1); } if (dastat&4) diff --git a/polymer/eduke32/source/astub.c b/polymer/eduke32/source/astub.c index ed5b7af8b..eae75f467 100644 --- a/polymer/eduke32/source/astub.c +++ b/polymer/eduke32/source/astub.c @@ -4083,15 +4083,16 @@ static void tilescreen_drawrest(int32_t iSelected, int32_t showmsg) printext256(xdim>>2,ydim-10,whitecol,-1,szT,0); // EditArt offset flags. - Bsprintf(szT,"%d, %d", (int8_t)((picanm[idTile]>>8)&0xFF), (int8_t)((picanm[idTile]>>16)&0xFF)); + Bsprintf(szT,"%d, %d", picanm[idTile].xofs, picanm[idTile].yofs); printext256((xdim>>2)+100,ydim-10,whitecol,-1,szT,0); // EditArt animation flags. - if (picanm[idTile]&0xc0) + if (picanm[idTile].sf&PICANM_ANIMTYPE_MASK) { static const char *anmtype[] = {"", "Osc", "Fwd", "Bck"}; + int32_t ii = (picanm[idTile].sf&PICANM_ANIMTYPE_MASK)>>PICANM_ANIMTYPE_SHIFT; - Bsprintf(szT,"%s %d", anmtype[(picanm[idTile]&0xc0)>>6], picanm[idTile]&0x3f); + Bsprintf(szT,"%s %d", anmtype[ii], picanm[idTile].num); printext256((xdim>>2)+100+14*8,ydim-10,whitecol,-1,szT,0); } } @@ -4488,8 +4489,8 @@ ENDFOR1: curspr = linebegspr = startspr; t = sprite[startspr].picnum; - sprite[startspr].xoffset = -(((picanm[t])>>8)&255); - sprite[startspr].yoffset = -(((picanm[t])>>16)&255); + sprite[startspr].xoffset = -picanm[t].xofs; + sprite[startspr].yoffset = -picanm[t].yofs; spritenums = (int16_t *)Bmalloc(stackallocsize * sizeof(int16_t)); if (!spritenums) goto ERROR_NOMEMORY; @@ -4605,8 +4606,8 @@ ENDFOR1: sprite[i].picnum = t; sprite[i].ang = daang; - sprite[i].xoffset = -(((picanm[sprite[i].picnum])>>8)&255); - sprite[i].yoffset = -(((picanm[sprite[i].picnum])>>16)&255); + sprite[i].xoffset = -picanm[t].xofs; + sprite[i].yoffset = -picanm[t].yofs; sprite[i].xoffset += alphabets[alphidx].xofs[(int32_t)ch-33]; sprite[i].yoffset += alphabets[alphidx].yofs[(int32_t)ch-33]; diff --git a/polymer/eduke32/source/game.c b/polymer/eduke32/source/game.c index 5696a6704..fe6905482 100644 --- a/polymer/eduke32/source/game.c +++ b/polymer/eduke32/source/game.c @@ -2247,7 +2247,7 @@ static void G_DrawOverheadMap(int32_t cposx, int32_t cposy, int32_t czoom, int16 x1 = sprx; y1 = spry; tilenum = spr->picnum; - xoff = (int32_t)((int8_t)((picanm[tilenum]>>8)&255))+((int32_t)spr->xoffset); + xoff = picanm[tilenum].xofs + spr->xoffset; if ((spr->cstat&4) > 0) xoff = -xoff; k = spr->ang; l = spr->xrepeat; @@ -2277,10 +2277,9 @@ static void G_DrawOverheadMap(int32_t cposx, int32_t cposy, int32_t czoom, int16 break; case 32: - tilenum = spr->picnum; - xoff = (int32_t)((int8_t)((picanm[tilenum]>>8)&255))+((int32_t)spr->xoffset); - yoff = (int32_t)((int8_t)((picanm[tilenum]>>16)&255))+((int32_t)spr->yoffset); + xoff = picanm[tilenum].xofs + spr->xoffset; + yoff = picanm[tilenum].yofs + spr->yoffset; if ((spr->cstat&4) > 0) xoff = -xoff; if ((spr->cstat&8) > 0) yoff = -yoff; @@ -3841,7 +3840,7 @@ void G_DrawRooms(int32_t snum, int32_t smoothratio) const int16_t tang = (ud.screen_tilting) ? p->rotscrnang : 0; setviewback(); - picanm[TILE_TILT] &= 0xff0000ff; + picanm[TILE_TILT].xofs = picanm[TILE_TILT].yofs = 0; i = (tang&511); if (i > 256) @@ -9735,7 +9734,7 @@ static void G_Startup(void) // Make the fullscreen nuke logo background non-fullbright. Has to be // after dynamic tile remapping (from C_Compile) and loading tiles. - picanm[LOADSCREEN] |= PICANM_NOFULLBRIGHT_BIT; + picanm[LOADSCREEN].sf |= PICANM_NOFULLBRIGHT_BIT; // initprintf("Loading palette/lookups...\n"); G_LoadExtraPalettes(); diff --git a/polymer/eduke32/source/osdfuncs.c b/polymer/eduke32/source/osdfuncs.c index 55f578ade..358c3661d 100644 --- a/polymer/eduke32/source/osdfuncs.c +++ b/polymer/eduke32/source/osdfuncs.c @@ -141,7 +141,8 @@ void GAME_onshowosd(int32_t shown) // most of this is copied from my dummytile stuff in defs.c if (!tilesizx[BGTILE] || !tilesizy[BGTILE]) { - set_picsizanm(BGTILE, BGTILE_SIZEX, BGTILE_SIZEY, 0); + set_tilesiz(BGTILE, BGTILE_SIZEX, BGTILE_SIZEY); + Bmemset(&picanm[BGTILE], 0, sizeof(picanm_t)); faketilesiz[BGTILE] = -1; } diff --git a/polymer/eduke32/source/premap.c b/polymer/eduke32/source/premap.c index 0b887dec5..0238fccdc 100644 --- a/polymer/eduke32/source/premap.c +++ b/polymer/eduke32/source/premap.c @@ -49,7 +49,7 @@ extern int32_t g_levelTextTime; static void tloadtile(int32_t tilenume, int32_t type) { - if ((picanm[tilenume]&63) < 1) + if (picanm[tilenume].num < 1) { if (!(gotpic[tilenume>>3] & pow2char[tilenume&7])) g_precacheCount++; gotpic[tilenume>>3] |= pow2char[tilenume&7]; @@ -60,15 +60,15 @@ static void tloadtile(int32_t tilenume, int32_t type) { int32_t i,j; - if ((picanm[tilenume]&192)==192) + if ((picanm[tilenume].sf&PICANM_ANIMTYPE_MASK)==PICANM_ANIMTYPE_BACK) { - i = tilenume - (picanm[tilenume]&63); + i = tilenume - picanm[tilenume].num; j = tilenume; } else { i = tilenume; - j = tilenume + (picanm[tilenume]&63); + j = tilenume + picanm[tilenume].num; } for (; i<=j; i++) {