2020-05-15 20:59:13 +00:00
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
/*
|
|
|
|
Copyright (C) 1996, 2003 - 3D Realms Entertainment
|
|
|
|
Copyright (C) 2000, 2003 - Matt Saettler (EDuke Enhancements)
|
|
|
|
Copyright (C) 2020 - Christoph Oelckers
|
|
|
|
|
|
|
|
This file is part of Enhanced Duke Nukem 3D version 1.5 - Atomic Edition
|
|
|
|
|
|
|
|
Duke Nukem 3D is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public License
|
|
|
|
as published by the Free Software Foundation; either version 2
|
|
|
|
of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
|
|
|
|
Original Source: 1996 - Todd Replogle
|
|
|
|
Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms
|
|
|
|
|
|
|
|
EDuke enhancements integrated: 04/13/2003 - Matt Saettler
|
|
|
|
|
|
|
|
Note: EDuke source was in transition. Changes are in-progress in the
|
|
|
|
source as it is released.
|
|
|
|
|
|
|
|
*/
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
#include <utility>
|
|
|
|
#include "ns.h"
|
|
|
|
#include "global.h"
|
2020-06-24 19:21:02 +00:00
|
|
|
#include "sounds.h"
|
2020-07-03 21:56:14 +00:00
|
|
|
#include "names_d.h"
|
2020-10-21 17:38:53 +00:00
|
|
|
#include "dukeactor.h"
|
2020-05-15 20:59:13 +00:00
|
|
|
|
|
|
|
BEGIN_DUKE_NS
|
|
|
|
|
|
|
|
|
2021-12-04 12:02:38 +00:00
|
|
|
DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>* actors)
|
2020-05-15 20:59:13 +00:00
|
|
|
{
|
2022-01-16 23:51:40 +00:00
|
|
|
if (act->GetClass() != RUNTIME_CLASS(DDukeActor))
|
|
|
|
{
|
|
|
|
CallInitialize(act);
|
|
|
|
return act;
|
|
|
|
}
|
2021-12-30 15:51:56 +00:00
|
|
|
auto sectp = act->sector();
|
2020-05-15 20:59:13 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
if (isWorldTour())
|
2021-11-09 23:05:42 +00:00
|
|
|
{
|
2021-12-21 20:57:32 +00:00
|
|
|
switch (act->spr.picnum)
|
2021-11-09 23:05:42 +00:00
|
|
|
{
|
|
|
|
case BOSS2STAYPUT:
|
|
|
|
case BOSS3STAYPUT:
|
|
|
|
case BOSS5STAYPUT:
|
2021-12-30 15:51:56 +00:00
|
|
|
act->actorstayput = act->sector();
|
2021-11-14 11:25:25 +00:00
|
|
|
[[fallthrough]];
|
2020-05-15 20:59:13 +00:00
|
|
|
case FIREFLY:
|
|
|
|
case BOSS5:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum != FIREFLY)
|
2021-11-09 23:05:42 +00:00
|
|
|
{
|
2022-11-20 10:58:19 +00:00
|
|
|
if (actj && isrespawncontroller(actj))
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.pal = actj->spr.pal;
|
|
|
|
if (act->spr.pal != 0)
|
2021-11-09 23:05:42 +00:00
|
|
|
{
|
2022-10-04 17:08:29 +00:00
|
|
|
act->clipdist = 20;
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.625, 0.625);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
|
|
|
else
|
2021-11-09 23:05:42 +00:00
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(1.25, 1.25);
|
2022-10-04 17:13:26 +00:00
|
|
|
act->clipdist = 41;
|
2020-05-15 20:59:13 +00:00
|
|
|
}
|
|
|
|
}
|
2021-11-19 09:41:50 +00:00
|
|
|
else
|
2021-11-09 23:05:42 +00:00
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.625, 0.625);
|
2022-10-04 17:08:29 +00:00
|
|
|
act->clipdist = 20;
|
2020-05-15 20:59:13 +00:00
|
|
|
}
|
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj)
|
|
|
|
act->spr.lotag = 0;
|
2020-05-15 20:59:13 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if ((act->spr.lotag > ud.player_skill) || ud.monsters_off)
|
2021-11-09 23:05:42 +00:00
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0, 0);
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2020-05-15 20:59:13 +00:00
|
|
|
break;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
|
|
|
else
|
2021-11-09 23:05:42 +00:00
|
|
|
{
|
2020-11-02 22:06:20 +00:00
|
|
|
makeitfall(act);
|
2020-05-15 20:59:13 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL;
|
2020-05-15 20:59:13 +00:00
|
|
|
ps[connecthead].max_actors_killed++;
|
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj) {
|
2020-11-02 19:54:27 +00:00
|
|
|
act->timetosleep = 0;
|
2021-11-09 23:05:42 +00:00
|
|
|
check_fta_sounds_d(act);
|
2022-10-16 15:19:55 +00:00
|
|
|
ChangeActorStat(act, STAT_ACTOR);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
|
|
|
else
|
2022-10-16 15:19:55 +00:00
|
|
|
ChangeActorStat(act, STAT_ZOMBIEACTOR);
|
2020-05-15 20:59:13 +00:00
|
|
|
}
|
2021-11-19 09:41:50 +00:00
|
|
|
return act;
|
2020-05-15 20:59:13 +00:00
|
|
|
case FIREFLYFLYINGEFFECT:
|
2021-11-09 23:05:42 +00:00
|
|
|
act->SetOwner(actj);
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.25, 0.25);
|
2021-11-19 09:41:50 +00:00
|
|
|
return act;
|
2020-05-15 20:59:13 +00:00
|
|
|
case LAVAPOOLBUBBLE:
|
2022-10-07 21:33:37 +00:00
|
|
|
if (actj->spr.scale.X < 0.46875)
|
2021-11-19 09:41:50 +00:00
|
|
|
return act;
|
2021-11-09 23:05:42 +00:00
|
|
|
act->SetOwner(actj);
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2022-09-15 15:48:51 +00:00
|
|
|
act->spr.pos.X += krandf(32) - 16;
|
|
|
|
act->spr.pos.Y += krandf(32) - 16;
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.25, 0.25);
|
2021-11-19 09:41:50 +00:00
|
|
|
return act;
|
2020-05-15 20:59:13 +00:00
|
|
|
case WHISPYSMOKE:
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2022-09-15 15:48:51 +00:00
|
|
|
act->spr.pos.X += krandf(16) - 8;
|
|
|
|
act->spr.pos.Y += krandf(16) - 8;
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.3125, 0.3125);
|
2021-11-19 09:41:50 +00:00
|
|
|
return act;
|
2021-11-09 23:05:42 +00:00
|
|
|
case SERIOUSSAM:
|
2022-10-16 15:19:55 +00:00
|
|
|
ChangeActorStat(act, STAT_ZOMBIEACTOR);
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat = CSTAT_SPRITE_BLOCK_ALL;
|
|
|
|
act->spr.extra = 150;
|
2021-11-19 09:41:50 +00:00
|
|
|
return act;
|
2020-05-15 20:59:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
switch (act->spr.picnum)
|
2021-11-09 23:05:42 +00:00
|
|
|
{
|
2021-11-19 09:41:50 +00:00
|
|
|
default:
|
|
|
|
spawninitdefault(actj, act);
|
|
|
|
break;
|
|
|
|
case FOF:
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0, 0);
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
case WATERSPLASH2:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-08-22 16:34:01 +00:00
|
|
|
SetActor(act, actj->spr.pos);
|
2022-10-05 22:08:51 +00:00
|
|
|
double s = 0.125 + (krand() & 7) * REPEAT_SCALE;
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(s, s);
|
2022-10-05 22:08:51 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
double s = 0.25 + (krand() & 15) * REPEAT_SCALE;
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(s, s);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.shade = -16;
|
|
|
|
act->spr.cstat |= CSTAT_SPRITE_YCENTER;
|
|
|
|
if (actj)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2021-12-30 15:51:56 +00:00
|
|
|
if (actj->sector()->lotag == 2)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-09-27 11:59:57 +00:00
|
|
|
act->spr.pos.Z = getceilzofslopeptr(act->sector(), act->spr.pos) + 16;
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat |= CSTAT_SPRITE_YFLIP;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-12-30 15:51:56 +00:00
|
|
|
else if (actj->sector()->lotag == 1)
|
2022-09-27 11:59:57 +00:00
|
|
|
act->spr.pos.Z = getflorzofslopeptr(act->sector(), act->spr.pos);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
if (sectp->floorpicnum == FLOORSLIME ||
|
|
|
|
sectp->ceilingpicnum == FLOORSLIME)
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.pal = 7;
|
2021-11-19 09:41:50 +00:00
|
|
|
[[fallthrough]];
|
|
|
|
case NEON1:
|
|
|
|
case NEON2:
|
|
|
|
case NEON3:
|
|
|
|
case NEON4:
|
|
|
|
case NEON5:
|
|
|
|
case NEON6:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum != WATERSPLASH2)
|
|
|
|
act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL;
|
2021-11-19 09:41:50 +00:00
|
|
|
[[fallthrough]];
|
|
|
|
case NUKEBUTTON:
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
case NATURALLIGHTNING:
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
|
|
|
|
act->spr.cstat |= CSTAT_SPRITE_INVISIBLE;
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
case TRANSPORTERSTAR:
|
|
|
|
case TRANSPORTERBEAM:
|
2021-12-21 20:57:32 +00:00
|
|
|
spawntransporter(actj, act, act->spr.picnum == TRANSPORTERBEAM);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case FRAMEEFFECT1:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-07 21:41:15 +00:00
|
|
|
act->spr.scale = actj->spr.scale;
|
2021-12-23 15:24:11 +00:00
|
|
|
act->temp_data[1] = actj->spr.picnum;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2022-10-07 21:52:29 +00:00
|
|
|
else act->spr.scale = DVector2(0, 0);
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
case BLOOD:
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.25, 0.25);
|
2022-08-20 15:59:15 +00:00
|
|
|
act->spr.pos.Z -= 26;
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj && actj->spr.pal == 6)
|
|
|
|
act->spr.pal = 6;
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
case LAVAPOOL:
|
|
|
|
if (!isWorldTour()) // Twentieth Anniversary World Tour
|
|
|
|
return act;
|
|
|
|
[[fallthrough]];
|
|
|
|
|
|
|
|
case BLOODPOOL:
|
|
|
|
case PUKE:
|
|
|
|
if (spawnbloodpoolpart1(act)) break;
|
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj && act->spr.picnum != PUKE)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj->spr.pal == 1)
|
|
|
|
act->spr.pal = 1;
|
2022-11-14 15:31:45 +00:00
|
|
|
else if (actj->spr.pal != 6 && actj->spr.picnum != NUKEBARREL)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj->spr.picnum == FECES)
|
|
|
|
act->spr.pal = 7; // Brown
|
|
|
|
else act->spr.pal = 2; // Red
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-12-21 20:57:32 +00:00
|
|
|
else act->spr.pal = 0; // green
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat |= CSTAT_SPRITE_ALIGNMENT_FLOOR;
|
|
|
|
if (act->spr.picnum == LAVAPOOL) // Twentieth Anniversary World Tour
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-09-27 11:59:57 +00:00
|
|
|
act->spr.pos.Z = getflorzofslopeptr(act->sector(), act->spr.pos) - 0.78125;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
|
|
|
[[fallthrough]];
|
|
|
|
|
|
|
|
case FECES:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj)
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(REPEAT_SCALE, REPEAT_SCALE);
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SPACEMARINE:
|
2022-11-17 17:38:25 +00:00
|
|
|
act->spr.extra = 20;
|
|
|
|
act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL;
|
2022-10-16 15:19:55 +00:00
|
|
|
ChangeActorStat(act, STAT_ZOMBIEACTOR);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case HYDRENT:
|
|
|
|
case SATELITE:
|
|
|
|
case FUELPOD:
|
|
|
|
case SOLARPANNEL:
|
|
|
|
case ANTENNA:
|
|
|
|
case MONK:
|
|
|
|
case INDY:
|
|
|
|
case LUKE:
|
|
|
|
case JURYGUY:
|
|
|
|
case FANSPRITE:
|
|
|
|
case FETUS:
|
|
|
|
case FETUSBROKE:
|
|
|
|
case PIPE1:
|
|
|
|
case PIPE2:
|
|
|
|
case PIPE3:
|
|
|
|
case PIPE4:
|
|
|
|
case PIPE5:
|
|
|
|
case PIPE6:
|
2022-10-04 17:08:29 +00:00
|
|
|
act->clipdist = 8;
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL;
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, 0);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
case FEMMAG1:
|
|
|
|
case FEMMAG2:
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL;
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, 0);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
case DUKETAG:
|
|
|
|
case SIGN1:
|
|
|
|
case SIGN2:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (ud.multimode < 2 && act->spr.pal)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0, 0);
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-12-21 20:57:32 +00:00
|
|
|
else act->spr.pal = 0;
|
2021-11-19 09:41:50 +00:00
|
|
|
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:
|
|
|
|
{
|
2021-12-21 20:57:32 +00:00
|
|
|
auto j = act->spr.cstat & (CSTAT_SPRITE_ALIGNMENT_MASK | CSTAT_SPRITE_XFLIP | CSTAT_SPRITE_YFLIP);
|
|
|
|
act->spr.cstat = j | CSTAT_SPRITE_BLOCK;
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, 0);
|
2021-11-19 09:41:50 +00:00
|
|
|
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:
|
2022-09-01 16:15:52 +00:00
|
|
|
act->spr.yint = act->spr.hitag;
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.hitag = -1;
|
|
|
|
if (act->spr.picnum == PODFEM1) act->spr.extra <<= 1;
|
2021-11-19 09:41:50 +00:00
|
|
|
[[fallthrough]];
|
|
|
|
|
|
|
|
case BLOODYPOLE:
|
2022-11-27 22:36:39 +00:00
|
|
|
act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL;
|
|
|
|
act->clipdist = 8;
|
2022-10-16 15:19:55 +00:00
|
|
|
ChangeActorStat(act, STAT_ZOMBIEACTOR);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
case DUKELYINGDEAD:
|
2022-11-26 13:48:51 +00:00
|
|
|
if (actj && actj->isPlayer())
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-07 21:41:15 +00:00
|
|
|
act->spr.scale = actj->spr.scale;
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.shade = actj->spr.shade;
|
2022-09-01 14:42:23 +00:00
|
|
|
act->spr.pal = ps[actj->PlayerIndex()].palookup;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
|
|
|
[[fallthrough]];
|
|
|
|
case DUKECAR:
|
|
|
|
case HELECOPT:
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat = 0;
|
|
|
|
act->spr.extra = 1;
|
2022-09-11 17:28:45 +00:00
|
|
|
act->vel.X = 292 / 16.;
|
|
|
|
act->vel.Z = 360 / 256.;
|
2021-11-19 09:41:50 +00:00
|
|
|
[[fallthrough]];
|
|
|
|
case BLIMP:
|
2022-11-27 17:06:32 +00:00
|
|
|
act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL;
|
|
|
|
act->clipdist = 32;
|
2021-11-19 09:41:50 +00:00
|
|
|
[[fallthrough]];
|
|
|
|
case MIKE:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum == MIKE)
|
2022-09-01 16:15:52 +00:00
|
|
|
act->spr.yint = act->spr.hitag;
|
2021-11-19 09:41:50 +00:00
|
|
|
[[fallthrough]];
|
|
|
|
case WEATHERWARN:
|
2022-10-16 15:19:55 +00:00
|
|
|
ChangeActorStat(act, STAT_ACTOR);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SPOTLITE:
|
|
|
|
break;
|
|
|
|
case BULLETHOLE:
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.046875, 0.046875);
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat = CSTAT_SPRITE_ALIGNMENT_WALL | randomFlip();
|
2021-11-19 09:41:50 +00:00
|
|
|
insertspriteq(act);
|
|
|
|
[[fallthrough]];
|
|
|
|
case MONEY:
|
|
|
|
case MAIL:
|
|
|
|
case PAPER:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum == MONEY || act->spr.picnum == MAIL || act->spr.picnum == PAPER)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
|
|
|
act->temp_data[0] = krand() & 2047;
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat = randomFlip();
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.125, 0.125);
|
2022-11-25 12:13:50 +00:00
|
|
|
act->spr.Angles.Yaw = randomAngle();
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SHELL: //From the player
|
|
|
|
case SHOTGUNSHELL:
|
2021-12-21 20:57:32 +00:00
|
|
|
initshell(actj, act, act->spr.picnum == SHELL);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case ONFIRE:
|
|
|
|
// Twentieth Anniversary World Tour
|
|
|
|
if (!isWorldTour())
|
|
|
|
break;
|
|
|
|
[[fallthrough]];
|
|
|
|
case EXPLOSION2:
|
|
|
|
case EXPLOSION2BOT:
|
|
|
|
case BURNING:
|
|
|
|
case BURNING2:
|
|
|
|
case SMALLSMOKE:
|
|
|
|
case SHRINKEREXPLOSION:
|
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-11-25 12:13:50 +00:00
|
|
|
act->spr.Angles.Yaw = actj->spr.Angles.Yaw;
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.shade = -64;
|
|
|
|
act->spr.cstat = CSTAT_SPRITE_YCENTER | randomXFlip();
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum == EXPLOSION2 || act->spr.picnum == EXPLOSION2BOT)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.75, 0.75);
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.shade = -127;
|
|
|
|
act->spr.cstat |= CSTAT_SPRITE_YCENTER;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-12-21 20:57:32 +00:00
|
|
|
else if (act->spr.picnum == SHRINKEREXPLOSION)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.5, 0.5);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-12-21 20:57:32 +00:00
|
|
|
else if (act->spr.picnum == SMALLSMOKE || act->spr.picnum == ONFIRE)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
|
|
|
// 64 "money"
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.375, 0.375);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-12-21 20:57:32 +00:00
|
|
|
else if (act->spr.picnum == BURNING || act->spr.picnum == BURNING2)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.0625, 0.0625);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-09-27 11:59:57 +00:00
|
|
|
double x = getflorzofslopeptr(act->sector(), act->spr.pos);
|
2022-09-13 20:49:32 +00:00
|
|
|
if (act->spr.pos.Z > x - 12)
|
|
|
|
act->spr.pos.Z = x - 12;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum == ONFIRE)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-09-15 15:48:51 +00:00
|
|
|
act->spr.pos.X += krandf(32) - 16;
|
|
|
|
act->spr.pos.Y += krandf(32) - 16;
|
|
|
|
act->spr.pos.Z -= krandf(40);
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat |= CSTAT_SPRITE_YCENTER;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
case PLAYERONWATER:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-07 21:41:15 +00:00
|
|
|
act->spr.scale = actj->spr.scale;
|
2022-09-03 08:04:16 +00:00
|
|
|
act->vel.Z = 0.5;
|
2021-12-30 15:51:56 +00:00
|
|
|
if (act->sector()->lotag != 2)
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat |= CSTAT_SPRITE_INVISIBLE;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_DUMMYPLAYER);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
case APLAYER:
|
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0, 0);
|
2021-11-19 09:41:50 +00:00
|
|
|
int j = ud.coop;
|
|
|
|
if (j == 2) j = 0;
|
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (ud.multimode < 2 || (ud.multimode > 1 && j != act->spr.lotag))
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-19 09:41:50 +00:00
|
|
|
else
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_PLAYER);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WATERBUBBLE:
|
2022-11-26 13:48:51 +00:00
|
|
|
if (actj && actj->isPlayer())
|
2022-02-07 07:47:18 +00:00
|
|
|
act->spr.pos.Z -= 16;
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum == WATERBUBBLE)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj)
|
2022-11-25 12:13:50 +00:00
|
|
|
act->spr.Angles.Yaw = actj->spr.Angles.Yaw;
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.0625, 0.0625);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2022-10-07 21:52:29 +00:00
|
|
|
else act->spr.scale = DVector2(0.5, 0.5);
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
case WATERDRIPSPLASH:
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.375, 0.375);
|
2022-10-05 22:01:01 +00:00
|
|
|
ChangeActorStat(act, STAT_STANDABLE);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
case PLUG:
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.lotag = 9999;
|
2022-10-05 22:01:01 +00:00
|
|
|
ChangeActorStat(act, STAT_STANDABLE);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
case WATERBUBBLEMAKER:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.hitag && act->spr.picnum == WATERBUBBLEMAKER)
|
2021-11-19 09:41:50 +00:00
|
|
|
{ // JBF 20030913: Pisses off move(), eg. in bobsp2
|
2022-09-11 21:16:06 +00:00
|
|
|
Printf(TEXTCOLOR_YELLOW "WARNING: WATERBUBBLEMAKER %d @ %d,%d with hitag!=0. Applying fixup.\n", act->GetIndex(), int(act->spr.pos.X), int(act->spr.pos.Y));
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.hitag = 0;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat |= CSTAT_SPRITE_INVISIBLE;
|
2022-09-11 21:16:06 +00:00
|
|
|
ChangeActorStat(act, STAT_STANDABLE);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
case TARGET:
|
|
|
|
case DUCK:
|
|
|
|
case LETTER:
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.extra = 1;
|
|
|
|
act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL;
|
2022-10-07 16:43:24 +00:00
|
|
|
ChangeActorStat(act, STAT_ACTOR);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
case OCTABRAINSTAYPUT:
|
|
|
|
case LIZTROOPSTAYPUT:
|
|
|
|
case PIGCOPSTAYPUT:
|
|
|
|
case LIZMANSTAYPUT:
|
|
|
|
case BOSS1STAYPUT:
|
|
|
|
case PIGCOPDIVE:
|
|
|
|
case COMMANDERSTAYPUT:
|
|
|
|
case BOSS4STAYPUT:
|
2021-12-30 15:51:56 +00:00
|
|
|
act->actorstayput = act->sector();
|
2021-11-19 09:41:50 +00:00
|
|
|
[[fallthrough]];
|
|
|
|
case BOSS1:
|
|
|
|
case BOSS2:
|
|
|
|
case BOSS3:
|
|
|
|
case BOSS4:
|
|
|
|
case ROTATEGUN:
|
|
|
|
case GREENSLIME:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum == GREENSLIME)
|
|
|
|
act->spr.extra = 1;
|
2021-11-19 09:41:50 +00:00
|
|
|
[[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 SHARK:
|
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.pal == 0)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2021-12-21 20:57:32 +00:00
|
|
|
switch (act->spr.picnum)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2021-11-09 23:05:42 +00:00
|
|
|
case LIZTROOPONTOILET:
|
|
|
|
case LIZTROOPSHOOT:
|
|
|
|
case LIZTROOPJETPACK:
|
|
|
|
case LIZTROOPDUCKING:
|
|
|
|
case LIZTROOPRUNNING:
|
2021-11-19 09:41:50 +00:00
|
|
|
case LIZTROOPSTAYPUT:
|
|
|
|
case LIZTROOPJUSTSIT:
|
2021-11-09 23:05:42 +00:00
|
|
|
case LIZTROOP:
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.pal = 22;
|
2021-11-09 23:05:42 +00:00
|
|
|
break;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
|
|
|
}
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (bossguy(act))
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-11-20 10:58:19 +00:00
|
|
|
if (actj && isrespawncontroller(actj))
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.pal = actj->spr.pal;
|
|
|
|
if (act->spr.pal && (!isWorldTour() || !(currentLevel->flags & LEVEL_WT_BOSSSPAWN) || act->spr.pal != 22))
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-04 17:08:29 +00:00
|
|
|
act->clipdist = 20;
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.625, 0.625);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(1.25, 1.25);
|
2022-10-04 17:13:26 +00:00
|
|
|
act->clipdist = 41;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum != SHARK)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.625, 0.625);
|
2022-10-04 17:08:29 +00:00
|
|
|
act->clipdist = 20;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.9375, 0.9375);
|
2022-10-04 17:08:29 +00:00
|
|
|
act->clipdist = 10;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
|
|
|
}
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj) act->spr.lotag = 0;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if ((act->spr.lotag > ud.player_skill) || ud.monsters_off == 1)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0, 0);
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
makeitfall(act);
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2022-11-27 19:25:41 +00:00
|
|
|
act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL;
|
|
|
|
if (act->spr.picnum != SHARK)
|
|
|
|
ps[myconnectindex].max_actors_killed++;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum == ORGANTIC) act->spr.cstat |= CSTAT_SPRITE_YCENTER;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
|
|
|
act->timetosleep = 0;
|
|
|
|
check_fta_sounds_d(act);
|
2022-10-16 15:19:55 +00:00
|
|
|
ChangeActorStat(act, STAT_ACTOR);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2022-10-16 15:19:55 +00:00
|
|
|
else ChangeActorStat(act, STAT_ZOMBIEACTOR);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum == ROTATEGUN)
|
2022-09-03 08:02:25 +00:00
|
|
|
act->vel.Z = 0;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
case HEAVYHBOMB:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj) act->SetOwner(actj);
|
2021-11-19 09:41:50 +00:00
|
|
|
else act->SetOwner(act);
|
|
|
|
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.140625, 0.140625);
|
2022-09-01 16:15:52 +00:00
|
|
|
act->spr.yint = 4;
|
2022-11-28 17:57:50 +00:00
|
|
|
if (initreactor(actj, act, false)) return act;
|
2021-11-19 09:41:50 +00:00
|
|
|
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:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.lotag = 0;
|
2022-08-20 15:59:15 +00:00
|
|
|
act->spr.pos.Z -= 32;
|
2022-09-11 17:28:45 +00:00
|
|
|
act->vel.Z = -4;
|
2021-11-19 09:41:50 +00:00
|
|
|
ssp(act, CLIPMASK0);
|
2021-12-21 20:57:32 +00:00
|
|
|
if (krand() & 4) act->spr.cstat |= CSTAT_SPRITE_XFLIP;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
act->SetOwner(act);
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat = 0;
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if ((ud.multimode < 2 && act->spr.pal != 0) || (act->spr.lotag > ud.player_skill))
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0, 0);
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
}
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.pal = 0;
|
2021-11-19 09:41:50 +00:00
|
|
|
[[fallthrough]];
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
case ACCESSCARD:
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum == ATOMICHEALTH)
|
|
|
|
act->spr.cstat |= CSTAT_SPRITE_YCENTER;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (ud.multimode > 1 && ud.coop != 1 && act->spr.picnum == ACCESSCARD)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0, 0);
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum == AMMO)
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.25, 0.25);
|
|
|
|
else act->spr.scale = DVector2(0.5, 0.5);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
2020-05-15 20:59:13 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.shade = -17;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj) ChangeActorStat(act, STAT_ACTOR);
|
2021-11-19 09:41:50 +00:00
|
|
|
else
|
|
|
|
{
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_ZOMBIEACTOR);
|
2021-11-19 09:41:50 +00:00
|
|
|
makeitfall(act);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case FLOORFLAME:
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.shade = -127;
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_STANDABLE);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case BOUNCEMINE:
|
|
|
|
act->SetOwner(act);
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL; //Make it hitable
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.375, 0.375);
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.shade = -127;
|
|
|
|
act->spr.extra = gs.impact_damage << 2;
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_ZOMBIEACTOR);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case CAMERAPOLE:
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.extra = 1;
|
2021-11-19 09:41:50 +00:00
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (gs.camerashitable) act->spr.cstat = CSTAT_SPRITE_BLOCK_ALL;
|
|
|
|
else act->spr.cstat = 0;
|
2021-11-19 09:41:50 +00:00
|
|
|
[[fallthrough]];
|
|
|
|
|
|
|
|
case GENERICPOLE:
|
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (ud.multimode < 2 && act->spr.pal != 0)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0, 0);
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
}
|
2021-12-21 20:57:32 +00:00
|
|
|
else act->spr.pal = 0;
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
case STEAM:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-11-25 12:13:50 +00:00
|
|
|
act->spr.Angles.Yaw = actj->spr.Angles.Yaw;
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat = CSTAT_SPRITE_ALIGNMENT_WALL | CSTAT_SPRITE_YCENTER | CSTAT_SPRITE_TRANSLUCENT;
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(REPEAT_SCALE, REPEAT_SCALE);
|
2022-09-13 17:56:37 +00:00
|
|
|
act->vel.X = -0.5;
|
2021-11-19 09:41:50 +00:00
|
|
|
ssp(act, CLIPMASK0);
|
|
|
|
}
|
|
|
|
[[fallthrough]];
|
|
|
|
case CEILINGSTEAM:
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_STANDABLE);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
2021-11-09 23:05:42 +00:00
|
|
|
|
2021-11-19 09:41:50 +00:00
|
|
|
case SECTOREFFECTOR:
|
2021-12-04 12:02:38 +00:00
|
|
|
spawneffector(act, actors);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case TOILET:
|
|
|
|
case STALL:
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.lotag = 1;
|
|
|
|
act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL;
|
2022-10-04 17:08:29 +00:00
|
|
|
act->clipdist = 2;
|
2021-11-19 09:41:50 +00:00
|
|
|
act->SetOwner(act);
|
|
|
|
break;
|
|
|
|
case RUBBERCAN:
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.extra = 0;
|
2021-11-19 09:41:50 +00:00
|
|
|
[[fallthrough]];
|
|
|
|
case EXPLODINGBARREL:
|
|
|
|
case HORSEONSIDE:
|
|
|
|
case FIREBARREL:
|
|
|
|
case NUKEBARREL:
|
|
|
|
case FIREVASE:
|
|
|
|
case NUKEBARRELDENTED:
|
|
|
|
case NUKEBARRELLEAKED:
|
|
|
|
case WOODENHORSE:
|
|
|
|
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj)
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0.5, 0.5);
|
2022-10-04 17:08:29 +00:00
|
|
|
act->clipdist = 18;
|
2021-11-19 09:41:50 +00:00
|
|
|
makeitfall(act);
|
2021-12-21 20:57:32 +00:00
|
|
|
if (actj) act->SetOwner(actj);
|
2021-11-19 09:41:50 +00:00
|
|
|
else act->SetOwner(act);
|
|
|
|
[[fallthrough]];
|
|
|
|
|
|
|
|
case EGG:
|
2021-12-21 20:57:32 +00:00
|
|
|
if (ud.monsters_off == 1 && act->spr.picnum == EGG)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-07 21:52:29 +00:00
|
|
|
act->spr.scale = DVector2(0, 0);
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_MISC);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-12-21 20:57:32 +00:00
|
|
|
if (act->spr.picnum == EGG)
|
2021-11-19 09:41:50 +00:00
|
|
|
{
|
2022-10-04 17:13:26 +00:00
|
|
|
act->clipdist = 6;
|
2021-11-19 09:41:50 +00:00
|
|
|
ps[connecthead].max_actors_killed++;
|
|
|
|
}
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.cstat = CSTAT_SPRITE_BLOCK_ALL | randomXFlip();
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_ZOMBIEACTOR);
|
2021-11-19 09:41:50 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case TOILETWATER:
|
2021-12-21 20:57:32 +00:00
|
|
|
act->spr.shade = -16;
|
2021-11-26 20:52:01 +00:00
|
|
|
ChangeActorStat(act, STAT_STANDABLE);
|
2021-11-19 09:41:50 +00:00
|
|
|
break;
|
2021-11-09 23:05:42 +00:00
|
|
|
}
|
2021-11-19 09:41:50 +00:00
|
|
|
return act;
|
2020-05-15 20:59:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
END_DUKE_NS
|