diff --git a/source/build/include/build.h b/source/build/include/build.h index 66a6ed374..7ec95e0aa 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -155,7 +155,11 @@ EXTERN int leveltimer; inline sectortype* spritetype::sector() const { +#ifdef _DEBUG + return sectnum < 0? nullptr : &::sector[sectnum]; +#else return &::sector[sectnum]; +#endif } inline sectortype* walltype::nextSector() const diff --git a/source/games/duke/src/dispatch.cpp b/source/games/duke/src/dispatch.cpp index fdd68fd6b..7589e9585 100644 --- a/source/games/duke/src/dispatch.cpp +++ b/source/games/duke/src/dispatch.cpp @@ -124,6 +124,7 @@ void SetDispatcher() checkhitceiling_d, checkhitsprite_d, checksectors_d, + spawninit_d, ceilingspace_d, floorspace_d, @@ -167,6 +168,7 @@ void SetDispatcher() checkhitceiling_r, checkhitsprite_r, checksectors_r, + spawninit_r, ceilingspace_r, floorspace_r, diff --git a/source/games/duke/src/duke3d.h b/source/games/duke/src/duke3d.h index e230126ea..b769231c0 100644 --- a/source/games/duke/src/duke3d.h +++ b/source/games/duke/src/duke3d.h @@ -88,6 +88,7 @@ struct Dispatcher bool (*checkhitceiling)(sectortype* sn); void (*checkhitsprite)(DDukeActor* i, DDukeActor* sn); void (*checksectors)(int low); + DDukeActor* (*spawninit)(DDukeActor* actj, DDukeActor* act); bool (*ceilingspace)(sectortype* sectp); bool (*floorspace)(sectortype* sectp); diff --git a/source/games/duke/src/dukeactor.h b/source/games/duke/src/dukeactor.h index 92230cc67..d01ceb310 100644 --- a/source/games/duke/src/dukeactor.h +++ b/source/games/duke/src/dukeactor.h @@ -138,14 +138,7 @@ inline DDukeActor* ScriptIndexToActor(int index) return &hittype[index]; } -int spawn_d(int j, int pn); -int spawn_r(int j, int pn); - -inline DDukeActor* spawn(DDukeActor* spawner, int type) -{ - int i = (isRR()? spawn_r : spawn_d)(spawner ? spawner->GetSpriteIndex() : -1, type); - return i == -1 ? nullptr : &hittype[i]; -} +DDukeActor* spawn(DDukeActor* spawner, int type); inline int ldist(DDukeActor* s1, DDukeActor* s2) { diff --git a/source/games/duke/src/funct.h b/source/games/duke/src/funct.h index 61be4d07e..6075134a8 100644 --- a/source/games/duke/src/funct.h +++ b/source/games/duke/src/funct.h @@ -178,13 +178,19 @@ void lotsofcolourglass(DDukeActor* snum, walltype* wallNum, int cnt); void lotsofglass(DDukeActor* snum, walltype* wallnum, int cnt); void checkplayerhurt_d(struct player_struct* p, const Collision& coll); void checkplayerhurt_r(struct player_struct* p, const Collision& coll); +DDukeActor* dospawnsprite(DDukeActor* actj, int pn); + +void spriteinit_d(int); +void spriteinit_r(int); +DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act); +DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act); void addspritetodelete(int spnum=0); void checkavailinven(struct player_struct* p); -int initspriteforspawn(DDukeActor* j, int pn, const std::initializer_list &excludes); +int initspriteforspawn(int spn, const std::initializer_list &excludes); void spawninitdefault(DDukeActor* actj, DDukeActor* act); void spawntransporter(DDukeActor* actj, DDukeActor* acti, bool beam); -int spawnbloodpoolpart1(DDukeActor* actj, DDukeActor* acti); +int spawnbloodpoolpart1(DDukeActor* acti); void initfootprint(DDukeActor* actj, DDukeActor* acti); void initshell(DDukeActor* actj, DDukeActor* acti, bool isshell); void initcrane(DDukeActor* actj, DDukeActor* acti, int CRANEPOLE); diff --git a/source/games/duke/src/premap_d.cpp b/source/games/duke/src/premap_d.cpp index 47c766cd1..198483c3a 100644 --- a/source/games/duke/src/premap_d.cpp +++ b/source/games/duke/src/premap_d.cpp @@ -269,6 +269,11 @@ void cacheit_d(void) // // //--------------------------------------------------------------------------- +void spriteinit_d(int i) +{ + i = initspriteforspawn(i, { CRACK1, CRACK2, CRACK3, CRACK4, SPEAKER, LETTER, DUCK, TARGET, TRIPBOMB, VIEWSCREEN, VIEWSCREEN2 }); + if ((i & 0x1000000)) spawninit_d(nullptr, &hittype[i&0xffffff]); +} void prelevel_d(int g) { @@ -318,7 +323,7 @@ void prelevel_d(int g) { if (spr->picnum == SECTOREFFECTOR && spr->lotag == SE_14_SUBWAY_CAR) continue; - spawn(nullptr, i); + spriteinit_d(i); } } @@ -328,7 +333,7 @@ void prelevel_d(int g) if (spr->statnum < MAXSTATUS) { if (spr->picnum == SECTOREFFECTOR && spr->lotag == SE_14_SUBWAY_CAR) - spawn(nullptr, i); + spriteinit_d(i); } } lotaglist = 0; diff --git a/source/games/duke/src/premap_r.cpp b/source/games/duke/src/premap_r.cpp index 7911df95a..16ec66463 100644 --- a/source/games/duke/src/premap_r.cpp +++ b/source/games/duke/src/premap_r.cpp @@ -407,6 +407,12 @@ void cacheit_r(void) // //--------------------------------------------------------------------------- +void spriteinit_r(int i) +{ + i = initspriteforspawn(i, { CRACK1, CRACK2, CRACK3, CRACK4 }); + if ((i & 0x1000000)) spawninit_r(nullptr, &hittype[i & 0xffffff]); +} + void prelevel_r(int g) { struct player_struct* p; @@ -635,9 +641,9 @@ void prelevel_r(int g) auto spr = &sprite[i]; if (spr->statnum < MAXSTATUS) { - if (spr->picnum == SECTOREFFECTOR && spr->lotag == 14) + if (spr->picnum == SECTOREFFECTOR && spr->lotag == SE_14_SUBWAY_CAR) continue; - spawn(nullptr, i); + spriteinit_r(i); } } @@ -646,8 +652,8 @@ void prelevel_r(int g) auto spr = &sprite[i]; if (spr->statnum < MAXSTATUS) { - if (spr->picnum == SECTOREFFECTOR && spr->lotag == 14) - spawn(nullptr, i); + if (spr->picnum == SECTOREFFECTOR && spr->lotag == SE_14_SUBWAY_CAR) + spriteinit_r(i); } if (spr->picnum == RRTILE19) deletesprite(i); diff --git a/source/games/duke/src/spawn.cpp b/source/games/duke/src/spawn.cpp index 5e64639f2..4a481e5a3 100644 --- a/source/games/duke/src/spawn.cpp +++ b/source/games/duke/src/spawn.cpp @@ -137,96 +137,99 @@ DDukeActor* EGS(sectortype* whatsectp, int s_x, int s_y, int s_z, int s_pn, int8 // //--------------------------------------------------------------------------- -int initspriteforspawn(DDukeActor* actj, int pn, const std::initializer_list &excludes) +int initspriteforspawn(int i, const std::initializer_list &excludes) { - spritetype* sp; - int* t; - int i = -1; + auto act = &hittype[i]; + auto sp = act->s; + auto t = act->temp_data; + act->picnum = sp->picnum; + act->timetosleep = 0; + act->extra = -1; + + sp->backuppos(); + + act->SetOwner(act); + act->SetHitOwner(act); + act->cgg = 0; + act->movflag = 0; + act->tempang = 0; + act->dispicnum = 0; + act->floorz = sp->sector()->floorz; + act->ceilingz = sp->sector()->ceilingz; + + act->lastvx = 0; + act->lastvy = 0; + act->actorstayput = nullptr; + + t[0] = t[1] = t[2] = t[3] = t[4] = t[5] = 0; + act->temp_actor = nullptr; + + if (sp->cstat & 48) + if (!isIn(sp->picnum, excludes) && (sp->cstat & 48)) + { + if (sp->shade == 127) return i; + if (wallswitchcheck(act) && (sp->cstat & 16)) + { + if (sp->picnum != TILE_ACCESSSWITCH && sp->picnum != TILE_ACCESSSWITCH2 && sp->pal) + { + if ((ud.multimode < 2) || (ud.multimode > 1 && ud.coop == 1)) + { + sp->xrepeat = sp->yrepeat = 0; + sp->cstat = sp->lotag = sp->hitag = 0; + return i; + } + } + sp->cstat |= 257; + if (sp->pal && sp->picnum != TILE_ACCESSSWITCH && sp->picnum != TILE_ACCESSSWITCH2) + sp->pal = 0; + return i; + } + + if (sp->hitag) + { + changespritestat(i, 12); + sp->cstat |= 257; + sp->extra = gs.impact_damage; + return i; + } + } + + int s = sp->picnum; + + if (sp->cstat & 1) sp->cstat |= 256; + + if (gs.actorinfo[s].scriptaddress) + { + sp->extra = ScriptCode[gs.actorinfo[s].scriptaddress]; + t[4] = ScriptCode[gs.actorinfo[s].scriptaddress+1]; + t[1] = ScriptCode[gs.actorinfo[s].scriptaddress+2]; + int s3 = ScriptCode[gs.actorinfo[s].scriptaddress+3]; + if (s3 && sp->hitag == 0) + sp->hitag = s3; + } + else t[1] = t[4] = 0; + return i | 0x1000000; +} + +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +DDukeActor* spawn(DDukeActor* actj, int pn) +{ if (actj) { auto spawned = EGS(actj->s->sector(), actj->s->x, actj->s->y, actj->s->z, pn, 0, 0, 0, 0, 0, 0, actj, 0); if (spawned) { spawned->picnum = actj->s->picnum; - i = spawned->GetSpriteIndex(); + return fi.spawninit(actj, spawned); } } - else - { - i = pn; - auto act = &hittype[i]; - sp = act->s; - t = act->temp_data; - - act->picnum = sp->picnum; - act->timetosleep = 0; - act->extra = -1; - - sp->backuppos(); - - act->SetOwner(act); - act->SetHitOwner(act); - act->cgg = 0; - act->movflag = 0; - act->tempang = 0; - act->dispicnum = 0; - act->floorz = sp->sector()->floorz; - act->ceilingz = sp->sector()->ceilingz; - - act->lastvx = 0; - act->lastvy = 0; - act->actorstayput = nullptr; - - t[0] = t[1] = t[2] = t[3] = t[4] = t[5] = 0; - act->temp_actor = nullptr; - - if (sp->cstat & 48) - if (!isIn(sp->picnum, excludes) && (sp->cstat & 48)) - { - if (sp->shade == 127) return i; - if (wallswitchcheck(act) && (sp->cstat & 16)) - { - if (sp->picnum != TILE_ACCESSSWITCH && sp->picnum != TILE_ACCESSSWITCH2 && sp->pal) - { - if ((ud.multimode < 2) || (ud.multimode > 1 && ud.coop == 1)) - { - sp->xrepeat = sp->yrepeat = 0; - sp->cstat = sp->lotag = sp->hitag = 0; - return i; - } - } - sp->cstat |= 257; - if (sp->pal && sp->picnum != TILE_ACCESSSWITCH && sp->picnum != TILE_ACCESSSWITCH2) - sp->pal = 0; - return i; - } - - if (sp->hitag) - { - changespritestat(i, 12); - sp->cstat |= 257; - sp->extra = gs.impact_damage; - return i; - } - } - - int s = sp->picnum; - - if (sp->cstat & 1) sp->cstat |= 256; - - if (gs.actorinfo[s].scriptaddress) - { - sp->extra = ScriptCode[gs.actorinfo[s].scriptaddress]; - t[4] = ScriptCode[gs.actorinfo[s].scriptaddress+1]; - t[1] = ScriptCode[gs.actorinfo[s].scriptaddress+2]; - int s3 = ScriptCode[gs.actorinfo[s].scriptaddress+3]; - if (s3 && sp->hitag == 0) - sp->hitag = s3; - } - else t[1] = t[4] = 0; - } - return i | 0x1000000; + return nullptr; } //--------------------------------------------------------------------------- @@ -342,7 +345,7 @@ void spawntransporter(DDukeActor *actj, DDukeActor* acti, bool beam) // //--------------------------------------------------------------------------- -int spawnbloodpoolpart1(DDukeActor *actj, DDukeActor* acti) +int spawnbloodpoolpart1(DDukeActor* acti) { auto sp = acti->s; auto s1 = sp->sector(); diff --git a/source/games/duke/src/spawn_d.cpp b/source/games/duke/src/spawn_d.cpp index e7d18f4d4..ea0673e09 100644 --- a/source/games/duke/src/spawn_d.cpp +++ b/source/games/duke/src/spawn_d.cpp @@ -41,24 +41,17 @@ source as it is released. BEGIN_DUKE_NS -int spawn_d(int j, int pn) +DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act) { - int x; - - auto actj = j < 0 ? nullptr : &hittype[j]; - int i = initspriteforspawn(actj, pn, { CRACK1, CRACK2, CRACK3, CRACK4, SPEAKER, LETTER, DUCK, TARGET, TRIPBOMB, VIEWSCREEN, VIEWSCREEN2 }); - if (!(i & 0x1000000)) return i; - i &= 0xffffff; - auto act = &hittype[i]; auto sp = act->s; - auto spj = j < 0 ? nullptr : actj->s; + auto spj = actj == nullptr ? nullptr : actj->s; auto t = act->temp_data; auto sectp = sp->sector(); - if (isWorldTour()) + if (isWorldTour()) { - switch (sp->picnum) + switch (sp->picnum) { case BOSS2STAYPUT: case BOSS3STAYPUT: @@ -67,1169 +60,1175 @@ int spawn_d(int j, int pn) [[fallthrough]]; case FIREFLY: case BOSS5: - if (sp->picnum != FIREFLY) + if (sp->picnum != FIREFLY) { - if (j >= 0 && spj->picnum == RESPAWN) + if (spj && spj->picnum == RESPAWN) sp->pal = spj->pal; - if (sp->pal != 0) + if (sp->pal != 0) { sp->clipdist = 80; sp->xrepeat = 40; sp->yrepeat = 40; - } - else + } + else { sp->xrepeat = 80; sp->yrepeat = 80; sp->clipdist = 164; } } - else + else { sp->xrepeat = 40; sp->yrepeat = 40; sp->clipdist = 80; } - if (j >= 0) + if (spj) sp->lotag = 0; - if ((sp->lotag > ud.player_skill) || ud.monsters_off) + if ((sp->lotag > ud.player_skill) || ud.monsters_off) { sp->xrepeat = sp->yrepeat = 0; changeactorstat(act, STAT_MISC); break; - } - else + } + else { makeitfall(act); sp->cstat |= 257; ps[connecthead].max_actors_killed++; - if (j >= 0) { + if (spj) { act->timetosleep = 0; check_fta_sounds_d(act); - changespritestat(i, 1); - } else - changespritestat(i, 2); + changeactorstat(act, 1); + } + else + changeactorstat(act, 2); } - return i; + return act; case FIREFLYFLYINGEFFECT: act->SetOwner(actj); - changespritestat(i, STAT_MISC); + changeactorstat(act, STAT_MISC); sp->xrepeat = 16; sp->yrepeat = 16; - return i; + return act; case LAVAPOOLBUBBLE: if (spj->xrepeat < 30) - return i; + return act; act->SetOwner(actj); - changespritestat(i, STAT_MISC); + changeactorstat(act, STAT_MISC); sp->x += krand() % 512 - 256; sp->y += krand() % 512 - 256; sp->xrepeat = 16; sp->yrepeat = 16; - return i; + return act; case WHISPYSMOKE: - changespritestat(i, STAT_MISC); + changeactorstat(act, STAT_MISC); sp->x += krand() % 256 - 128; sp->y += krand() % 256 - 128; sp->xrepeat = 20; sp->yrepeat = 20; - return i; + return act; case SERIOUSSAM: - changespritestat(i, 2); + changeactorstat(act, 2); sp->cstat = 257; sp->extra = 150; - return i; + return act; } } - switch(sp->picnum) + switch (sp->picnum) { - default: - spawninitdefault(actj, act); - break; - case FOF: - sp->xrepeat = sp->yrepeat = 0; - changespritestat(i, STAT_MISC); - break; - case WATERSPLASH2: - if(j >= 0) - { - setsprite(i,spj->x,spj->y,spj->z); - sp->xrepeat = sp->yrepeat = 8+(krand()&7); - } - else sp->xrepeat = sp->yrepeat = 16+(krand()&15); + default: + spawninitdefault(actj, act); + break; + case FOF: + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + case WATERSPLASH2: + if (spj) + { + setsprite(act, spj->x, spj->y, spj->z); + sp->xrepeat = sp->yrepeat = 8 + (krand() & 7); + } + else sp->xrepeat = sp->yrepeat = 16 + (krand() & 15); - sp->shade = -16; - sp->cstat |= 128; - if(j >= 0) - { - if(spj->sector()->lotag == 2) - { - sp->z = getceilzofslope(sp->sectnum,sp->x,sp->y)+(16<<8); - sp->cstat |= 8; - } - else if( spj->sector()->lotag == 1) - sp->z = getflorzofslope(sp->sectnum,sp->x,sp->y); - } + sp->shade = -16; + sp->cstat |= 128; + if (spj) + { + if (spj->sector()->lotag == 2) + { + sp->z = getceilzofslope(sp->sectnum, sp->x, sp->y) + (16 << 8); + sp->cstat |= 8; + } + else if (spj->sector()->lotag == 1) + sp->z = getflorzofslope(sp->sectnum, sp->x, sp->y); + } - if(sectp->floorpicnum == FLOORSLIME || - sectp->ceilingpicnum == FLOORSLIME) - sp->pal = 7; - [[fallthrough]]; - case NEON1: - case NEON2: - case NEON3: - case NEON4: - case NEON5: - case NEON6: - case DOMELITE: - if(sp->picnum != WATERSPLASH2) - sp->cstat |= 257; - [[fallthrough]]; - case NUKEBUTTON: - if(sp->picnum == DOMELITE) - sp->cstat |= 257; - [[fallthrough]]; - case JIBS1: - case JIBS2: - case JIBS3: - case JIBS4: - case JIBS5: - case JIBS6: - case HEADJIB1: - case ARMJIB1: - case LEGJIB1: - case LIZMANHEAD1: - case LIZMANARM1: - case LIZMANLEG1: - case DUKETORSO: - case DUKEGUN: - case DUKELEG: - changespritestat(i, STAT_MISC); - break; - case TONGUE: - if(j >= 0) - sp->ang = spj->ang; - sp->z -= PHEIGHT_DUKE; - sp->zvel = 256-(krand()&511); - sp->xvel = 64-(krand()&127); - changespritestat(i,4); - break; - case NATURALLIGHTNING: - sp->cstat &= ~257; + if (sectp->floorpicnum == FLOORSLIME || + sectp->ceilingpicnum == FLOORSLIME) + sp->pal = 7; + [[fallthrough]]; + case NEON1: + case NEON2: + case NEON3: + case NEON4: + case NEON5: + case NEON6: + case DOMELITE: + if (sp->picnum != WATERSPLASH2) + sp->cstat |= 257; + [[fallthrough]]; + case NUKEBUTTON: + if (sp->picnum == DOMELITE) + sp->cstat |= 257; + [[fallthrough]]; + case JIBS1: + case JIBS2: + case JIBS3: + case JIBS4: + case JIBS5: + case JIBS6: + case HEADJIB1: + case ARMJIB1: + case LEGJIB1: + case LIZMANHEAD1: + case LIZMANARM1: + case LIZMANLEG1: + case DUKETORSO: + case DUKEGUN: + case DUKELEG: + changeactorstat(act, STAT_MISC); + break; + case TONGUE: + if (spj) + sp->ang = spj->ang; + sp->z -= PHEIGHT_DUKE; + sp->zvel = 256 - (krand() & 511); + sp->xvel = 64 - (krand() & 127); + changeactorstat(act, 4); + break; + case NATURALLIGHTNING: + sp->cstat &= ~257; + sp->cstat |= 32768; + break; + case TRANSPORTERSTAR: + case TRANSPORTERBEAM: + spawntransporter(actj, act, sp->picnum == TRANSPORTERBEAM); + break; + + case FRAMEEFFECT1: + if (spj) + { + sp->xrepeat = spj->xrepeat; + sp->yrepeat = spj->yrepeat; + t[1] = spj->picnum; + } + else sp->xrepeat = sp->yrepeat = 0; + + changeactorstat(act, STAT_MISC); + + break; + + case LASERLINE: + sp->yrepeat = 6; + sp->xrepeat = 32; + + if (gs.lasermode == 1) + sp->cstat = 16 + 2; + else if (gs.lasermode == 0 || gs.lasermode == 2) + sp->cstat = 16; + else + { + sp->xrepeat = 0; + sp->yrepeat = 0; + } + + if (spj) sp->ang = actj->temp_data[5] + 512; + changeactorstat(act, STAT_MISC); + break; + + case FORCESPHERE: + if (!spj) + { + sp->cstat = 32768; + changeactorstat(act, 2); + } + else + { + sp->xrepeat = sp->yrepeat = 1; + changeactorstat(act, STAT_MISC); + } + break; + + case BLOOD: + sp->xrepeat = sp->yrepeat = 16; + sp->z -= (26 << 8); + if (spj && spj->pal == 6) + sp->pal = 6; + changeactorstat(act, STAT_MISC); + break; + case LAVAPOOL: + if (!isWorldTour()) // Twentieth Anniversary World Tour + return act; + [[fallthrough]]; + + case BLOODPOOL: + case PUKE: + if (spawnbloodpoolpart1(act)) break; + + if (spj && sp->picnum != PUKE) + { + if (spj->pal == 1) + sp->pal = 1; + else if (spj->pal != 6 && spj->picnum != NUKEBARREL && spj->picnum != TIRE) + { + if (spj->picnum == FECES) + sp->pal = 7; // Brown + else sp->pal = 2; // Red + } + else sp->pal = 0; // green + + if (spj->picnum == TIRE) + sp->shade = 127; + } + sp->cstat |= 32; + if (sp->picnum == LAVAPOOL) // Twentieth Anniversary World Tour + { + int fz = getflorzofslope(sp->sectnum, sp->x, sp->y); + if (fz != sp->z) + sp->z = fz; + sp->z -= 200; + } + [[fallthrough]]; + + case FECES: + if (spj) + sp->xrepeat = sp->yrepeat = 1; + changeactorstat(act, STAT_MISC); + break; + + case BLOODSPLAT1: + case BLOODSPLAT2: + case BLOODSPLAT3: + case BLOODSPLAT4: + sp->cstat |= 16; + sp->xrepeat = 7 + (krand() & 7); + sp->yrepeat = 7 + (krand() & 7); + sp->z -= (16 << 8); + if (spj && spj->pal == 6) + sp->pal = 6; + insertspriteq(act); + changeactorstat(act, STAT_MISC); + break; + + case TRIPBOMB: + if (sp->lotag > ud.player_skill) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + + sp->xrepeat = 4; + sp->yrepeat = 5; + + act->SetOwner(act); + ud.bomb_tag = (ud.bomb_tag + 1) & 32767; + sp->hitag = ud.bomb_tag; + + sp->xvel = 16; + ssp(act, CLIPMASK0); + act->temp_data[0] = 17; + act->temp_data[2] = 0; + act->temp_data[5] = sp->ang; + [[fallthrough]]; + + case SPACEMARINE: + if (sp->picnum == SPACEMARINE) + { + sp->extra = 20; + sp->cstat |= 257; + } + changeactorstat(act, 2); + break; + + case HYDRENT: + case PANNEL1: + case PANNEL2: + case SATELITE: + case FUELPOD: + case SOLARPANNEL: + case ANTENNA: + case GRATE1: + case CHAIR1: + case CHAIR2: + case CHAIR3: + case BOTTLE1: + case BOTTLE2: + case BOTTLE3: + case BOTTLE4: + case BOTTLE5: + case BOTTLE6: + case BOTTLE7: + case BOTTLE8: + case BOTTLE10: + case BOTTLE11: + case BOTTLE12: + case BOTTLE13: + case BOTTLE14: + case BOTTLE15: + case BOTTLE16: + case BOTTLE17: + case BOTTLE18: + case BOTTLE19: + case OCEANSPRITE1: + case OCEANSPRITE2: + case OCEANSPRITE3: + case OCEANSPRITE5: + case MONK: + case INDY: + case LUKE: + case JURYGUY: + case SCALE: + case VACUUM: + case FANSPRITE: + case CACTUS: + case CACTUSBROKE: + case HANGLIGHT: + case FETUS: + case FETUSBROKE: + case CAMERALIGHT: + case MOVIECAMERA: + case IVUNIT: + case POT1: + case POT2: + case POT3: + case TRIPODCAMERA: + case SUSHIPLATE1: + case SUSHIPLATE2: + case SUSHIPLATE3: + case SUSHIPLATE4: + case SUSHIPLATE5: + case WAITTOBESEATED: + case VASE: + case PIPE1: + case PIPE2: + case PIPE3: + case PIPE4: + case PIPE5: + case PIPE6: + sp->clipdist = 32; + sp->cstat |= 257; + [[fallthrough]]; + case OCEANSPRITE4: + changeactorstat(act, 0); + break; + case FEMMAG1: + case FEMMAG2: + sp->cstat &= ~257; + changeactorstat(act, 0); + break; + case DUKETAG: + case SIGN1: + case SIGN2: + if (ud.multimode < 2 && sp->pal) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + } + else sp->pal = 0; + break; + case MASKWALL1: + case MASKWALL2: + case MASKWALL3: + case MASKWALL4: + case MASKWALL5: + case MASKWALL6: + case MASKWALL7: + case MASKWALL8: + case MASKWALL9: + case MASKWALL10: + case MASKWALL11: + case MASKWALL12: + case MASKWALL13: + case MASKWALL14: + case MASKWALL15: + { + int j = sp->cstat & 60; + sp->cstat = j | 1; + changeactorstat(act, 0); + break; + } + case FOOTPRINTS: + case FOOTPRINTS2: + case FOOTPRINTS3: + case FOOTPRINTS4: + initfootprint(actj, act); + break; + + case FEM1: + case FEM2: + case FEM3: + case FEM4: + case FEM5: + case FEM6: + case FEM7: + case FEM8: + case FEM9: + case FEM10: + case PODFEM1: + case NAKED1: + case STATUE: + case TOUGHGAL: + sp->yvel = sp->hitag; + sp->hitag = -1; + if (sp->picnum == PODFEM1) sp->extra <<= 1; + [[fallthrough]]; + + case BLOODYPOLE: + + case QUEBALL: + case STRIPEBALL: + + if (sp->picnum == QUEBALL || sp->picnum == STRIPEBALL) + { + sp->cstat = 256; + sp->clipdist = 8; + } + else + { + sp->cstat |= 257; + sp->clipdist = 32; + } + + changeactorstat(act, 2); + break; + + case DUKELYINGDEAD: + if (spj && spj->picnum == APLAYER) + { + sp->xrepeat = spj->xrepeat; + sp->yrepeat = spj->yrepeat; + sp->shade = spj->shade; + sp->pal = ps[spj->yvel].palookup; + } + [[fallthrough]]; + case DUKECAR: + case HELECOPT: + // if(sp->picnum == HELECOPT || sp->picnum == DUKECAR) sp->xvel = 1024; + sp->cstat = 0; + sp->extra = 1; + sp->xvel = 292; + sp->zvel = 360; + [[fallthrough]]; + case RESPAWNMARKERRED: + case BLIMP: + + if (sp->picnum == RESPAWNMARKERRED) + { + sp->xrepeat = sp->yrepeat = 24; + if (spj) sp->z = actj->floorz; // -(1<<4); + } + else + { + sp->cstat |= 257; + sp->clipdist = 128; + } + [[fallthrough]]; + case MIKE: + if (sp->picnum == MIKE) + sp->yvel = sp->hitag; + [[fallthrough]]; + case WEATHERWARN: + changeactorstat(act, 1); + break; + + case SPOTLITE: + t[0] = sp->x; + t[1] = sp->y; + break; + case BULLETHOLE: + sp->xrepeat = sp->yrepeat = 3; + sp->cstat = 16 + (krand() & 12); + insertspriteq(act); + [[fallthrough]]; + case MONEY: + case MAIL: + case PAPER: + if (sp->picnum == MONEY || sp->picnum == MAIL || sp->picnum == PAPER) + { + act->temp_data[0] = krand() & 2047; + sp->cstat = krand() & 12; + sp->xrepeat = sp->yrepeat = 8; + sp->ang = krand() & 2047; + } + changeactorstat(act, STAT_MISC); + break; + + case VIEWSCREEN: + case VIEWSCREEN2: + act->SetOwner(act); + sp->lotag = 1; + sp->extra = 1; + changeactorstat(act, 6); + break; + + case SHELL: //From the player + case SHOTGUNSHELL: + initshell(actj, act, sp->picnum == SHELL); + break; + + case RESPAWN: + sp->extra = 66 - 13; + [[fallthrough]]; + case MUSICANDSFX: + if (ud.multimode < 2 && sp->pal == 1) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + sp->cstat = 32768; + changeactorstat(act, 11); + break; + + case ONFIRE: + // Twentieth Anniversary World Tour + if (!isWorldTour()) + break; + [[fallthrough]]; + case EXPLOSION2: + case EXPLOSION2BOT: + case BURNING: + case BURNING2: + case SMALLSMOKE: + case SHRINKEREXPLOSION: + case COOLEXPLOSION1: + + if (spj) + { + sp->ang = spj->ang; + sp->shade = -64; + sp->cstat = 128 | (krand() & 4); + } + + if (sp->picnum == EXPLOSION2 || sp->picnum == EXPLOSION2BOT) + { + sp->xrepeat = 48; + sp->yrepeat = 48; + sp->shade = -127; + sp->cstat |= 128; + } + else if (sp->picnum == SHRINKEREXPLOSION) + { + sp->xrepeat = 32; + sp->yrepeat = 32; + } + else if (sp->picnum == SMALLSMOKE || sp->picnum == ONFIRE) + { + // 64 "money" + sp->xrepeat = 24; + sp->yrepeat = 24; + } + else if (sp->picnum == BURNING || sp->picnum == BURNING2) + { + sp->xrepeat = 4; + sp->yrepeat = 4; + } + + if (spj) + { + int x = getflorzofslope(sp->sectnum, sp->x, sp->y); + if (sp->z > x - (12 << 8)) + sp->z = x - (12 << 8); + } + + if (sp->picnum == ONFIRE) + { + sp->x += krand() % 256 - 128; + sp->y += krand() % 256 - 128; + sp->z -= krand() % 10240; + sp->cstat |= 0x80; + } + + changeactorstat(act, STAT_MISC); + + break; + + case PLAYERONWATER: + if (spj) + { + sp->xrepeat = spj->xrepeat; + sp->yrepeat = spj->yrepeat; + sp->zvel = 128; + if (sp->sector()->lotag != 2) sp->cstat |= 32768; - break; - case TRANSPORTERSTAR: - case TRANSPORTERBEAM: - spawntransporter(actj, act, sp->picnum == TRANSPORTERBEAM); - break; + } + changeactorstat(act, STAT_DUMMYPLAYER); + break; - case FRAMEEFFECT1: - if(j >= 0) - { - sp->xrepeat = spj->xrepeat; - sp->yrepeat = spj->yrepeat; - t[1] = spj->picnum; - } - else sp->xrepeat = sp->yrepeat = 0; + case APLAYER: + { + sp->xrepeat = sp->yrepeat = 0; + int j = ud.coop; + if (j == 2) j = 0; - changespritestat(i, STAT_MISC); + if (ud.multimode < 2 || (ud.multimode > 1 && j != sp->lotag)) + changeactorstat(act, STAT_MISC); + else + changeactorstat(act, STAT_PLAYER); + break; + } + case WATERBUBBLE: + if (spj && spj->picnum == APLAYER) + sp->z -= (16 << 8); + if (sp->picnum == WATERBUBBLE) + { + if (spj) + sp->ang = spj->ang; + sp->xrepeat = sp->yrepeat = 4; + } + else sp->xrepeat = sp->yrepeat = 32; - break; + changeactorstat(act, STAT_MISC); + break; - case LASERLINE: - sp->yrepeat = 6; - sp->xrepeat = 32; + case CRANE: + initcrane(actj, act, CRANEPOLE); + break; - if(gs.lasermode == 1) - sp->cstat = 16 + 2; - else if(gs.lasermode == 0 || gs.lasermode == 2) - sp->cstat = 16; - else - { - sp->xrepeat = 0; - sp->yrepeat = 0; - } + case WATERDRIP: + initwaterdrip(actj, act); + break; + case TRASH: - if(j >= 0) sp->ang = actj->temp_data[5]+512; - changespritestat(i, STAT_MISC); - break; + if (sp->picnum != WATERDRIP) + sp->ang = krand() & 2047; + [[fallthrough]]; - case FORCESPHERE: - if(j == -1 ) - { - sp->cstat = 32768; - changespritestat(i,2); - } - else - { - sp->xrepeat = sp->yrepeat = 1; - changespritestat(i, STAT_MISC); - } - break; + case WATERDRIPSPLASH: - case BLOOD: - sp->xrepeat = sp->yrepeat = 16; - sp->z -= (26<<8); - if( j >= 0 && spj->pal == 6 ) - sp->pal = 6; - changespritestat(i, STAT_MISC); - break; - case LAVAPOOL: - if (!isWorldTour()) // Twentieth Anniversary World Tour - return i; - [[fallthrough]]; + sp->xrepeat = 24; + sp->yrepeat = 24; - case BLOODPOOL: - case PUKE: - if (spawnbloodpoolpart1(actj, act)) break; - if(j >= 0 && sp->picnum != PUKE) - { - if( spj->pal == 1) - sp->pal = 1; - else if( spj->pal != 6 && spj->picnum != NUKEBARREL && spj->picnum != TIRE ) - { - if(spj->picnum == FECES) - sp->pal = 7; // Brown - else sp->pal = 2; // Red - } - else sp->pal = 0; // green + changeactorstat(act, 6); + break; - if(spj->picnum == TIRE) - sp->shade = 127; - } - sp->cstat |= 32; - if (sp->picnum == LAVAPOOL) // Twentieth Anniversary World Tour - { - int fz = getflorzofslope(sp->sectnum, sp->x, sp->y); - if (fz != sp->z) - sp->z = fz; - sp->z -= 200; - } - [[fallthrough]]; - - case FECES: - if( j >= 0) - sp->xrepeat = sp->yrepeat = 1; - changespritestat(i, STAT_MISC); - break; - - case BLOODSPLAT1: - case BLOODSPLAT2: - case BLOODSPLAT3: - case BLOODSPLAT4: - sp->cstat |= 16; - sp->xrepeat = 7+(krand()&7); - sp->yrepeat = 7+(krand()&7); - sp->z -= (16<<8); - if(j >= 0 && spj->pal == 6) - sp->pal = 6; - insertspriteq(act); - changespritestat(i, STAT_MISC); - break; - - case TRIPBOMB: - if( sp->lotag > ud.player_skill ) - { - sp->xrepeat=sp->yrepeat=0; - changespritestat(i, STAT_MISC); - break; - } - - sp->xrepeat=4; - sp->yrepeat=5; - - act->SetOwner(act); - ud.bomb_tag = (ud.bomb_tag + 1) & 32767; - sp->hitag = ud.bomb_tag; - - sp->xvel = 16; - ssp(act, CLIPMASK0); - act->temp_data[0] = 17; - act->temp_data[2] = 0; - act->temp_data[5] = sp->ang; - [[fallthrough]]; - - case SPACEMARINE: - if(sp->picnum == SPACEMARINE) - { - sp->extra = 20; - sp->cstat |= 257; - } - changespritestat(i,2); - break; - - case HYDRENT: - case PANNEL1: - case PANNEL2: - case SATELITE: - case FUELPOD: - case SOLARPANNEL: - case ANTENNA: - case GRATE1: - case CHAIR1: - case CHAIR2: - case CHAIR3: - case BOTTLE1: - case BOTTLE2: - case BOTTLE3: - case BOTTLE4: - case BOTTLE5: - case BOTTLE6: - case BOTTLE7: - case BOTTLE8: - case BOTTLE10: - case BOTTLE11: - case BOTTLE12: - case BOTTLE13: - case BOTTLE14: - case BOTTLE15: - case BOTTLE16: - case BOTTLE17: - case BOTTLE18: - case BOTTLE19: - case OCEANSPRITE1: - case OCEANSPRITE2: - case OCEANSPRITE3: - case OCEANSPRITE5: - case MONK: - case INDY: - case LUKE: - case JURYGUY: - case SCALE: - case VACUUM: - case FANSPRITE: - case CACTUS: - case CACTUSBROKE: - case HANGLIGHT: - case FETUS: - case FETUSBROKE: - case CAMERALIGHT: - case MOVIECAMERA: - case IVUNIT: - case POT1: - case POT2: - case POT3: - case TRIPODCAMERA: - case SUSHIPLATE1: - case SUSHIPLATE2: - case SUSHIPLATE3: - case SUSHIPLATE4: - case SUSHIPLATE5: - case WAITTOBESEATED: - case VASE: - case PIPE1: - case PIPE2: - case PIPE3: - case PIPE4: - case PIPE5: - case PIPE6: - sp->clipdist = 32; - sp->cstat |= 257; - [[fallthrough]]; - case OCEANSPRITE4: - changespritestat(i,0); - break; - case FEMMAG1: - case FEMMAG2: - sp->cstat &= ~257; - changespritestat(i,0); - break; - case DUKETAG: - case SIGN1: - case SIGN2: - if(ud.multimode < 2 && sp->pal) - { - sp->xrepeat = sp->yrepeat = 0; - changespritestat(i, STAT_MISC); - } - else sp->pal = 0; - break; - case MASKWALL1: - case MASKWALL2: - case MASKWALL3: - case MASKWALL4: - case MASKWALL5: - case MASKWALL6: - case MASKWALL7: - case MASKWALL8: - case MASKWALL9: - case MASKWALL10: - case MASKWALL11: - case MASKWALL12: - case MASKWALL13: - case MASKWALL14: - case MASKWALL15: - j = sp->cstat&60; - sp->cstat = j|1; - changespritestat(i,0); - break; - case FOOTPRINTS: - case FOOTPRINTS2: - case FOOTPRINTS3: - case FOOTPRINTS4: - initfootprint(actj, act); - break; - - case FEM1: - case FEM2: - case FEM3: - case FEM4: - case FEM5: - case FEM6: - case FEM7: - case FEM8: - case FEM9: - case FEM10: - case PODFEM1: - case NAKED1: - case STATUE: - case TOUGHGAL: - sp->yvel = sp->hitag; - sp->hitag = -1; - if(sp->picnum == PODFEM1) sp->extra <<= 1; - [[fallthrough]]; - - case BLOODYPOLE: - - case QUEBALL: - case STRIPEBALL: - - if(sp->picnum == QUEBALL || sp->picnum == STRIPEBALL) - { - sp->cstat = 256; - sp->clipdist = 8; - } - else - { - sp->cstat |= 257; - sp->clipdist = 32; - } - - changespritestat(i,2); - break; - - case DUKELYINGDEAD: - if(j >= 0 && spj->picnum == APLAYER) - { - sp->xrepeat = spj->xrepeat; - sp->yrepeat = spj->yrepeat; - sp->shade = spj->shade; - sp->pal = ps[spj->yvel].palookup; - } - [[fallthrough]]; - case DUKECAR: - case HELECOPT: -// if(sp->picnum == HELECOPT || sp->picnum == DUKECAR) sp->xvel = 1024; - sp->cstat = 0; - sp->extra = 1; - sp->xvel = 292; - sp->zvel = 360; - [[fallthrough]]; - case RESPAWNMARKERRED: - case BLIMP: - - if(sp->picnum == RESPAWNMARKERRED) - { - sp->xrepeat = sp->yrepeat = 24; - if(j >= 0) sp->z = actj->floorz; // -(1<<4); - } - else - { - sp->cstat |= 257; - sp->clipdist = 128; - } - [[fallthrough]]; - case MIKE: - if(sp->picnum == MIKE) - sp->yvel = sp->hitag; - [[fallthrough]]; - case WEATHERWARN: - changespritestat(i,1); - break; - - case SPOTLITE: - t[0] = sp->x; - t[1] = sp->y; - break; - case BULLETHOLE: - sp->xrepeat = sp->yrepeat = 3; - sp->cstat = 16+(krand()&12); - insertspriteq(act); - [[fallthrough]]; - case MONEY: - case MAIL: - case PAPER: - if( sp->picnum == MONEY || sp->picnum == MAIL || sp->picnum == PAPER ) - { - act->temp_data[0] = krand()&2047; - sp->cstat = krand()&12; - sp->xrepeat = sp->yrepeat = 8; - sp->ang = krand()&2047; - } - changespritestat(i, STAT_MISC); - break; - - case VIEWSCREEN: - case VIEWSCREEN2: - act->SetOwner(act); - sp->lotag = 1; - sp->extra = 1; - changespritestat(i,6); - break; - - case SHELL: //From the player - case SHOTGUNSHELL: - initshell(actj, act, sp->picnum == SHELL); - break; - - case RESPAWN: - sp->extra = 66-13; - [[fallthrough]]; - case MUSICANDSFX: - if( ud.multimode < 2 && sp->pal == 1) - { - sp->xrepeat = sp->yrepeat = 0; - changespritestat(i, STAT_MISC); - break; - } - sp->cstat = 32768; - changespritestat(i,11); - break; - - case ONFIRE: - // Twentieth Anniversary World Tour - if (!isWorldTour()) - break; - [[fallthrough]]; - case EXPLOSION2: - case EXPLOSION2BOT: - case BURNING: - case BURNING2: - case SMALLSMOKE: - case SHRINKEREXPLOSION: - case COOLEXPLOSION1: - - if(j >= 0) - { - sp->ang = spj->ang; - sp->shade = -64; - sp->cstat = 128|(krand()&4); - } - - if(sp->picnum == EXPLOSION2 || sp->picnum == EXPLOSION2BOT) - { - sp->xrepeat = 48; - sp->yrepeat = 48; - sp->shade = -127; - sp->cstat |= 128; - } - else if(sp->picnum == SHRINKEREXPLOSION ) - { - sp->xrepeat = 32; - sp->yrepeat = 32; - } - else if( sp->picnum == SMALLSMOKE || sp->picnum == ONFIRE ) - { - // 64 "money" - sp->xrepeat = 24; - sp->yrepeat = 24; - } - else if(sp->picnum == BURNING || sp->picnum == BURNING2) - { - sp->xrepeat = 4; - sp->yrepeat = 4; - } - - if(j >= 0) - { - x = getflorzofslope(sp->sectnum,sp->x,sp->y); - if(sp->z > x-(12<<8) ) - sp->z = x-(12<<8); - } - - if (sp->picnum == ONFIRE) - { - sp->x += krand() % 256 - 128; - sp->y += krand() % 256 - 128; - sp->z -= krand() % 10240; - sp->cstat |= 0x80; - } - - changespritestat(i, STAT_MISC); - - break; - - case PLAYERONWATER: - if(j >= 0) - { - sp->xrepeat = spj->xrepeat; - sp->yrepeat = spj->yrepeat; - sp->zvel = 128; - if(sp->sector()->lotag != 2) - sp->cstat |= 32768; - } - changespritestat(i, STAT_DUMMYPLAYER); - break; - - case APLAYER: + case PLUG: + sp->lotag = 9999; + changeactorstat(act, 6); + break; + case TOUCHPLATE: + t[2] = sectp->floorz; + if (sectp->lotag != 1 && sectp->lotag != 2) + sectp->floorz = sp->z; + if (!isWorldTour()) + { + if (sp->pal && ud.multimode > 1) + { sp->xrepeat = sp->yrepeat = 0; - j = ud.coop; - if(j == 2) j = 0; - - if (ud.multimode < 2 || (ud.multimode > 1 && j != sp->lotag)) - changespritestat(i, STAT_MISC); - else - changespritestat(i, STAT_PLAYER); + changeactorstat(act, STAT_MISC); break; - case WATERBUBBLE: - if(j >= 0 && spj->picnum == APLAYER) - sp->z -= (16<<8); - if( sp->picnum == WATERBUBBLE) - { - if( j >= 0 ) - sp->ang = spj->ang; - sp->xrepeat = sp->yrepeat = 4; - } - else sp->xrepeat = sp->yrepeat = 32; - - changespritestat(i, STAT_MISC); + } + } + else { // Twentieth Anniversary World Tour addition + if ((sp->pal == 1 && ud.multimode > 1) // Single-game Only + || (sp->pal == 2 && (ud.multimode == 1 || (ud.multimode > 1 && ud.coop != 1))) // Co-op Only + || (sp->pal == 3 && (ud.multimode == 1 || (ud.multimode > 1 && ud.coop == 1)))) // Dukematch Only + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); break; + } + } + [[fallthrough]]; + case WATERBUBBLEMAKER: + if (sp->hitag && sp->picnum == WATERBUBBLEMAKER) + { // JBF 20030913: Pisses off move(), eg. in bobsp2 + Printf(TEXTCOLOR_YELLOW "WARNING: WATERBUBBLEMAKER %d @ %d,%d with hitag!=0. Applying fixup.\n", act->GetSpriteIndex(), sp->x, sp->y); + sp->hitag = 0; + } + sp->cstat |= 32768; + changeactorstat(act, 6); + break; + case BOLT1: + case BOLT1 + 1: + case BOLT1 + 2: + case BOLT1 + 3: + case SIDEBOLT1: + case SIDEBOLT1 + 1: + case SIDEBOLT1 + 2: + case SIDEBOLT1 + 3: + t[0] = sp->xrepeat; + t[1] = sp->yrepeat; + [[fallthrough]]; + case MASTERSWITCH: + if (sp->picnum == MASTERSWITCH) + sp->cstat |= 32768; + sp->yvel = 0; + changeactorstat(act, 6); + break; + case TARGET: + case DUCK: + case LETTER: + sp->extra = 1; + sp->cstat |= 257; + changeactorstat(act, 1); + break; + case OCTABRAINSTAYPUT: + case LIZTROOPSTAYPUT: + case PIGCOPSTAYPUT: + case LIZMANSTAYPUT: + case BOSS1STAYPUT: + case PIGCOPDIVE: + case COMMANDERSTAYPUT: + case BOSS4STAYPUT: + act->actorstayput = sp->sector(); + [[fallthrough]]; + case BOSS1: + case BOSS2: + case BOSS3: + case BOSS4: + case ROTATEGUN: + case GREENSLIME: + if (sp->picnum == GREENSLIME) + sp->extra = 1; + [[fallthrough]]; + case DRONE: + case LIZTROOPONTOILET: + case LIZTROOPJUSTSIT: + case LIZTROOPSHOOT: + case LIZTROOPJETPACK: + case LIZTROOPDUCKING: + case LIZTROOPRUNNING: + case LIZTROOP: + case OCTABRAIN: + case COMMANDER: + case PIGCOP: + case LIZMAN: + case LIZMANSPITTING: + case LIZMANFEEDING: + case LIZMANJUMP: + case ORGANTIC: + case RAT: + case SHARK: - case CRANE: - initcrane(actj, act, CRANEPOLE); - break; - - case WATERDRIP: - initwaterdrip(actj, act); - break; - case TRASH: - - if(sp->picnum != WATERDRIP) - sp->ang = krand()&2047; - [[fallthrough]]; - - case WATERDRIPSPLASH: - - sp->xrepeat = 24; - sp->yrepeat = 24; - - - changespritestat(i,6); - break; - - case PLUG: - sp->lotag = 9999; - changespritestat(i,6); - break; - case TOUCHPLATE: - t[2] = sectp->floorz; - if(sectp->lotag != 1 && sectp->lotag != 2) - sectp->floorz = sp->z; - if (!isWorldTour()) - { - if (sp->pal && ud.multimode > 1) - { - sp->xrepeat = sp->yrepeat = 0; - changespritestat(i, STAT_MISC); - break; - } - } - else { // Twentieth Anniversary World Tour addition - if ((sp->pal == 1 && ud.multimode > 1) // Single-game Only - || (sp->pal == 2 && (ud.multimode == 1 || (ud.multimode > 1 && ud.coop != 1))) // Co-op Only - || (sp->pal == 3 && (ud.multimode == 1 || (ud.multimode > 1 && ud.coop == 1)))) // Dukematch Only - { - sp->xrepeat = sp->yrepeat = 0; - changespritestat(i, STAT_MISC); - break; - } - } - [[fallthrough]]; - case WATERBUBBLEMAKER: - if (sp->hitag && sp->picnum == WATERBUBBLEMAKER) - { // JBF 20030913: Pisses off move(), eg. in bobsp2 - Printf(TEXTCOLOR_YELLOW "WARNING: WATERBUBBLEMAKER %d @ %d,%d with hitag!=0. Applying fixup.\n",i,sp->x,sp->y); - sp->hitag = 0; - } - sp->cstat |= 32768; - changespritestat(i,6); - break; - case BOLT1: - case BOLT1+1: - case BOLT1+2: - case BOLT1+3: - case SIDEBOLT1: - case SIDEBOLT1+1: - case SIDEBOLT1+2: - case SIDEBOLT1+3: - t[0] = sp->xrepeat; - t[1] = sp->yrepeat; - [[fallthrough]]; - case MASTERSWITCH: - if(sp->picnum == MASTERSWITCH) - sp->cstat |= 32768; - sp->yvel = 0; - changespritestat(i,6); - break; - case TARGET: - case DUCK: - case LETTER: - sp->extra = 1; - sp->cstat |= 257; - changespritestat(i,1); - break; - case OCTABRAINSTAYPUT: - case LIZTROOPSTAYPUT: - case PIGCOPSTAYPUT: - case LIZMANSTAYPUT: - case BOSS1STAYPUT: - case PIGCOPDIVE: - case COMMANDERSTAYPUT: - case BOSS4STAYPUT: - act->actorstayput = sp->sector(); - [[fallthrough]]; - case BOSS1: - case BOSS2: - case BOSS3: - case BOSS4: - case ROTATEGUN: - case GREENSLIME: - if(sp->picnum == GREENSLIME) - sp->extra = 1; - [[fallthrough]]; - case DRONE: + if (sp->pal == 0) + { + switch (sp->picnum) + { case LIZTROOPONTOILET: - case LIZTROOPJUSTSIT: case LIZTROOPSHOOT: case LIZTROOPJETPACK: case LIZTROOPDUCKING: case LIZTROOPRUNNING: + case LIZTROOPSTAYPUT: + case LIZTROOPJUSTSIT: case LIZTROOP: - case OCTABRAIN: - case COMMANDER: - case PIGCOP: - case LIZMAN: - case LIZMANSPITTING: - case LIZMANFEEDING: - case LIZMANJUMP: - case ORGANTIC: - case RAT: - case SHARK: - - if(sp->pal == 0) - { - switch(sp->picnum) - { - case LIZTROOPONTOILET: - case LIZTROOPSHOOT: - case LIZTROOPJETPACK: - case LIZTROOPDUCKING: - case LIZTROOPRUNNING: - case LIZTROOPSTAYPUT: - case LIZTROOPJUSTSIT: - case LIZTROOP: - sp->pal = 22; - break; - } - } - - if (bossguy(sp)) - { - if(j >= 0 && spj->picnum == RESPAWN) - sp->pal = spj->pal; - if (sp->pal && (!isWorldTour() || !(currentLevel->flags & LEVEL_WT_BOSSSPAWN) || sp->pal != 22)) - { - sp->clipdist = 80; - sp->xrepeat = 40; - sp->yrepeat = 40; - } - else - { - sp->xrepeat = 80; - sp->yrepeat = 80; - sp->clipdist = 164; - } - } - else - { - if(sp->picnum != SHARK) - { - sp->xrepeat = 40; - sp->yrepeat = 40; - sp->clipdist = 80; - } - else - { - sp->xrepeat = 60; - sp->yrepeat = 60; - sp->clipdist = 40; - } - } - - if(j >= 0) sp->lotag = 0; - - if( ( sp->lotag > ud.player_skill ) || ud.monsters_off == 1 ) - { - sp->xrepeat=sp->yrepeat=0; - changespritestat(i, STAT_MISC); - break; - } - else - { - makeitfall(act); - - if(sp->picnum == RAT) - { - sp->ang = krand()&2047; - sp->xrepeat = sp->yrepeat = 48; - sp->cstat = 0; - } - else - { - sp->cstat |= 257; - - if(sp->picnum != SHARK) - ps[myconnectindex].max_actors_killed++; - } - - if(sp->picnum == ORGANTIC) sp->cstat |= 128; - - if(j >= 0) - { - act->timetosleep = 0; - check_fta_sounds_d(act); - changespritestat(i,1); - } - else changespritestat(i,2); - } - - if(sp->picnum == ROTATEGUN) - sp->zvel = 0; - + sp->pal = 22; break; + } + } - case LOCATORS: - sp->cstat |= 32768; - changespritestat(i,7); - break; + if (bossguy(sp)) + { + if (spj && spj->picnum == RESPAWN) + sp->pal = spj->pal; + if (sp->pal && (!isWorldTour() || !(currentLevel->flags & LEVEL_WT_BOSSSPAWN) || sp->pal != 22)) + { + sp->clipdist = 80; + sp->xrepeat = 40; + sp->yrepeat = 40; + } + else + { + sp->xrepeat = 80; + sp->yrepeat = 80; + sp->clipdist = 164; + } + } + else + { + if (sp->picnum != SHARK) + { + sp->xrepeat = 40; + sp->yrepeat = 40; + sp->clipdist = 80; + } + else + { + sp->xrepeat = 60; + sp->yrepeat = 60; + sp->clipdist = 40; + } + } - case ACTIVATORLOCKED: - case ACTIVATOR: - sp->cstat = 32768; - if(sp->picnum == ACTIVATORLOCKED) - sp->sector()->lotag |= 16384; - changespritestat(i,8); - break; + if (spj) sp->lotag = 0; - case DOORSHOCK: - sp->cstat |= 1+256; - sp->shade = -12; - changespritestat(i,6); - break; + if ((sp->lotag > ud.player_skill) || ud.monsters_off == 1) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + else + { + makeitfall(act); - case OOZ: - case OOZ2: - sp->shade = -12; - - if(j >= 0) - { - if( spj->picnum == NUKEBARREL ) - sp->pal = 8; - insertspriteq(act); - } - - changespritestat(i,1); - - getglobalz(act); - - j = (act->floorz-act->ceilingz)>>9; - - sp->yrepeat = j; - sp->xrepeat = 25-(j>>1); - sp->cstat |= (krand()&4); - - break; - - case HEAVYHBOMB: - if(j >= 0) act->SetOwner(actj); - else act->SetOwner(act); - - sp->xrepeat = sp->yrepeat = 9; - sp->yvel = 4; - [[fallthrough]]; - case REACTOR2: - case REACTOR: - case RECON: - if (initreactor(actj, act, sp->picnum == RECON)) return i; - break; - - case FLAMETHROWERSPRITE: - case FLAMETHROWERAMMO: // Twentieth Anniversary World Tour - if (!isWorldTour()) - break; - [[fallthrough]]; - - case ATOMICHEALTH: - case STEROIDS: - case HEATSENSOR: - case SHIELD: - case AIRTANK: - case TRIPBOMBSPRITE: - case JETPACK: - case HOLODUKE: - - case FIRSTGUNSPRITE: - case CHAINGUNSPRITE: - case SHOTGUNSPRITE: - case RPGSPRITE: - case SHRINKERSPRITE: - case FREEZESPRITE: - case DEVISTATORSPRITE: - - case SHOTGUNAMMO: - case FREEZEAMMO: - case HBOMBAMMO: - case CRYSTALAMMO: - case GROWAMMO: - case BATTERYAMMO: - case DEVISTATORAMMO: - case RPGAMMO: - case BOOTS: - case AMMO: - case AMMOLOTS: - case COLA: - case FIRSTAID: - case SIXPAK: - if(j >= 0) - { - sp->lotag = 0; - sp->z -= (32<<8); - sp->zvel = -1024; - ssp(act, CLIPMASK0); - sp->cstat = krand()&4; - } - else - { - act->SetOwner(act); - sp->cstat = 0; - } - - if( ( ud.multimode < 2 && sp->pal != 0) || (sp->lotag > ud.player_skill) ) - { - sp->xrepeat = sp->yrepeat = 0; - changespritestat(i, STAT_MISC); - break; - } - - sp->pal = 0; - [[fallthrough]]; - - case ACCESSCARD: - - if(sp->picnum == ATOMICHEALTH) - sp->cstat |= 128; - - if(ud.multimode > 1 && ud.coop != 1 && sp->picnum == ACCESSCARD) - { - sp->xrepeat = sp->yrepeat = 0; - changespritestat(i, STAT_MISC); - break; - } - else - { - if(sp->picnum == AMMO) - sp->xrepeat = sp->yrepeat = 16; - else sp->xrepeat = sp->yrepeat = 32; - } - - sp->shade = -17; - - if(j >= 0) changeactorstat(act, STAT_ACTOR); - else - { - changeactorstat(act, STAT_ZOMBIEACTOR); - makeitfall(act); - } - break; - - case WATERFOUNTAIN: - sp->lotag = 1; - [[fallthrough]]; - - case TREE1: - case TREE2: - case TIRE: - case CONE: - case BOX: - sp->cstat = 257; // Make it hitable - sp->extra = 1; - changeactorstat(act, STAT_STANDABLE); - break; - - case FLOORFLAME: - sp->shade = -127; - changeactorstat(act, STAT_STANDABLE); - break; - - case BOUNCEMINE: - act->SetOwner(act); - sp->cstat |= 1+256; //Make it hitable - sp->xrepeat = sp->yrepeat = 24; - sp->shade = -127; - sp->extra = gs.impact_damage<<2; - changeactorstat(act, STAT_ZOMBIEACTOR); - break; - - case CAMERA1: - case CAMERA1+1: - case CAMERA1+2: - case CAMERA1+3: - case CAMERA1+4: - case CAMERAPOLE: - sp->extra = 1; - - if(gs.camerashitable) sp->cstat = 257; - else sp->cstat = 0; - [[fallthrough]]; - - case GENERICPOLE: - - if( ud.multimode < 2 && sp->pal != 0 ) - { - sp->xrepeat = sp->yrepeat = 0; - changespritestat(i, STAT_MISC); - break; - } - else sp->pal = 0; - if(sp->picnum == CAMERAPOLE || sp->picnum == GENERICPOLE) break; - sp->picnum = CAMERA1; - changespritestat(i,1); - break; - case STEAM: - if(j >= 0) - { - sp->ang = spj->ang; - sp->cstat = 16+128+2; - sp->xrepeat=sp->yrepeat=1; - sp->xvel = -8; - ssp(act, CLIPMASK0); - } - [[fallthrough]]; - case CEILINGSTEAM: - changespritestat(i,STAT_STANDABLE); - break; - - case SECTOREFFECTOR: - spawneffector(act); - - break; - - - case SEENINE: - case OOZFILTER: - - sp->shade = -16; - if(sp->xrepeat <= 8) - { - sp->cstat = 32768; - sp->xrepeat=sp->yrepeat=0; - } - else sp->cstat = 1+256; - sp->extra = gs.impact_damage<<2; - act->SetOwner(act); - changeactorstat(act, STAT_STANDABLE); - break; - - case CRACK1: - case CRACK2: - case CRACK3: - case CRACK4: - case FIREEXT: - if(sp->picnum == FIREEXT) - { - sp->cstat = 257; - sp->extra = gs.impact_damage<<2; - } - else - { - sp->cstat |= (sp->cstat & 48) ? 1 : 17; - sp->extra = 1; - } - - if( ud.multimode < 2 && sp->pal != 0) - { - sp->xrepeat = sp->yrepeat = 0; - changespritestat(i, STAT_MISC); - break; - } - - sp->pal = 0; - act->SetOwner(act); - changeactorstat(act, STAT_STANDABLE); - sp->xvel = 8; - ssp(act, CLIPMASK0); - break; - - case TOILET: - case STALL: - sp->lotag = 1; + if (sp->picnum == RAT) + { + sp->ang = krand() & 2047; + sp->xrepeat = sp->yrepeat = 48; + sp->cstat = 0; + } + else + { sp->cstat |= 257; - sp->clipdist = 8; - act->SetOwner(act); - break; - case CANWITHSOMETHING: - case CANWITHSOMETHING2: - case CANWITHSOMETHING3: - case CANWITHSOMETHING4: - case RUBBERCAN: - sp->extra = 0; - [[fallthrough]]; - case EXPLODINGBARREL: - case HORSEONSIDE: - case FIREBARREL: - case NUKEBARREL: - case FIREVASE: - case NUKEBARRELDENTED: - case NUKEBARRELLEAKED: - case WOODENHORSE: - if(j >= 0) - sp->xrepeat = sp->yrepeat = 32; - sp->clipdist = 72; - makeitfall(act); - if(j >= 0) act->SetOwner(actj); - else act->SetOwner(act); - [[fallthrough]]; + if (sp->picnum != SHARK) + ps[myconnectindex].max_actors_killed++; + } - case EGG: - if( ud.monsters_off == 1 && sp->picnum == EGG ) - { - sp->xrepeat = sp->yrepeat = 0; - changeactorstat(act, STAT_MISC); - } - else - { - if (sp->picnum == EGG) - { - sp->clipdist = 24; - ps[connecthead].max_actors_killed++; - } - sp->cstat = 257|(krand()&4); - changeactorstat(act, STAT_ZOMBIEACTOR); - } - break; - case TOILETWATER: - sp->shade = -16; - changeactorstat(act, STAT_STANDABLE); - break; + if (sp->picnum == ORGANTIC) sp->cstat |= 128; + + if (spj) + { + act->timetosleep = 0; + check_fta_sounds_d(act); + changeactorstat(act, 1); + } + else changeactorstat(act, 2); + } + + if (sp->picnum == ROTATEGUN) + sp->zvel = 0; + + break; + + case LOCATORS: + sp->cstat |= 32768; + changeactorstat(act, 7); + break; + + case ACTIVATORLOCKED: + case ACTIVATOR: + sp->cstat = 32768; + if (sp->picnum == ACTIVATORLOCKED) + sp->sector()->lotag |= 16384; + changeactorstat(act, 8); + break; + + case DOORSHOCK: + sp->cstat |= 1 + 256; + sp->shade = -12; + changeactorstat(act, 6); + break; + + case OOZ: + case OOZ2: + { + sp->shade = -12; + + if (spj) + { + if (spj->picnum == NUKEBARREL) + sp->pal = 8; + insertspriteq(act); + } + + changeactorstat(act, 1); + + getglobalz(act); + + int j = (act->floorz - act->ceilingz) >> 9; + + sp->yrepeat = j; + sp->xrepeat = 25 - (j >> 1); + sp->cstat |= (krand() & 4); + + break; } - return i; + case HEAVYHBOMB: + if (spj) act->SetOwner(actj); + else act->SetOwner(act); + + sp->xrepeat = sp->yrepeat = 9; + sp->yvel = 4; + [[fallthrough]]; + case REACTOR2: + case REACTOR: + case RECON: + if (initreactor(actj, act, sp->picnum == RECON)) return act; + break; + + case FLAMETHROWERSPRITE: + case FLAMETHROWERAMMO: // Twentieth Anniversary World Tour + if (!isWorldTour()) + break; + [[fallthrough]]; + + case ATOMICHEALTH: + case STEROIDS: + case HEATSENSOR: + case SHIELD: + case AIRTANK: + case TRIPBOMBSPRITE: + case JETPACK: + case HOLODUKE: + + case FIRSTGUNSPRITE: + case CHAINGUNSPRITE: + case SHOTGUNSPRITE: + case RPGSPRITE: + case SHRINKERSPRITE: + case FREEZESPRITE: + case DEVISTATORSPRITE: + + case SHOTGUNAMMO: + case FREEZEAMMO: + case HBOMBAMMO: + case CRYSTALAMMO: + case GROWAMMO: + case BATTERYAMMO: + case DEVISTATORAMMO: + case RPGAMMO: + case BOOTS: + case AMMO: + case AMMOLOTS: + case COLA: + case FIRSTAID: + case SIXPAK: + if (spj) + { + sp->lotag = 0; + sp->z -= (32 << 8); + sp->zvel = -1024; + ssp(act, CLIPMASK0); + sp->cstat = krand() & 4; + } + else + { + act->SetOwner(act); + sp->cstat = 0; + } + + if ((ud.multimode < 2 && sp->pal != 0) || (sp->lotag > ud.player_skill)) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + + sp->pal = 0; + [[fallthrough]]; + + case ACCESSCARD: + + if (sp->picnum == ATOMICHEALTH) + sp->cstat |= 128; + + if (ud.multimode > 1 && ud.coop != 1 && sp->picnum == ACCESSCARD) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + else + { + if (sp->picnum == AMMO) + sp->xrepeat = sp->yrepeat = 16; + else sp->xrepeat = sp->yrepeat = 32; + } + + sp->shade = -17; + + if (spj) changeactorstat(act, STAT_ACTOR); + else + { + changeactorstat(act, STAT_ZOMBIEACTOR); + makeitfall(act); + } + break; + + case WATERFOUNTAIN: + sp->lotag = 1; + [[fallthrough]]; + + case TREE1: + case TREE2: + case TIRE: + case CONE: + case BOX: + sp->cstat = 257; // Make it hitable + sp->extra = 1; + changeactorstat(act, STAT_STANDABLE); + break; + + case FLOORFLAME: + sp->shade = -127; + changeactorstat(act, STAT_STANDABLE); + break; + + case BOUNCEMINE: + act->SetOwner(act); + sp->cstat |= 1 + 256; //Make it hitable + sp->xrepeat = sp->yrepeat = 24; + sp->shade = -127; + sp->extra = gs.impact_damage << 2; + changeactorstat(act, STAT_ZOMBIEACTOR); + break; + + case CAMERA1: + case CAMERA1 + 1: + case CAMERA1 + 2: + case CAMERA1 + 3: + case CAMERA1 + 4: + case CAMERAPOLE: + sp->extra = 1; + + if (gs.camerashitable) sp->cstat = 257; + else sp->cstat = 0; + [[fallthrough]]; + + case GENERICPOLE: + + if (ud.multimode < 2 && sp->pal != 0) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + else sp->pal = 0; + if (sp->picnum == CAMERAPOLE || sp->picnum == GENERICPOLE) break; + sp->picnum = CAMERA1; + changeactorstat(act, 1); + break; + case STEAM: + if (spj) + { + sp->ang = spj->ang; + sp->cstat = 16 + 128 + 2; + sp->xrepeat = sp->yrepeat = 1; + sp->xvel = -8; + ssp(act, CLIPMASK0); + } + [[fallthrough]]; + case CEILINGSTEAM: + changeactorstat(act, STAT_STANDABLE); + break; + + case SECTOREFFECTOR: + spawneffector(act); + + break; + + + case SEENINE: + case OOZFILTER: + + sp->shade = -16; + if (sp->xrepeat <= 8) + { + sp->cstat = 32768; + sp->xrepeat = sp->yrepeat = 0; + } + else sp->cstat = 1 + 256; + sp->extra = gs.impact_damage << 2; + act->SetOwner(act); + changeactorstat(act, STAT_STANDABLE); + break; + + case CRACK1: + case CRACK2: + case CRACK3: + case CRACK4: + case FIREEXT: + if (sp->picnum == FIREEXT) + { + sp->cstat = 257; + sp->extra = gs.impact_damage << 2; + } + else + { + sp->cstat |= (sp->cstat & 48) ? 1 : 17; + sp->extra = 1; + } + + if (ud.multimode < 2 && sp->pal != 0) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + + sp->pal = 0; + act->SetOwner(act); + changeactorstat(act, STAT_STANDABLE); + sp->xvel = 8; + ssp(act, CLIPMASK0); + break; + + case TOILET: + case STALL: + sp->lotag = 1; + sp->cstat |= 257; + sp->clipdist = 8; + act->SetOwner(act); + break; + case CANWITHSOMETHING: + case CANWITHSOMETHING2: + case CANWITHSOMETHING3: + case CANWITHSOMETHING4: + case RUBBERCAN: + sp->extra = 0; + [[fallthrough]]; + case EXPLODINGBARREL: + case HORSEONSIDE: + case FIREBARREL: + case NUKEBARREL: + case FIREVASE: + case NUKEBARRELDENTED: + case NUKEBARRELLEAKED: + case WOODENHORSE: + + if (spj) + sp->xrepeat = sp->yrepeat = 32; + sp->clipdist = 72; + makeitfall(act); + if (spj) act->SetOwner(actj); + else act->SetOwner(act); + [[fallthrough]]; + + case EGG: + if (ud.monsters_off == 1 && sp->picnum == EGG) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + } + else + { + if (sp->picnum == EGG) + { + sp->clipdist = 24; + ps[connecthead].max_actors_killed++; + } + sp->cstat = 257 | (krand() & 4); + changeactorstat(act, STAT_ZOMBIEACTOR); + } + break; + case TOILETWATER: + sp->shade = -16; + changeactorstat(act, STAT_STANDABLE); + break; + } + return act; } END_DUKE_NS diff --git a/source/games/duke/src/spawn_r.cpp b/source/games/duke/src/spawn_r.cpp index 3b9e67e49..52890fc02 100644 --- a/source/games/duke/src/spawn_r.cpp +++ b/source/games/duke/src/spawn_r.cpp @@ -35,1474 +35,1470 @@ Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms BEGIN_DUKE_NS - -int spawn_r(int j, int pn) +DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act) { - int x; - - auto actj = j < 0 ? nullptr : &hittype[j]; - int i = initspriteforspawn(actj, pn, { CRACK1, CRACK2, CRACK3, CRACK4 }); - if (!(i & 0x1000000)) return i; - i &= 0xffffff; - auto act = &hittype[i]; auto sp = act->s; - auto spj = j < 0? nullptr : actj->s; + auto spj = actj == nullptr ? nullptr : actj->s; auto t = act->temp_data; auto sectp = sp->sector(); - switch(sp->picnum) + switch (sp->picnum) { - default: - default_case: - spawninitdefault(actj, act); - break; - case BOWLINGPINSPOT: - case RRTILE281: - case BOWLINGBALLSPOT: - case RRTILE283: - case RRTILE2025: - case RRTILE2026: - case RRTILE2027: - case RRTILE2028: - sp->cstat = 0; - sp->cstat |= 32768; - sp->xrepeat = 0; - sp->yrepeat = 0; - sp->clipdist = 0; - sp->extra = 0; - changespritestat(i,STAT_BOWLING); - break; - case RRTILE3410: - sp->extra = 0; - changespritestat(i,107); - break; - case RRTILE8450: - if (!isRRRA()) goto default_case; - sp->xrepeat = 64; - sp->yrepeat = 64; - sp->extra = sp->lotag; - sp->cstat |= 257; - changespritestat(i,116); - break; - case PIG+11: - if (!isRRRA()) goto default_case; - sp->xrepeat = 16; - sp->yrepeat = 16; - sp->clipdist = 0; - sp->extra = 0; - sp->cstat = 0; - changespritestat(i,121); - break; - case RRTILE8487: - case RRTILE8489: - if (!isRRRA()) goto default_case; - sp->xrepeat = 32; - sp->yrepeat = 32; - sp->extra = 0; - sp->cstat |= 257; - sp->hitag = 0; - changespritestat(i,117); - break; - case RRTILE7424: - if (!isRRRA()) goto default_case; - sp->extra = 0; - sp->xrepeat = 0; - sp->yrepeat = 0; - changespritestat(i,11); - break; - case RRTILE7936: - if (!isRRRA()) goto default_case; - sp->xrepeat = 0; - sp->yrepeat = 0; - fogactive = 1; - break; - case RRTILE6144: - if (!isRRRA()) goto default_case; - sp->xrepeat = 0; - sp->yrepeat = 0; - ps[screenpeek].sea_sick_stat = 1; - break; - case RRTILE8448: - if (!isRRRA()) goto default_case; - sp->lotag = 1; - sp->clipdist = 0; - break; - case RRTILE8099: - if (!isRRRA()) goto default_case; - sp->lotag = 5; - sp->clipdist = 0; - changespritestat(i,123); - break; - case RRTILE8704: - if (!isRRRA()) goto default_case; - sp->lotag = 1; - sp->clipdist = 0; - break; - case RRTILE8192: - if (!isRRRA()) goto default_case; - sp->xrepeat = 0; - sp->yrepeat = 0; - ufospawnsminion = 1; - break; - case RRTILE8193: - if (!isRRRA()) goto default_case; - sp->xrepeat = 0; - sp->yrepeat = 0; - pistonsound = 1; - break; - case RRTILE8165: - if (!isRRRA()) goto default_case; - sp->lotag = 1; - sp->clipdist = 0; - act->SetOwner(act); - sp->extra = 0; - changeactorstat(act,115); - break; - case RRTILE8593: - if (!isRRRA()) goto default_case; - sp->lotag = 1; - sp->clipdist = 0; - act->SetOwner(act); - sp->extra = 0; - changeactorstat(act,122); - break; - case RRTILE285: - case RRTILE286: - case RRTILE287: - case RRTILE288: - case RRTILE289: - case RRTILE290: - case RRTILE291: - case RRTILE292: - case RRTILE293: - sp->cstat = 0; - sp->cstat |= 32768; - sp->xrepeat = 0; - sp->yrepeat = 0; - sp->clipdist = 0; - sp->lotag = 0; - changespritestat(i,106); - break; - - case RRTILE2460: - case RRTILE2465: - case BIKEJIBA: - case BIKEJIBB: - case BIKEJIBC: - case BIKERJIBA: - case BIKERJIBB: - case BIKERJIBC: - case BIKERJIBD: - case CHEERJIBA: - case CHEERJIBB: - case CHEERJIBC: - case CHEERJIBD: - case FBOATJIBA: - case FBOATJIBB: - case RABBITJIBA: - case RABBITJIBB: - case RABBITJIBC: - case MAMAJIBA: - case MAMAJIBB: - // impossible to do with better methods outside of redoing the entire switch/case block - if (isRRRA()) goto rrra_badguy; - else goto default_case; - - case WATERSPLASH2: - case MUD: - if (j >= 0) - { - setsprite(i, spj->x, spj->y, spj->z); - sp->xrepeat = sp->yrepeat = 8+(krand()&7); - } - else sp->xrepeat = sp->yrepeat = 16+(krand()&15); - - sp->shade = -16; - sp->cstat |= 128; - if (j >= 0) - { - if (spj->sector()->lotag == 2) - { - sp->z = getceilzofslope(sp->sectnum, sp->x, sp->y) + (16 << 8); - sp->cstat |= 8; - } - else if (spj->sector()->lotag == 1) - sp->z = getflorzofslope(sp->sectnum, sp->x, sp->y); - } - - if(sectp->floorpicnum == FLOORSLIME || - sectp->ceilingpicnum == FLOORSLIME) - sp->pal = 7; - [[fallthrough]]; - case NEON1: - case NEON2: - case NEON3: - case NEON4: - case NEON5: - case NEON6: - case DOMELITE: - if(sp->picnum != WATERSPLASH2) - sp->cstat |= 257; - if(sp->picnum == DOMELITE) - sp->cstat |= 257; - [[fallthrough]]; - case JIBS1: - case JIBS2: - case JIBS3: - case JIBS4: - case JIBS5: - case JIBS6: - case DUKETORSO: - case DUKEGUN: - case DUKELEG: - case BILLYJIBA: - case BILLYJIBB: - case HULKJIBA: - case HULKJIBB: - case HULKJIBC: - case MINJIBA: - case MINJIBB: - case MINJIBC: - case COOTJIBA: - case COOTJIBB: - case COOTJIBC: - rrra_badguy: - if (sp->picnum == JIBS6) - { - sp->xrepeat >>= 1; - sp->yrepeat >>= 1; - } - else if (isRRRA()) - { - if (sp->picnum == RABBITJIBA) - { - sp->xrepeat = 18; - sp->yrepeat = 18; - } - else if (sp->picnum == RABBITJIBB) - { - sp->xrepeat = 36; - sp->yrepeat = 36; - } - else if (sp->picnum == RABBITJIBC) - { - sp->xrepeat = 54; - sp->yrepeat = 54; - } - } - changespritestat(i, STAT_MISC); - break; - case TONGUE: - if(j >= 0) - sp->ang = spj->ang; - sp->z -= PHEIGHT_RR; - sp->zvel = 256-(krand()&511); - sp->xvel = 64-(krand()&127); - changespritestat(i,4); - break; - case TRANSPORTERSTAR: - case TRANSPORTERBEAM: - spawntransporter(actj, act, sp->picnum == TRANSPORTERBEAM); - break; - - case FRAMEEFFECT1: - if (j >= 0) - { - sp->xrepeat = spj->xrepeat; - sp->yrepeat = spj->yrepeat; - if (spj->picnum == APLAYER) - t[1] = SMALLSMOKE; - else - t[1] = spj->picnum; - } - else sp->xrepeat = sp->yrepeat = 0; - - changespritestat(i, STAT_MISC); - break; - - case FORCESPHERE: - if (j == -1) - { - sp->cstat = 32768; - changespritestat(i,2); - } - else - { - sp->xrepeat = sp->yrepeat = 1; - changespritestat(i, STAT_MISC); - } - break; - - case BLOOD: - sp->xrepeat = sp->yrepeat = 4; - sp->z -= (26<<8); - changespritestat(i, STAT_MISC); - break; - case BLOODPOOL: - if (spawnbloodpoolpart1(actj, act)) break; - - if(j >= 0) - { - if( spj->pal == 1) - sp->pal = 1; - else if( spj->pal != 6 && spj->picnum != NUKEBARREL && spj->picnum != TIRE ) - { - sp->pal = 2; // Red - } - else sp->pal = 0; // green - - if(spj->picnum == TIRE) - sp->shade = 127; - } - sp->cstat |= 32; - [[fallthrough]]; - - case BLOODSPLAT1: - case BLOODSPLAT2: - case BLOODSPLAT3: - case BLOODSPLAT4: - sp->cstat |= 16; - sp->xrepeat = 7+(krand()&7); - sp->yrepeat = 7+(krand()&7); - sp->z -= (16<<8); - if(j >= 0 && spj->pal == 6) - sp->pal = 6; - insertspriteq(act); - changespritestat(i, STAT_MISC); - break; - - case HYDRENT: - case SATELITE: - case FUELPOD: - case SOLARPANNEL: - case ANTENNA: - case GRATE1: - case CHAIR1: - case CHAIR2: - case CHAIR3: - case BOTTLE1: - case BOTTLE2: - case BOTTLE3: - case BOTTLE4: - case BOTTLE5: - case BOTTLE6: - case BOTTLE7: - case BOTTLE8: - case BOTTLE10: - case BOTTLE11: - case BOTTLE12: - case BOTTLE13: - case BOTTLE14: - case BOTTLE15: - case BOTTLE16: - case BOTTLE17: - case BOTTLE18: - case BOTTLE19: - case SCALE: - case VACUUM: - case FANSPRITE: - case CACTUS: - case CACTUSBROKE: - case CAMERALIGHT: - case MOVIECAMERA: - case IVUNIT: - case POT1: - case POT2: - case POT3: - case SUSHIPLATE1: - case SUSHIPLATE2: - case SUSHIPLATE3: - case SUSHIPLATE4: - case SUSHIPLATE5: - case WAITTOBESEATED: - case VASE: - case PIPE1: - case PIPE2: - case PIPE3: - case PIPE4: - case PIPE5: - case PIPE6: - sp->clipdist = 32; - sp->cstat |= 257; - changespritestat(i,0); - break; - case FEMMAG1: - case FEMMAG2: - sp->cstat &= ~257; - changespritestat(i,0); - break; - - case MASKWALL7: - j = sp->cstat&60; - sp->cstat = j|1; - changespritestat(i,0); - break; - case FOOTPRINTS: - case FOOTPRINTS2: - case FOOTPRINTS3: - case FOOTPRINTS4: - initfootprint(actj, act); - break; - case FEM10: - case NAKED1: - case STATUE: - case TOUGHGAL: - sp->yvel = sp->hitag; - sp->hitag = -1; - [[fallthrough]]; - case QUEBALL: - case STRIPEBALL: - if (sp->picnum == QUEBALL || sp->picnum == STRIPEBALL) - { - sp->cstat = 256; - sp->clipdist = 8; - } - else - { - sp->cstat |= 257; - sp->clipdist = 32; - } - changespritestat(i,2); - break; - case BOWLINGBALL: - sp->cstat = 256; - sp->clipdist = 64; - sp->xrepeat = 11; - sp->yrepeat = 9; - changespritestat(i,2); - break; - case HENSTAND: - sp->cstat = 257; - sp->clipdist = 48; - sp->xrepeat = 21; - sp->yrepeat = 15; - changespritestat(i,2); - break; - case RRTILE295: - sp->cstat |= 32768; - changespritestat(i,107); - break; - case RRTILE296: - case RRTILE297: - sp->xrepeat = 64; - sp->yrepeat = 64; - sp->clipdist = 64; - changespritestat(i,108); - break; - case RRTILE3190: - case RRTILE3191: - case RRTILE3192: - sp->cstat = 257; - sp->clipdist = 8; - sp->xrepeat = 32; - sp->yrepeat = 26; - sp->xvel = 32; - changespritestat(i,1); - break; - case RRTILE3120: - sp->cstat = 257; - sp->clipdist = 8; - sp->xrepeat = 12; - sp->yrepeat = 10; - sp->xvel = 32; - changespritestat(i,1); - break; - case RRTILE3122: - sp->cstat = 257; - sp->clipdist = 2; - sp->xrepeat = 8; - sp->yrepeat = 6; - sp->xvel = 16; - changespritestat(i,1); - break; - case RRTILE3123: - sp->cstat = 257; - sp->clipdist = 8; - sp->xrepeat = 13; - sp->yrepeat = 13; - sp->xvel = 16; - changespritestat(i,1); - break; - case RRTILE3124: - sp->cstat = 257; - sp->clipdist = 8; - sp->xrepeat = 17; - sp->yrepeat = 12; - sp->xvel = 32; - changespritestat(i,1); - break; - case RRTILE3132: - sp->cstat = 257; - sp->clipdist = 8; - sp->xrepeat = 13; - sp->yrepeat = 10; - sp->xvel = 0; - changespritestat(i,1); - break; - case BOWLINGPIN: - sp->cstat = 257; - sp->clipdist = 48; - sp->xrepeat = 23; - sp->yrepeat = 23; - changespritestat(i,2); - break; - case DUKELYINGDEAD: - if(j >= 0 && spj->picnum == APLAYER) - { - sp->xrepeat = spj->xrepeat; - sp->yrepeat = spj->yrepeat; - sp->shade = spj->shade; - sp->pal = ps[spj->yvel].palookup; - } - sp->cstat = 0; - sp->extra = 1; - sp->xvel = 292; - sp->zvel = 360; - [[fallthrough]]; - case RESPAWNMARKERRED: - if(sp->picnum == RESPAWNMARKERRED) - { - sp->xrepeat = sp->yrepeat = 8; - if(j >= 0) sp->z = actj->floorz; - } - else - { - sp->cstat |= 257; - sp->clipdist = 128; - } - [[fallthrough]]; - case MIKE: - if(sp->picnum == MIKE) - sp->yvel = sp->hitag; - changespritestat(i,1); - break; - - case SPOTLITE: - t[0] = sp->x; - t[1] = sp->y; - break; - case BULLETHOLE: - sp->xrepeat = sp->yrepeat = 3; - sp->cstat = 16+(krand()&12); - insertspriteq(act); - [[fallthrough]]; - case MONEY: - if(sp->picnum == MONEY) - { - act->temp_data[0] = krand()&2047; - sp->cstat = krand()&12; - sp->xrepeat = sp->yrepeat = 8; - sp->ang = krand()&2047; - } - changespritestat(i, STAT_MISC); - break; - - case SHELL: //From the player - case SHOTGUNSHELL: - initshell(actj, act, sp->picnum == SHELL); - break; - case RESPAWN: - sp->extra = 66-13; - [[fallthrough]]; - case MUSICANDSFX: - if (ud.multimode < 2 && sp->pal == 1) - { - sp->xrepeat = sp->yrepeat = 0; - changespritestat(i, STAT_MISC); - break; - } - sp->cstat = 32768; - changespritestat(i,11); - break; - case SOUNDFX: - { - sp->cstat |= 32768; - changespritestat(i,2); - } - break; - case EXPLOSION2: - case EXPLOSION3: - case BURNING: - case SMALLSMOKE: - if(j >= 0) - { - sp->ang = spj->ang; - sp->shade = -64; - sp->cstat = 128|(krand()&4); - } - - if(sp->picnum == EXPLOSION2) - { - sp->xrepeat = 48; - sp->yrepeat = 48; - sp->shade = -127; - sp->cstat |= 128; - } - else if(sp->picnum == EXPLOSION3) - { - sp->xrepeat = 128; - sp->yrepeat = 128; - sp->shade = -127; - sp->cstat |= 128; - } - else if(sp->picnum == SMALLSMOKE) - { - sp->xrepeat = 12; - sp->yrepeat = 12; - } - else if(sp->picnum == BURNING) - { - sp->xrepeat = 4; - sp->yrepeat = 4; - } - - if(j >= 0) - { - x = getflorzofslope(sp->sectnum,sp->x,sp->y); - if(sp->z > x-(12<<8) ) - sp->z = x-(12<<8); - } - - changespritestat(i, STAT_MISC); - - break; - - case PLAYERONWATER: - if(j >= 0) - { - sp->xrepeat = spj->xrepeat; - sp->yrepeat = spj->yrepeat; - sp->zvel = 128; - if(sp->sector()->lotag != 2) - sp->cstat |= 32768; - } - changespritestat(i,13); - break; - - case APLAYER: - sp->xrepeat = sp->yrepeat = 0; - j = ud.coop; - if(j == 2) j = 0; - - if( ud.multimode < 2 || (ud.multimode > 1 && j != sp->lotag) ) - changespritestat(i, STAT_MISC); - else - changespritestat(i,10); - break; - - case WATERBUBBLE: - if(j >= 0 && spj->picnum == APLAYER) - sp->z-= (16<<8); - if(sp->picnum == WATERBUBBLE) - { - if(j >= 0) - sp->ang = spj->ang; - sp->xrepeat = sp->yrepeat = 1+(krand()&7); - } - else - sp->xrepeat = sp->yrepeat = 32; - changespritestat(i, STAT_MISC); - break; - case CRANE: - initcrane(actj, act, CRANEPOLE); - break; - case WATERDRIP: - initwaterdrip(actj, act); - break; - case TRASH: - - if(sp->picnum != WATERDRIP) sp->ang = krand()&2047; - - sp->xrepeat = 24; - sp->yrepeat = 24; - changespritestat(i,6); - break; - - case PLUG: - sp->lotag = 9999; - changespritestat(i,6); - break; - case TOUCHPLATE: - t[2] = sectp->floorz; - if(sectp->lotag != 1 && sectp->lotag != 2) - sectp->floorz = sp->z; - if(sp->pal && ud.multimode > 1) - { - sp->xrepeat=sp->yrepeat=0; - changespritestat(i, STAT_MISC); - break; - } - [[fallthrough]]; - case WATERBUBBLEMAKER: - sp->cstat |= 32768; - changespritestat(i,6); - break; - case BOLT1: - case BOLT1+1: - case BOLT1+2: - case BOLT1+3: - t[0] = sp->xrepeat; - t[1] = sp->yrepeat; - [[fallthrough]]; - case MASTERSWITCH: - if(sp->picnum == MASTERSWITCH) - sp->cstat |= 32768; - sp->yvel = 0; - changespritestat(i,6); - break; - - // this is not really nice... - case BIKERB: - case BIKERBV2: - case BIKER: - case MAKEOUT: - case CHEERB: - case CHEER: - case COOTPLAY: - case BILLYPLAY: - case MINIONBOAT: - case HULKBOAT: - case CHEERBOAT: - case RABBIT: - case ROCK: - case ROCK2: - case MAMACLOUD: - case MAMA: - case UFO1_RRRA: - if (isRRRA()) goto rrra_badguy2; - else goto default_case; - - case UFO1_RR: - if (!isRRRA()) goto rrra_badguy2; - else goto default_case; - - case SBSWIPE: - case CHEERSTAYPUT: - if (isRRRA()) goto rrra_stayput; - else goto default_case; - case SBMOVE: - if (isRRRA()) goto default_case; - [[fallthrough]]; - - case BILLYRAYSTAYPUT: - case BRAYSNIPER: - case BUBBASTAND: - case HULKSTAYPUT: - case HENSTAYPUT: - case PIGSTAYPUT: - case MINIONSTAYPUT: - case COOTSTAYPUT: - rrra_stayput: - act->actorstayput = sp->sector(); - [[fallthrough]]; - case BOULDER: - case BOULDER1: - case RAT: - case TORNADO: - case BILLYCOCK: - case BILLYRAY: - case DOGRUN: - case LTH: - case HULK: - case HEN: - case DRONE: - case PIG: - case MINION: - case UFO2: - case UFO3: - case UFO4: - case UFO5: - case COW: - case COOT: - case SHARK: - case VIXEN: - rrra_badguy2: - sp->xrepeat = 40; - sp->yrepeat = 40; - // Note: All inappropriate tiles have already been weeded out by the outer switch block so this does not need game type checks anymore. - switch (sp->picnum) - { - case VIXEN: - if (sp->pal == 34) - { - sp->xrepeat = 22; - sp->yrepeat = 21; - } - else - { - sp->xrepeat = 22; - sp->yrepeat = 20; - } - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - case HULKHANG: - case HULKHANGDEAD: - case HULKJUMP: - case HULK: - case HULKSTAYPUT: - sp->xrepeat = 32; - sp->yrepeat = 32; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - case COOTPLAY: - case COOT: - case COOTSTAYPUT: - sp->xrepeat = 24; - sp->yrepeat = 18; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - sp->clipdist <<= 2; - break; - case DRONE: - sp->xrepeat = 14; - sp->yrepeat = 7; - sp->clipdist = 128; - break; - case SBSWIPE: - case BILLYPLAY: - case BILLYCOCK: - case BILLYRAY: - case BILLYRAYSTAYPUT: - case BRAYSNIPER: - case BUBBASTAND: - sp->xrepeat = 25; - sp->yrepeat = 21; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - case COW: - sp->xrepeat = 32; - sp->yrepeat = 32; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - case HEN: - case HENSTAYPUT: - case HENSTAND: - if(sp->pal == 35) - { - sp->xrepeat = 42; - sp->yrepeat = 30; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - } - else - { - sp->xrepeat = 21; - sp->yrepeat = 15; - sp->clipdist = 64; - } - break; - case MINION: - case MINIONSTAYPUT: - sp->xrepeat = 16; - sp->yrepeat = 16; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - if (isRRRA() && ufospawnsminion) - sp->pal = 8; - break; - case DOGRUN: - case PIG: - sp->xrepeat = 16; - sp->yrepeat = 16; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - case RABBIT: - sp->xrepeat = 18; - sp->yrepeat = 18; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - case MAMACLOUD: - sp->xrepeat = 64; - sp->yrepeat = 64; - sp->cstat = 2; - sp->cstat |= 512; - sp->x += (krand()&2047)-1024; - sp->y += (krand()&2047)-1024; - sp->z += (krand()&2047)-1024; - break; - case MAMA: - if (sp->pal == 30) - { - sp->xrepeat = 26; - sp->yrepeat = 26; - sp->clipdist = 75; - } - else if (sp->pal == 31) - { - sp->xrepeat = 36; - sp->yrepeat = 36; - sp->clipdist = 100; - } - else if (sp->pal == 32) - { - sp->xrepeat = 50; - sp->yrepeat = 50; - sp->clipdist = 100; - } - else - { - sp->xrepeat = 50; - sp->yrepeat = 50; - sp->clipdist = 100; - } - break; - case BIKERB: - sp->xrepeat = 28; - sp->yrepeat = 22; - sp->clipdist = 72; - break; - case BIKERBV2: - sp->xrepeat = 28; - sp->yrepeat = 22; - sp->clipdist = 72; - break; - case BIKER: - sp->xrepeat = 28; - sp->yrepeat = 22; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - case CHEERB: - sp->xrepeat = 28; - sp->yrepeat = 22; - sp->clipdist = 72; - break; - case CHEER: - case CHEERSTAYPUT: - sp->xrepeat = 20; - sp->yrepeat = 20; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - case MAKEOUT: - sp->xrepeat = 26; - sp->yrepeat = 26; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - case MINIONBOAT: - sp->xrepeat = 16; - sp->yrepeat = 16; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - case HULKBOAT: - sp->xrepeat = 48; - sp->yrepeat = 48; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - case CHEERBOAT: - sp->xrepeat = 32; - sp->yrepeat = 32; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - - case TORNADO: - sp->xrepeat = 64; - sp->yrepeat = 128; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - sp->clipdist >>= 2; - sp->cstat = 2; - break; - case LTH: - sp->xrepeat = 24; - sp->yrepeat = 22; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - case ROCK: - case ROCK2: - sp->xrepeat = 64; - sp->yrepeat = 64; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - - case UFO1_RRRA: - case UFO1_RR: - case UFO2: - case UFO3: - case UFO4: - case UFO5: - sp->xrepeat = 32; - sp->yrepeat = 32; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - sp->extra = 50; - break; - case SBMOVE: - sp->xrepeat = 48; - sp->yrepeat = 48; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - break; - - default: - break; - } - - if(j >= 0) sp->lotag = 0; - - if( ( sp->lotag > ud.player_skill ) || ud.monsters_off == 1 ) - { - sp->xrepeat=sp->yrepeat=0; - changespritestat(i, STAT_MISC); - break; - } - else - { - makeitfall(act); - - if(sp->picnum == RAT) - { - sp->ang = krand()&2047; - sp->xrepeat = sp->yrepeat = 48; - sp->cstat = 0; - } - else - { - sp->cstat |= 257; - - if(sp->picnum != 5501) - if (actorfella(act)) - ps[myconnectindex].max_actors_killed++; - } - - if(j >= 0) - { - act->timetosleep = 0; - check_fta_sounds_r(act); - changeactorstat(act, STAT_ACTOR); - sp->shade = spj->shade; - } - else changeactorstat(act, STAT_ZOMBIEACTOR); - - } - - break; - case LOCATORS: -// sp->xrepeat=sp->yrepeat=0; - sp->cstat |= 32768; - changeactorstat(act, STAT_LOCATOR); - break; - - case ACTIVATORLOCKED: - case ACTIVATOR: -// sp->xrepeat=sp->yrepeat=0; - sp->cstat |= 32768; - if (sp->picnum == ACTIVATORLOCKED) - sectp->lotag ^= 16384; - changeactorstat(act, STAT_ACTIVATOR); - break; - case DOORSHOCK: - sp->cstat |= 1+256; - sp->shade = -12; - - changeactorstat(act, STAT_STANDABLE); - break; - - case OOZ: - sp->shade = -12; - - if(j >= 0) - if( spj->picnum == NUKEBARREL ) - sp->pal = 8; - - changeactorstat(act, STAT_STANDABLE); - - getglobalz(act); - - j = (act->floorz-act->ceilingz)>>9; - - sp->yrepeat = j; - sp->xrepeat = 25-(j>>1); - sp->cstat |= (krand()&4); - break; - - case HEAVYHBOMB: - act->SetOwner(act); - sp->xrepeat = sp->yrepeat = 9; - sp->yvel = 4; - [[fallthrough]]; - case REACTOR2: - case REACTOR: - case RECON: - if (initreactor(actj, act, sp->picnum == RECON)) return i; - break; - - case RPG2SPRITE: - case MOTOAMMO: - case BOATAMMO: - if (!isRRRA()) goto default_case; - [[fallthrough]]; - - case ATOMICHEALTH: - case STEROIDS: - case HEATSENSOR: - case SHIELD: - case AIRTANK: - case TRIPBOMBSPRITE: - case COWPIE: - case HOLODUKE: - - case FIRSTGUNSPRITE: - case CHAINGUNSPRITE: - case SHOTGUNSPRITE: - case RPGSPRITE: - case SHRINKERSPRITE: - case FREEZESPRITE: - case DEVISTATORSPRITE: - - case SHOTGUNAMMO: - case FREEZEAMMO: - case HBOMBAMMO: - case CRYSTALAMMO: - case GROWAMMO: - case BATTERYAMMO: - case DEVISTATORAMMO: - case RPGAMMO: - case BOOTS: - case AMMO: - case AMMOLOTS: - case BEER: - case FIRSTAID: - case SIXPAK: - - case SAWAMMO: - case BOWLINGBALLSPRITE: - if (j >= 0) - { - sp->lotag = 0; - if (sp->picnum != BOWLINGBALLSPRITE) - { - sp->z -= (32 << 8); - sp->zvel = -(4 << 8); - } - else - { - sp->zvel = 0; - } - ssp(act, CLIPMASK0); - sp->cstat = krand()&4; - } - else - { - act->SetOwner(act); - sp->cstat = 0; - } - - if( ( ud.multimode < 2 && sp->pal != 0) || (sp->lotag > ud.player_skill) ) - { - sp->xrepeat = sp->yrepeat = 0; - changeactorstat(act, STAT_MISC); - break; - } - - sp->pal = 0; - [[fallthrough]]; - - case ACCESSCARD: - - if (sp->picnum == ATOMICHEALTH) - sp->cstat |= 128; - - if(ud.multimode > 1 && ud.coop != 1 && sp->picnum == ACCESSCARD) - { - sp->xrepeat = sp->yrepeat = 0; - changespritestat(i, STAT_MISC); - break; - } - else - { - if(sp->picnum == AMMO) - sp->xrepeat = sp->yrepeat = 16; - else sp->xrepeat = sp->yrepeat = 32; - } - - sp->shade = -17; - - if(j >= 0) changeactorstat(act, STAT_ACTOR); - else - { - changeactorstat(act, STAT_ZOMBIEACTOR); - makeitfall(act); - } - switch (sp->picnum) - { - case FIRSTGUNSPRITE: - sp->xrepeat = 16; - sp->yrepeat = 16; - break; - case SHOTGUNAMMO: - sp->xrepeat = 18; - sp->yrepeat = 17; - if (isRRRA()) sp->cstat = 256; - break; - case SIXPAK: - sp->xrepeat = 13; - sp->yrepeat = 9; - if (isRRRA()) sp->cstat = 256; - break; - case FIRSTAID: - sp->xrepeat = 8; - sp->yrepeat = 8; - break; - case BEER: - sp->xrepeat = 5; - sp->yrepeat = 4; - break; - case AMMO: - sp->xrepeat = 9; - sp->yrepeat = 9; - break; - case MOTOAMMO: - if (!isRRRA()) goto default_case; - sp->xrepeat = 23; - sp->yrepeat = 23; - break; - case BOATAMMO: - if (!isRRRA()) goto default_case; - sp->xrepeat = 16; - sp->yrepeat = 16; - break; - case COWPIE: - sp->xrepeat = 8; - sp->yrepeat = 6; - break; - case STEROIDS: - sp->xrepeat = 13; - sp->yrepeat = 9; - break; - case ACCESSCARD: - sp->xrepeat = 11; - sp->yrepeat = 12; - break; - case HEATSENSOR: - sp->xrepeat = 6; - sp->yrepeat = 4; - break; - case AIRTANK: - sp->xrepeat = 19; - sp->yrepeat = 16; - break; - case BATTERYAMMO: - sp->xrepeat = 15; - sp->yrepeat = 15; - break; - case BOWLINGBALLSPRITE: - sp->xrepeat = 11; - sp->yrepeat = 11; - break; - case TRIPBOMBSPRITE: - sp->xrepeat = 11; - sp->yrepeat = 11; - sp->yvel = 4; - sp->xvel = 32; - break; - case RPGSPRITE: - sp->xrepeat = 16; - sp->yrepeat = 14; - break; - case RPG2SPRITE: - if (!isRRRA()) goto default_case; - sp->xrepeat = 20; - sp->yrepeat = 20; - break; - case SHRINKERSPRITE: - sp->xrepeat = 22; - sp->yrepeat = 13; - break; - case DEVISTATORSPRITE: - sp->xrepeat = 18; - sp->yrepeat = 17; - break; - case SAWAMMO: - sp->xrepeat = 12; - sp->yrepeat = 7; - break; - case GROWSPRITEICON: - sp->xrepeat = 10; - sp->yrepeat = 9; - break; - case DEVISTATORAMMO: - sp->xrepeat = 10; - sp->yrepeat = 9; - break; - case ATOMICHEALTH: - sp->xrepeat = 8; - sp->yrepeat = 8; - break; - case FREEZESPRITE: - sp->xrepeat = 17; - sp->yrepeat = 16; - break; - } - sp->shade = sp->sector()->floorshade; - break; - case WATERFOUNTAIN: - sp->lotag = 1; - [[fallthrough]]; - case TREE1: - case TREE2: - case TIRE: - sp->cstat = 257; // Make it hitable - sp->extra = 1; - changespritestat(i,6); - break; - - case CAMERA1: - case CAMERA1+1: - case CAMERA1+2: - case CAMERA1+3: - case CAMERA1+4: - case CAMERAPOLE: - sp->extra = 1; - - if(gs.camerashitable) sp->cstat = 257; - else sp->cstat = 0; - - if( ud.multimode < 2 && sp->pal != 0 ) - { - sp->xrepeat = sp->yrepeat = 0; - changespritestat(i, STAT_MISC); - break; - } - else sp->pal = 0; - if(sp->picnum == CAMERAPOLE) break; - sp->picnum = CAMERA1; - changespritestat(i,1); - break; - case STEAM: - if(j >= 0) - { - sp->ang = spj->ang; - sp->cstat = 16+128+2; - sp->xrepeat=sp->yrepeat=1; - sp->xvel = -8; - ssp(act, CLIPMASK0); - } - [[fallthrough]]; - case CEILINGSTEAM: - changeactorstat(act, STAT_STANDABLE); - break; - case SECTOREFFECTOR: - spawneffector(act); - break; - - case SEENINE: - case OOZFILTER: - - sp->shade = -16; - if(sp->xrepeat <= 8) - { - sp->cstat = 32768; - sp->xrepeat=sp->yrepeat=0; - } - else sp->cstat = 1+256; - sp->extra = gs.impact_damage<<2; - act->SetOwner(act); - changeactorstat(act, STAT_STANDABLE); - break; - - case CRACK1: - case CRACK2: - case CRACK3: - case CRACK4: - sp->cstat |= 17; - sp->extra = 1; - if( ud.multimode < 2 && sp->pal != 0) - { - sp->xrepeat = sp->yrepeat = 0; - changespritestat(i, STAT_MISC); - break; - } - - sp->pal = 0; - act->SetOwner(act); - changeactorstat(act, STAT_STANDABLE); - sp->xvel = 8; - ssp(act, CLIPMASK0); - break; - - case EMPTYBIKE: - if (!isRRRA()) goto default_case; - if (ud.multimode < 2 && sp->pal == 1) - { - sp->xrepeat = sp->yrepeat = 0; - break; - } - sp->pal = 0; + default: + default_case: + spawninitdefault(actj, act); + break; + case BOWLINGPINSPOT: + case RRTILE281: + case BOWLINGBALLSPOT: + case RRTILE283: + case RRTILE2025: + case RRTILE2026: + case RRTILE2027: + case RRTILE2028: + sp->cstat = 0; + sp->cstat |= 32768; + sp->xrepeat = 0; + sp->yrepeat = 0; + sp->clipdist = 0; + sp->extra = 0; + changeactorstat(act, STAT_BOWLING); + break; + case RRTILE3410: + sp->extra = 0; + changeactorstat(act, 107); + break; + case RRTILE8450: + if (!isRRRA()) goto default_case; + sp->xrepeat = 64; + sp->yrepeat = 64; + sp->extra = sp->lotag; + sp->cstat |= 257; + changeactorstat(act, 116); + break; + case PIG + 11: + if (!isRRRA()) goto default_case; + sp->xrepeat = 16; + sp->yrepeat = 16; + sp->clipdist = 0; + sp->extra = 0; + sp->cstat = 0; + changeactorstat(act, 121); + break; + case RRTILE8487: + case RRTILE8489: + if (!isRRRA()) goto default_case; + sp->xrepeat = 32; + sp->yrepeat = 32; + sp->extra = 0; + sp->cstat |= 257; + sp->hitag = 0; + changeactorstat(act, 117); + break; + case RRTILE7424: + if (!isRRRA()) goto default_case; + sp->extra = 0; + sp->xrepeat = 0; + sp->yrepeat = 0; + changeactorstat(act, 11); + break; + case RRTILE7936: + if (!isRRRA()) goto default_case; + sp->xrepeat = 0; + sp->yrepeat = 0; + fogactive = 1; + break; + case RRTILE6144: + if (!isRRRA()) goto default_case; + sp->xrepeat = 0; + sp->yrepeat = 0; + ps[screenpeek].sea_sick_stat = 1; + break; + case RRTILE8448: + if (!isRRRA()) goto default_case; + sp->lotag = 1; + sp->clipdist = 0; + break; + case RRTILE8099: + if (!isRRRA()) goto default_case; + sp->lotag = 5; + sp->clipdist = 0; + changeactorstat(act, 123); + break; + case RRTILE8704: + if (!isRRRA()) goto default_case; + sp->lotag = 1; + sp->clipdist = 0; + break; + case RRTILE8192: + if (!isRRRA()) goto default_case; + sp->xrepeat = 0; + sp->yrepeat = 0; + ufospawnsminion = 1; + break; + case RRTILE8193: + if (!isRRRA()) goto default_case; + sp->xrepeat = 0; + sp->yrepeat = 0; + pistonsound = 1; + break; + case RRTILE8165: + if (!isRRRA()) goto default_case; + sp->lotag = 1; + sp->clipdist = 0; + act->SetOwner(act); + sp->extra = 0; + changeactorstat(act, 115); + break; + case RRTILE8593: + if (!isRRRA()) goto default_case; + sp->lotag = 1; + sp->clipdist = 0; + act->SetOwner(act); + sp->extra = 0; + changeactorstat(act, 122); + break; + case RRTILE285: + case RRTILE286: + case RRTILE287: + case RRTILE288: + case RRTILE289: + case RRTILE290: + case RRTILE291: + case RRTILE292: + case RRTILE293: + sp->cstat = 0; + sp->cstat |= 32768; + sp->xrepeat = 0; + sp->yrepeat = 0; + sp->clipdist = 0; + sp->lotag = 0; + changeactorstat(act, 106); + break; + + case RRTILE2460: + case RRTILE2465: + case BIKEJIBA: + case BIKEJIBB: + case BIKEJIBC: + case BIKERJIBA: + case BIKERJIBB: + case BIKERJIBC: + case BIKERJIBD: + case CHEERJIBA: + case CHEERJIBB: + case CHEERJIBC: + case CHEERJIBD: + case FBOATJIBA: + case FBOATJIBB: + case RABBITJIBA: + case RABBITJIBB: + case RABBITJIBC: + case MAMAJIBA: + case MAMAJIBB: + // impossible to do with better methods outside of redoing the entire switch/case block + if (isRRRA()) goto rrra_badguy; + else goto default_case; + + case WATERSPLASH2: + case MUD: + if (spj) + { + setsprite(act, spj->x, spj->y, spj->z); + sp->xrepeat = sp->yrepeat = 8 + (krand() & 7); + } + else sp->xrepeat = sp->yrepeat = 16 + (krand() & 15); + + sp->shade = -16; + sp->cstat |= 128; + if (spj) + { + if (spj->sector()->lotag == 2) + { + sp->z = getceilzofslope(sp->sectnum, sp->x, sp->y) + (16 << 8); + sp->cstat |= 8; + } + else if (spj->sector()->lotag == 1) + sp->z = getflorzofslope(sp->sectnum, sp->x, sp->y); + } + + if (sectp->floorpicnum == FLOORSLIME || + sectp->ceilingpicnum == FLOORSLIME) + sp->pal = 7; + [[fallthrough]]; + case NEON1: + case NEON2: + case NEON3: + case NEON4: + case NEON5: + case NEON6: + case DOMELITE: + if (sp->picnum != WATERSPLASH2) + sp->cstat |= 257; + if (sp->picnum == DOMELITE) + sp->cstat |= 257; + [[fallthrough]]; + case JIBS1: + case JIBS2: + case JIBS3: + case JIBS4: + case JIBS5: + case JIBS6: + case DUKETORSO: + case DUKEGUN: + case DUKELEG: + case BILLYJIBA: + case BILLYJIBB: + case HULKJIBA: + case HULKJIBB: + case HULKJIBC: + case MINJIBA: + case MINJIBB: + case MINJIBC: + case COOTJIBA: + case COOTJIBB: + case COOTJIBC: + rrra_badguy: + if (sp->picnum == JIBS6) + { + sp->xrepeat >>= 1; + sp->yrepeat >>= 1; + } + else if (isRRRA()) + { + if (sp->picnum == RABBITJIBA) + { sp->xrepeat = 18; sp->yrepeat = 18; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - act->saved_ammo = 100; - sp->cstat = 257; - sp->lotag = 1; - changeactorstat(act, STAT_ACTOR); - break; - case EMPTYBOAT: - if (!isRRRA()) goto default_case; - if (ud.multimode < 2 && sp->pal == 1) - { - sp->xrepeat = sp->yrepeat = 0; - break; - } - sp->pal = 0; - sp->xrepeat = 32; - sp->yrepeat = 32; - sp->clipdist = MulScale(sp->xrepeat,tileWidth(sp->picnum), 7); - act->saved_ammo = 20; - sp->cstat = 257; - sp->lotag = 1; - changespritestat(i,1); - break; + } + else if (sp->picnum == RABBITJIBB) + { + sp->xrepeat = 36; + sp->yrepeat = 36; + } + else if (sp->picnum == RABBITJIBC) + { + sp->xrepeat = 54; + sp->yrepeat = 54; + } + } + changeactorstat(act, STAT_MISC); + break; + case TONGUE: + if (spj) + sp->ang = spj->ang; + sp->z -= PHEIGHT_RR; + sp->zvel = 256 - (krand() & 511); + sp->xvel = 64 - (krand() & 127); + changeactorstat(act, 4); + break; + case TRANSPORTERSTAR: + case TRANSPORTERBEAM: + spawntransporter(actj, act, sp->picnum == TRANSPORTERBEAM); + break; - case TOILET: - case STALL: - case RRTILE2121: - case RRTILE2122: - sp->lotag = 1; - sp->cstat |= 257; - sp->clipdist = 8; - act->SetOwner(act); - break; - case CANWITHSOMETHING: - case RUBBERCAN: - sp->extra = 0; - [[fallthrough]]; - case EXPLODINGBARREL: - case HORSEONSIDE: - case FIREBARREL: - case NUKEBARREL: - case FIREVASE: - case NUKEBARRELDENTED: - case NUKEBARRELLEAKED: - case WOODENHORSE: + case FRAMEEFFECT1: + if (spj) + { + sp->xrepeat = spj->xrepeat; + sp->yrepeat = spj->yrepeat; + if (spj->picnum == APLAYER) + t[1] = SMALLSMOKE; + else + t[1] = spj->picnum; + } + else sp->xrepeat = sp->yrepeat = 0; - if(j >= 0) - sp->xrepeat = sp->yrepeat = 32; - sp->clipdist = 72; - makeitfall(act); - if(j >= 0) act->SetOwner(actj); - else act->SetOwner(act); - [[fallthrough]]; + changeactorstat(act, STAT_MISC); + break; - case EGG: - if( ud.monsters_off == 1 && sp->picnum == EGG ) - { - sp->xrepeat = sp->yrepeat = 0; - changeactorstat(act, STAT_MISC); - } - else - { - if(sp->picnum == EGG) - sp->clipdist = 24; - sp->cstat = 257|(krand()&4); - changeactorstat(act, STAT_ZOMBIEACTOR); - } - break; - case TOILETWATER: - sp->shade = -16; - changeactorstat(act, STAT_STANDABLE); - break; - case RRTILE63: - sp->cstat |= 32768; - sp->xrepeat = 1; - sp->yrepeat = 1; - sp->clipdist = 1; - changespritestat(i,100); - break; + case FORCESPHERE: + if (!spj) + { + sp->cstat = 32768; + changeactorstat(act, 2); + } + else + { + sp->xrepeat = sp->yrepeat = 1; + changeactorstat(act, STAT_MISC); + } + break; + + case BLOOD: + sp->xrepeat = sp->yrepeat = 4; + sp->z -= (26 << 8); + changeactorstat(act, STAT_MISC); + break; + case BLOODPOOL: + if (spawnbloodpoolpart1(act)) break; + + if (spj) + { + if (spj->pal == 1) + sp->pal = 1; + else if (spj->pal != 6 && spj->picnum != NUKEBARREL && spj->picnum != TIRE) + { + sp->pal = 2; // Red + } + else sp->pal = 0; // green + + if (spj->picnum == TIRE) + sp->shade = 127; + } + sp->cstat |= 32; + [[fallthrough]]; + + case BLOODSPLAT1: + case BLOODSPLAT2: + case BLOODSPLAT3: + case BLOODSPLAT4: + sp->cstat |= 16; + sp->xrepeat = 7 + (krand() & 7); + sp->yrepeat = 7 + (krand() & 7); + sp->z -= (16 << 8); + if (spj && spj->pal == 6) + sp->pal = 6; + insertspriteq(act); + changeactorstat(act, STAT_MISC); + break; + + case HYDRENT: + case SATELITE: + case FUELPOD: + case SOLARPANNEL: + case ANTENNA: + case GRATE1: + case CHAIR1: + case CHAIR2: + case CHAIR3: + case BOTTLE1: + case BOTTLE2: + case BOTTLE3: + case BOTTLE4: + case BOTTLE5: + case BOTTLE6: + case BOTTLE7: + case BOTTLE8: + case BOTTLE10: + case BOTTLE11: + case BOTTLE12: + case BOTTLE13: + case BOTTLE14: + case BOTTLE15: + case BOTTLE16: + case BOTTLE17: + case BOTTLE18: + case BOTTLE19: + case SCALE: + case VACUUM: + case FANSPRITE: + case CACTUS: + case CACTUSBROKE: + case CAMERALIGHT: + case MOVIECAMERA: + case IVUNIT: + case POT1: + case POT2: + case POT3: + case SUSHIPLATE1: + case SUSHIPLATE2: + case SUSHIPLATE3: + case SUSHIPLATE4: + case SUSHIPLATE5: + case WAITTOBESEATED: + case VASE: + case PIPE1: + case PIPE2: + case PIPE3: + case PIPE4: + case PIPE5: + case PIPE6: + sp->clipdist = 32; + sp->cstat |= 257; + changeactorstat(act, 0); + break; + case FEMMAG1: + case FEMMAG2: + sp->cstat &= ~257; + changeactorstat(act, 0); + break; + + case MASKWALL7: + { + int j = sp->cstat & 60; + sp->cstat = j | 1; + changeactorstat(act, 0); + break; } - return i; + case FOOTPRINTS: + case FOOTPRINTS2: + case FOOTPRINTS3: + case FOOTPRINTS4: + initfootprint(actj, act); + break; + case FEM10: + case NAKED1: + case STATUE: + case TOUGHGAL: + sp->yvel = sp->hitag; + sp->hitag = -1; + [[fallthrough]]; + case QUEBALL: + case STRIPEBALL: + if (sp->picnum == QUEBALL || sp->picnum == STRIPEBALL) + { + sp->cstat = 256; + sp->clipdist = 8; + } + else + { + sp->cstat |= 257; + sp->clipdist = 32; + } + changeactorstat(act, 2); + break; + case BOWLINGBALL: + sp->cstat = 256; + sp->clipdist = 64; + sp->xrepeat = 11; + sp->yrepeat = 9; + changeactorstat(act, 2); + break; + case HENSTAND: + sp->cstat = 257; + sp->clipdist = 48; + sp->xrepeat = 21; + sp->yrepeat = 15; + changeactorstat(act, 2); + break; + case RRTILE295: + sp->cstat |= 32768; + changeactorstat(act, 107); + break; + case RRTILE296: + case RRTILE297: + sp->xrepeat = 64; + sp->yrepeat = 64; + sp->clipdist = 64; + changeactorstat(act, 108); + break; + case RRTILE3190: + case RRTILE3191: + case RRTILE3192: + sp->cstat = 257; + sp->clipdist = 8; + sp->xrepeat = 32; + sp->yrepeat = 26; + sp->xvel = 32; + changeactorstat(act, 1); + break; + case RRTILE3120: + sp->cstat = 257; + sp->clipdist = 8; + sp->xrepeat = 12; + sp->yrepeat = 10; + sp->xvel = 32; + changeactorstat(act, 1); + break; + case RRTILE3122: + sp->cstat = 257; + sp->clipdist = 2; + sp->xrepeat = 8; + sp->yrepeat = 6; + sp->xvel = 16; + changeactorstat(act, 1); + break; + case RRTILE3123: + sp->cstat = 257; + sp->clipdist = 8; + sp->xrepeat = 13; + sp->yrepeat = 13; + sp->xvel = 16; + changeactorstat(act, 1); + break; + case RRTILE3124: + sp->cstat = 257; + sp->clipdist = 8; + sp->xrepeat = 17; + sp->yrepeat = 12; + sp->xvel = 32; + changeactorstat(act, 1); + break; + case RRTILE3132: + sp->cstat = 257; + sp->clipdist = 8; + sp->xrepeat = 13; + sp->yrepeat = 10; + sp->xvel = 0; + changeactorstat(act, 1); + break; + case BOWLINGPIN: + sp->cstat = 257; + sp->clipdist = 48; + sp->xrepeat = 23; + sp->yrepeat = 23; + changeactorstat(act, 2); + break; + case DUKELYINGDEAD: + if (spj && spj->picnum == APLAYER) + { + sp->xrepeat = spj->xrepeat; + sp->yrepeat = spj->yrepeat; + sp->shade = spj->shade; + sp->pal = ps[spj->yvel].palookup; + } + sp->cstat = 0; + sp->extra = 1; + sp->xvel = 292; + sp->zvel = 360; + [[fallthrough]]; + case RESPAWNMARKERRED: + if (sp->picnum == RESPAWNMARKERRED) + { + sp->xrepeat = sp->yrepeat = 8; + if (spj) sp->z = actj->floorz; + } + else + { + sp->cstat |= 257; + sp->clipdist = 128; + } + [[fallthrough]]; + case MIKE: + if (sp->picnum == MIKE) + sp->yvel = sp->hitag; + changeactorstat(act, 1); + break; + + case SPOTLITE: + t[0] = sp->x; + t[1] = sp->y; + break; + case BULLETHOLE: + sp->xrepeat = sp->yrepeat = 3; + sp->cstat = 16 + (krand() & 12); + insertspriteq(act); + [[fallthrough]]; + case MONEY: + if (sp->picnum == MONEY) + { + act->temp_data[0] = krand() & 2047; + sp->cstat = krand() & 12; + sp->xrepeat = sp->yrepeat = 8; + sp->ang = krand() & 2047; + } + changeactorstat(act, STAT_MISC); + break; + + case SHELL: //From the player + case SHOTGUNSHELL: + initshell(actj, act, sp->picnum == SHELL); + break; + case RESPAWN: + sp->extra = 66 - 13; + [[fallthrough]]; + case MUSICANDSFX: + if (ud.multimode < 2 && sp->pal == 1) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + sp->cstat = 32768; + changeactorstat(act, 11); + break; + case SOUNDFX: + { + sp->cstat |= 32768; + changeactorstat(act, 2); + } + break; + case EXPLOSION2: + case EXPLOSION3: + case BURNING: + case SMALLSMOKE: + if (spj) + { + sp->ang = spj->ang; + sp->shade = -64; + sp->cstat = 128 | (krand() & 4); + } + + if (sp->picnum == EXPLOSION2) + { + sp->xrepeat = 48; + sp->yrepeat = 48; + sp->shade = -127; + sp->cstat |= 128; + } + else if (sp->picnum == EXPLOSION3) + { + sp->xrepeat = 128; + sp->yrepeat = 128; + sp->shade = -127; + sp->cstat |= 128; + } + else if (sp->picnum == SMALLSMOKE) + { + sp->xrepeat = 12; + sp->yrepeat = 12; + } + else if (sp->picnum == BURNING) + { + sp->xrepeat = 4; + sp->yrepeat = 4; + } + + if (spj) + { + int x = getflorzofslope(sp->sectnum, sp->x, sp->y); + if (sp->z > x - (12 << 8)) + sp->z = x - (12 << 8); + } + + changeactorstat(act, STAT_MISC); + + break; + + case PLAYERONWATER: + if (spj) + { + sp->xrepeat = spj->xrepeat; + sp->yrepeat = spj->yrepeat; + sp->zvel = 128; + if (sp->sector()->lotag != 2) + sp->cstat |= 32768; + } + changeactorstat(act, 13); + break; + + case APLAYER: + { + sp->xrepeat = sp->yrepeat = 0; + int j = ud.coop; + if (j == 2) j = 0; + + if (ud.multimode < 2 || (ud.multimode > 1 && j != sp->lotag)) + changeactorstat(act, STAT_MISC); + else + changeactorstat(act, 10); + break; + } + case WATERBUBBLE: + if (spj && spj->picnum == APLAYER) + sp->z -= (16 << 8); + if (sp->picnum == WATERBUBBLE) + { + if (spj) + sp->ang = spj->ang; + sp->xrepeat = sp->yrepeat = 1 + (krand() & 7); + } + else + sp->xrepeat = sp->yrepeat = 32; + changeactorstat(act, STAT_MISC); + break; + case CRANE: + initcrane(actj, act, CRANEPOLE); + break; + case WATERDRIP: + initwaterdrip(actj, act); + break; + case TRASH: + + if (sp->picnum != WATERDRIP) sp->ang = krand() & 2047; + + sp->xrepeat = 24; + sp->yrepeat = 24; + changeactorstat(act, 6); + break; + + case PLUG: + sp->lotag = 9999; + changeactorstat(act, 6); + break; + case TOUCHPLATE: + t[2] = sectp->floorz; + if (sectp->lotag != 1 && sectp->lotag != 2) + sectp->floorz = sp->z; + if (sp->pal && ud.multimode > 1) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + [[fallthrough]]; + case WATERBUBBLEMAKER: + sp->cstat |= 32768; + changeactorstat(act, 6); + break; + case BOLT1: + case BOLT1 + 1: + case BOLT1 + 2: + case BOLT1 + 3: + t[0] = sp->xrepeat; + t[1] = sp->yrepeat; + [[fallthrough]]; + case MASTERSWITCH: + if (sp->picnum == MASTERSWITCH) + sp->cstat |= 32768; + sp->yvel = 0; + changeactorstat(act, 6); + break; + + // this is not really nice... + case BIKERB: + case BIKERBV2: + case BIKER: + case MAKEOUT: + case CHEERB: + case CHEER: + case COOTPLAY: + case BILLYPLAY: + case MINIONBOAT: + case HULKBOAT: + case CHEERBOAT: + case RABBIT: + case ROCK: + case ROCK2: + case MAMACLOUD: + case MAMA: + case UFO1_RRRA: + if (isRRRA()) goto rrra_badguy2; + else goto default_case; + + case UFO1_RR: + if (!isRRRA()) goto rrra_badguy2; + else goto default_case; + + case SBSWIPE: + case CHEERSTAYPUT: + if (isRRRA()) goto rrra_stayput; + else goto default_case; + case SBMOVE: + if (isRRRA()) goto default_case; + [[fallthrough]]; + + case BILLYRAYSTAYPUT: + case BRAYSNIPER: + case BUBBASTAND: + case HULKSTAYPUT: + case HENSTAYPUT: + case PIGSTAYPUT: + case MINIONSTAYPUT: + case COOTSTAYPUT: + rrra_stayput: + act->actorstayput = sp->sector(); + [[fallthrough]]; + case BOULDER: + case BOULDER1: + case RAT: + case TORNADO: + case BILLYCOCK: + case BILLYRAY: + case DOGRUN: + case LTH: + case HULK: + case HEN: + case DRONE: + case PIG: + case MINION: + case UFO2: + case UFO3: + case UFO4: + case UFO5: + case COW: + case COOT: + case SHARK: + case VIXEN: + rrra_badguy2: + sp->xrepeat = 40; + sp->yrepeat = 40; + // Note: All inappropriate tiles have already been weeded out by the outer switch block so this does not need game type checks anymore. + switch (sp->picnum) + { + case VIXEN: + if (sp->pal == 34) + { + sp->xrepeat = 22; + sp->yrepeat = 21; + } + else + { + sp->xrepeat = 22; + sp->yrepeat = 20; + } + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + case HULKHANG: + case HULKHANGDEAD: + case HULKJUMP: + case HULK: + case HULKSTAYPUT: + sp->xrepeat = 32; + sp->yrepeat = 32; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + case COOTPLAY: + case COOT: + case COOTSTAYPUT: + sp->xrepeat = 24; + sp->yrepeat = 18; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + sp->clipdist <<= 2; + break; + case DRONE: + sp->xrepeat = 14; + sp->yrepeat = 7; + sp->clipdist = 128; + break; + case SBSWIPE: + case BILLYPLAY: + case BILLYCOCK: + case BILLYRAY: + case BILLYRAYSTAYPUT: + case BRAYSNIPER: + case BUBBASTAND: + sp->xrepeat = 25; + sp->yrepeat = 21; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + case COW: + sp->xrepeat = 32; + sp->yrepeat = 32; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + case HEN: + case HENSTAYPUT: + case HENSTAND: + if (sp->pal == 35) + { + sp->xrepeat = 42; + sp->yrepeat = 30; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + } + else + { + sp->xrepeat = 21; + sp->yrepeat = 15; + sp->clipdist = 64; + } + break; + case MINION: + case MINIONSTAYPUT: + sp->xrepeat = 16; + sp->yrepeat = 16; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + if (isRRRA() && ufospawnsminion) + sp->pal = 8; + break; + case DOGRUN: + case PIG: + sp->xrepeat = 16; + sp->yrepeat = 16; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + case RABBIT: + sp->xrepeat = 18; + sp->yrepeat = 18; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + case MAMACLOUD: + sp->xrepeat = 64; + sp->yrepeat = 64; + sp->cstat = 2; + sp->cstat |= 512; + sp->x += (krand() & 2047) - 1024; + sp->y += (krand() & 2047) - 1024; + sp->z += (krand() & 2047) - 1024; + break; + case MAMA: + if (sp->pal == 30) + { + sp->xrepeat = 26; + sp->yrepeat = 26; + sp->clipdist = 75; + } + else if (sp->pal == 31) + { + sp->xrepeat = 36; + sp->yrepeat = 36; + sp->clipdist = 100; + } + else if (sp->pal == 32) + { + sp->xrepeat = 50; + sp->yrepeat = 50; + sp->clipdist = 100; + } + else + { + sp->xrepeat = 50; + sp->yrepeat = 50; + sp->clipdist = 100; + } + break; + case BIKERB: + sp->xrepeat = 28; + sp->yrepeat = 22; + sp->clipdist = 72; + break; + case BIKERBV2: + sp->xrepeat = 28; + sp->yrepeat = 22; + sp->clipdist = 72; + break; + case BIKER: + sp->xrepeat = 28; + sp->yrepeat = 22; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + case CHEERB: + sp->xrepeat = 28; + sp->yrepeat = 22; + sp->clipdist = 72; + break; + case CHEER: + case CHEERSTAYPUT: + sp->xrepeat = 20; + sp->yrepeat = 20; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + case MAKEOUT: + sp->xrepeat = 26; + sp->yrepeat = 26; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + case MINIONBOAT: + sp->xrepeat = 16; + sp->yrepeat = 16; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + case HULKBOAT: + sp->xrepeat = 48; + sp->yrepeat = 48; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + case CHEERBOAT: + sp->xrepeat = 32; + sp->yrepeat = 32; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + + case TORNADO: + sp->xrepeat = 64; + sp->yrepeat = 128; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + sp->clipdist >>= 2; + sp->cstat = 2; + break; + case LTH: + sp->xrepeat = 24; + sp->yrepeat = 22; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + case ROCK: + case ROCK2: + sp->xrepeat = 64; + sp->yrepeat = 64; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + + case UFO1_RRRA: + case UFO1_RR: + case UFO2: + case UFO3: + case UFO4: + case UFO5: + sp->xrepeat = 32; + sp->yrepeat = 32; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + sp->extra = 50; + break; + case SBMOVE: + sp->xrepeat = 48; + sp->yrepeat = 48; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + break; + + default: + break; + } + + if (spj) sp->lotag = 0; + + if ((sp->lotag > ud.player_skill) || ud.monsters_off == 1) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + else + { + makeitfall(act); + + if (sp->picnum == RAT) + { + sp->ang = krand() & 2047; + sp->xrepeat = sp->yrepeat = 48; + sp->cstat = 0; + } + else + { + sp->cstat |= 257; + + if (sp->picnum != 5501) + if (actorfella(act)) + ps[myconnectindex].max_actors_killed++; + } + + if (spj) + { + act->timetosleep = 0; + check_fta_sounds_r(act); + changeactorstat(act, STAT_ACTOR); + sp->shade = spj->shade; + } + else changeactorstat(act, STAT_ZOMBIEACTOR); + + } + + break; + case LOCATORS: + // sp->xrepeat=sp->yrepeat=0; + sp->cstat |= 32768; + changeactorstat(act, STAT_LOCATOR); + break; + + case ACTIVATORLOCKED: + case ACTIVATOR: + // sp->xrepeat=sp->yrepeat=0; + sp->cstat |= 32768; + if (sp->picnum == ACTIVATORLOCKED) + sectp->lotag ^= 16384; + changeactorstat(act, STAT_ACTIVATOR); + break; + case DOORSHOCK: + sp->cstat |= 1 + 256; + sp->shade = -12; + + changeactorstat(act, STAT_STANDABLE); + break; + + case OOZ: + { + sp->shade = -12; + + if (spj) + if (spj->picnum == NUKEBARREL) + sp->pal = 8; + + changeactorstat(act, STAT_STANDABLE); + + getglobalz(act); + + int j = (act->floorz - act->ceilingz) >> 9; + + sp->yrepeat = j; + sp->xrepeat = 25 - (j >> 1); + sp->cstat |= (krand() & 4); + break; + } + case HEAVYHBOMB: + act->SetOwner(act); + sp->xrepeat = sp->yrepeat = 9; + sp->yvel = 4; + [[fallthrough]]; + case REACTOR2: + case REACTOR: + case RECON: + if (initreactor(actj, act, sp->picnum == RECON)) return act; + break; + + case RPG2SPRITE: + case MOTOAMMO: + case BOATAMMO: + if (!isRRRA()) goto default_case; + [[fallthrough]]; + + case ATOMICHEALTH: + case STEROIDS: + case HEATSENSOR: + case SHIELD: + case AIRTANK: + case TRIPBOMBSPRITE: + case COWPIE: + case HOLODUKE: + + case FIRSTGUNSPRITE: + case CHAINGUNSPRITE: + case SHOTGUNSPRITE: + case RPGSPRITE: + case SHRINKERSPRITE: + case FREEZESPRITE: + case DEVISTATORSPRITE: + + case SHOTGUNAMMO: + case FREEZEAMMO: + case HBOMBAMMO: + case CRYSTALAMMO: + case GROWAMMO: + case BATTERYAMMO: + case DEVISTATORAMMO: + case RPGAMMO: + case BOOTS: + case AMMO: + case AMMOLOTS: + case BEER: + case FIRSTAID: + case SIXPAK: + + case SAWAMMO: + case BOWLINGBALLSPRITE: + if (spj) + { + sp->lotag = 0; + if (sp->picnum != BOWLINGBALLSPRITE) + { + sp->z -= (32 << 8); + sp->zvel = -(4 << 8); + } + else + { + sp->zvel = 0; + } + ssp(act, CLIPMASK0); + sp->cstat = krand() & 4; + } + else + { + act->SetOwner(act); + sp->cstat = 0; + } + + if ((ud.multimode < 2 && sp->pal != 0) || (sp->lotag > ud.player_skill)) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + + sp->pal = 0; + [[fallthrough]]; + + case ACCESSCARD: + + if (sp->picnum == ATOMICHEALTH) + sp->cstat |= 128; + + if (ud.multimode > 1 && ud.coop != 1 && sp->picnum == ACCESSCARD) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + else + { + if (sp->picnum == AMMO) + sp->xrepeat = sp->yrepeat = 16; + else sp->xrepeat = sp->yrepeat = 32; + } + + sp->shade = -17; + + if (spj) changeactorstat(act, STAT_ACTOR); + else + { + changeactorstat(act, STAT_ZOMBIEACTOR); + makeitfall(act); + } + switch (sp->picnum) + { + case FIRSTGUNSPRITE: + sp->xrepeat = 16; + sp->yrepeat = 16; + break; + case SHOTGUNAMMO: + sp->xrepeat = 18; + sp->yrepeat = 17; + if (isRRRA()) sp->cstat = 256; + break; + case SIXPAK: + sp->xrepeat = 13; + sp->yrepeat = 9; + if (isRRRA()) sp->cstat = 256; + break; + case FIRSTAID: + sp->xrepeat = 8; + sp->yrepeat = 8; + break; + case BEER: + sp->xrepeat = 5; + sp->yrepeat = 4; + break; + case AMMO: + sp->xrepeat = 9; + sp->yrepeat = 9; + break; + case MOTOAMMO: + if (!isRRRA()) goto default_case; + sp->xrepeat = 23; + sp->yrepeat = 23; + break; + case BOATAMMO: + if (!isRRRA()) goto default_case; + sp->xrepeat = 16; + sp->yrepeat = 16; + break; + case COWPIE: + sp->xrepeat = 8; + sp->yrepeat = 6; + break; + case STEROIDS: + sp->xrepeat = 13; + sp->yrepeat = 9; + break; + case ACCESSCARD: + sp->xrepeat = 11; + sp->yrepeat = 12; + break; + case HEATSENSOR: + sp->xrepeat = 6; + sp->yrepeat = 4; + break; + case AIRTANK: + sp->xrepeat = 19; + sp->yrepeat = 16; + break; + case BATTERYAMMO: + sp->xrepeat = 15; + sp->yrepeat = 15; + break; + case BOWLINGBALLSPRITE: + sp->xrepeat = 11; + sp->yrepeat = 11; + break; + case TRIPBOMBSPRITE: + sp->xrepeat = 11; + sp->yrepeat = 11; + sp->yvel = 4; + sp->xvel = 32; + break; + case RPGSPRITE: + sp->xrepeat = 16; + sp->yrepeat = 14; + break; + case RPG2SPRITE: + if (!isRRRA()) goto default_case; + sp->xrepeat = 20; + sp->yrepeat = 20; + break; + case SHRINKERSPRITE: + sp->xrepeat = 22; + sp->yrepeat = 13; + break; + case DEVISTATORSPRITE: + sp->xrepeat = 18; + sp->yrepeat = 17; + break; + case SAWAMMO: + sp->xrepeat = 12; + sp->yrepeat = 7; + break; + case GROWSPRITEICON: + sp->xrepeat = 10; + sp->yrepeat = 9; + break; + case DEVISTATORAMMO: + sp->xrepeat = 10; + sp->yrepeat = 9; + break; + case ATOMICHEALTH: + sp->xrepeat = 8; + sp->yrepeat = 8; + break; + case FREEZESPRITE: + sp->xrepeat = 17; + sp->yrepeat = 16; + break; + } + sp->shade = sp->sector()->floorshade; + break; + case WATERFOUNTAIN: + sp->lotag = 1; + [[fallthrough]]; + case TREE1: + case TREE2: + case TIRE: + sp->cstat = 257; // Make it hitable + sp->extra = 1; + changeactorstat(act, 6); + break; + + case CAMERA1: + case CAMERA1 + 1: + case CAMERA1 + 2: + case CAMERA1 + 3: + case CAMERA1 + 4: + case CAMERAPOLE: + sp->extra = 1; + + if (gs.camerashitable) sp->cstat = 257; + else sp->cstat = 0; + + if (ud.multimode < 2 && sp->pal != 0) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + else sp->pal = 0; + if (sp->picnum == CAMERAPOLE) break; + sp->picnum = CAMERA1; + changeactorstat(act, 1); + break; + case STEAM: + if (spj) + { + sp->ang = spj->ang; + sp->cstat = 16 + 128 + 2; + sp->xrepeat = sp->yrepeat = 1; + sp->xvel = -8; + ssp(act, CLIPMASK0); + } + [[fallthrough]]; + case CEILINGSTEAM: + changeactorstat(act, STAT_STANDABLE); + break; + case SECTOREFFECTOR: + spawneffector(act); + break; + + case SEENINE: + case OOZFILTER: + + sp->shade = -16; + if (sp->xrepeat <= 8) + { + sp->cstat = 32768; + sp->xrepeat = sp->yrepeat = 0; + } + else sp->cstat = 1 + 256; + sp->extra = gs.impact_damage << 2; + act->SetOwner(act); + changeactorstat(act, STAT_STANDABLE); + break; + + case CRACK1: + case CRACK2: + case CRACK3: + case CRACK4: + sp->cstat |= 17; + sp->extra = 1; + if (ud.multimode < 2 && sp->pal != 0) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + break; + } + + sp->pal = 0; + act->SetOwner(act); + changeactorstat(act, STAT_STANDABLE); + sp->xvel = 8; + ssp(act, CLIPMASK0); + break; + + case EMPTYBIKE: + if (!isRRRA()) goto default_case; + if (ud.multimode < 2 && sp->pal == 1) + { + sp->xrepeat = sp->yrepeat = 0; + break; + } + sp->pal = 0; + sp->xrepeat = 18; + sp->yrepeat = 18; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + act->saved_ammo = 100; + sp->cstat = 257; + sp->lotag = 1; + changeactorstat(act, STAT_ACTOR); + break; + case EMPTYBOAT: + if (!isRRRA()) goto default_case; + if (ud.multimode < 2 && sp->pal == 1) + { + sp->xrepeat = sp->yrepeat = 0; + break; + } + sp->pal = 0; + sp->xrepeat = 32; + sp->yrepeat = 32; + sp->clipdist = MulScale(sp->xrepeat, tileWidth(sp->picnum), 7); + act->saved_ammo = 20; + sp->cstat = 257; + sp->lotag = 1; + changeactorstat(act, 1); + break; + + case TOILET: + case STALL: + case RRTILE2121: + case RRTILE2122: + sp->lotag = 1; + sp->cstat |= 257; + sp->clipdist = 8; + act->SetOwner(act); + break; + case CANWITHSOMETHING: + case RUBBERCAN: + sp->extra = 0; + [[fallthrough]]; + case EXPLODINGBARREL: + case HORSEONSIDE: + case FIREBARREL: + case NUKEBARREL: + case FIREVASE: + case NUKEBARRELDENTED: + case NUKEBARRELLEAKED: + case WOODENHORSE: + + if (spj) + sp->xrepeat = sp->yrepeat = 32; + sp->clipdist = 72; + makeitfall(act); + if (spj) act->SetOwner(actj); + else act->SetOwner(act); + [[fallthrough]]; + + case EGG: + if (ud.monsters_off == 1 && sp->picnum == EGG) + { + sp->xrepeat = sp->yrepeat = 0; + changeactorstat(act, STAT_MISC); + } + else + { + if (sp->picnum == EGG) + sp->clipdist = 24; + sp->cstat = 257 | (krand() & 4); + changeactorstat(act, STAT_ZOMBIEACTOR); + } + break; + case TOILETWATER: + sp->shade = -16; + changeactorstat(act, STAT_STANDABLE); + break; + case RRTILE63: + sp->cstat |= 32768; + sp->xrepeat = 1; + sp->yrepeat = 1; + sp->clipdist = 1; + changeactorstat(act, 100); + break; + } + return act; } END_DUKE_NS