- added script exports for Duke's bosses.

This allows removing a few hack checks.
This commit is contained in:
Christoph Oelckers 2022-12-13 19:39:27 +01:00
parent 26c8e948f7
commit 30d066cee9
13 changed files with 198 additions and 57 deletions

View file

@ -1585,6 +1585,7 @@ DEFINE_FIELD_X(MapRecord, MapRecord, name)
DEFINE_FIELD_X(MapRecord, MapRecord, music)
DEFINE_FIELD_X(MapRecord, MapRecord, cdSongId)
DEFINE_FIELD_X(MapRecord, MapRecord, flags)
DEFINE_FIELD_X(MapRecord, MapRecord, gameflags)
DEFINE_FIELD_X(MapRecord, MapRecord, levelNumber)
DEFINE_FIELD_X(MapRecord, MapRecord, cluster)
DEFINE_FIELD_X(MapRecord, MapRecord, NextMap)

View file

@ -86,25 +86,6 @@ void check_fta_sounds_d(DDukeActor* actor)
case DTILE_OCTABRAINSTAYPUT:
S_PlayActorSound(OCTA_RECOG, actor);
break;
case DTILE_BOSS1:
S_PlaySound(BOS1_RECOG);
break;
case DTILE_BOSS2:
if (actor->spr.pal == 1)
S_PlaySound(BOS2_RECOG);
else S_PlaySound(WHIPYOURASS);
break;
case DTILE_BOSS3:
if (actor->spr.pal == 1)
S_PlaySound(BOS3_RECOG);
else S_PlaySound(RIPHEADNECK);
break;
case DTILE_BOSS4:
case DTILE_BOSS4STAYPUT:
if (actor->spr.pal == 1)
S_PlaySound(BOS4_RECOG);
S_PlaySound(BOSS4_FIRSTSEE);
break;
}
}

View file

@ -70,13 +70,7 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
{
switch (act->spr.picnum)
{
case DTILE_BOSS2STAYPUT:
case DTILE_BOSS3STAYPUT:
case DTILE_BOSS5STAYPUT:
act->actorstayput = act->sector();
[[fallthrough]];
case DTILE_FIREFLY:
case DTILE_BOSS5:
if (act->spr.picnum != DTILE_FIREFLY)
{
if (actj && isrespawncontroller(actj))
@ -271,15 +265,9 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
case DTILE_OCTABRAINSTAYPUT:
case DTILE_LIZTROOPSTAYPUT:
case DTILE_LIZMANSTAYPUT:
case DTILE_BOSS1STAYPUT:
case DTILE_COMMANDERSTAYPUT:
case DTILE_BOSS4STAYPUT:
act->actorstayput = act->sector();
[[fallthrough]];
case DTILE_BOSS1:
case DTILE_BOSS2:
case DTILE_BOSS3:
case DTILE_BOSS4:
case DTILE_ROTATEGUN:
case DTILE_DRONE:
case DTILE_LIZTROOPONTOILET:
@ -315,33 +303,15 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray<DDukeActor*>*
}
}
if (bossguy(act))
if (act->spr.picnum != DTILE_SHARK)
{
if (actj && isrespawncontroller(actj))
act->spr.pal = actj->spr.pal;
if (act->spr.pal && (!isWorldTour() || !(currentLevel->flags & LEVEL_WT_BOSSSPAWN) || act->spr.pal != 22))
{
act->clipdist = 20;
act->spr.scale = DVector2(0.625, 0.625);
}
else
{
act->spr.scale = DVector2(1.25, 1.25);
act->clipdist = 41;
}
act->spr.scale = DVector2(0.625, 0.625);
act->clipdist = 20;
}
else
{
if (act->spr.picnum != DTILE_SHARK)
{
act->spr.scale = DVector2(0.625, 0.625);
act->clipdist = 20;
}
else
{
act->spr.scale = DVector2(0.9375, 0.9375);
act->clipdist = 10;
}
act->spr.scale = DVector2(0.9375, 0.9375);
act->clipdist = 10;
}
if (actj) act->spr.lotag = 0;

View file

@ -9,4 +9,7 @@ spawnclasses
5296 = DukeFireflyFlyingEffect
5304 = DukeLavaPool
5207 = DukeLavaPoolBubble
5310 = DukeBoss5
5311 = DukeBoss5Stayput
}

View file

@ -256,4 +256,13 @@ spawnclasses
2001 = DukePigCopStayPut
2045 = DukePigCopDive
2630 = DukeBoss1
2631 = DukeBoss1Stayput
2710 = DukeBoss2
2711 = DukeBoss2Stayput
2760 = DukeBoss3
2761 = DukeBoss3Stayput
4740 = DukeBoss4
4741 = DukeBoss4Stayput
}

View file

@ -114,6 +114,11 @@ version "4.10"
#include "zscript/games/duke/actors/sixpak.zs"
#include "zscript/games/duke/actors/atomichealth.zs"
#include "zscript/games/duke/actors/pigcop.zs"
#include "zscript/games/duke/actors/boss1.zs"
#include "zscript/games/duke/actors/boss2.zs"
#include "zscript/games/duke/actors/boss3.zs"
#include "zscript/games/duke/actors/boss4.zs"
#include "zscript/games/duke/actors/boss5.zs"
#include "zscript/games/duke/actors/flamethrowerflame.zs"
#include "zscript/games/duke/actors/firefly.zs"

View file

@ -0,0 +1,44 @@
class DukeBoss1 : DukeActor
{
default
{
pic "BOSS1";
}
override void Initialize()
{
let owner = self.ownerActor;
if (owner && owner is 'DukeRespawnController')
self.pal = owner.pal;
if (self.pal != 0 && (!Raze.isWorldTour() || !(currentLevel.gameflags & MapRecord.LEVEL_WT_BOSSSPAWN) || self.pal != 22))
{
self.clipdist = 20;
self.scale = (0.625, 0.625);
}
else
{
self.scale = (1.25, 1.25);
self.clipdist = 41;
}
}
override void PlayFTASound()
{
Duke.PlaySound("BOS1_RECOG");
}
}
class DukeBoss1Stayput : DukeBoss1
{
default
{
pic "BOSS1STAYPUT";
}
override void PlayFTASound()
{
}
}

View file

@ -0,0 +1,24 @@
class DukeBoss2 : DukeBoss1
{
default
{
pic "BOSS2";
}
override void PlayFTASound()
{
if (self.pal == 1)
Duke.PlaySound("BOS2_RECOG");
else Duke.PlaySound("WHIPYOURASS");
}
}
class DukeBoss2Stayput : DukeBoss2
{
default
{
pic "BOSS2STAYPUT";
}
}

View file

@ -0,0 +1,24 @@
class DukeBoss3 : DukeBoss1
{
default
{
pic "BOSS3";
}
override void PlayFTASound()
{
if (self.pal == 1)
Duke.PlaySound("BOS3_RECOG");
else Duke.PlaySound("RIPHEADNECK");
}
}
class DukeBoss3Stayput : DukeBoss3
{
default
{
pic "BOSS3STAYPUT";
}
}

View file

@ -0,0 +1,26 @@
class DukeBoss4 : DukeBoss1
{
default
{
pic "BOSS4";
}
override void PlayFTASound()
{
if (self.pal == 1)
Duke.PlaySound("BOS4_RECOG");
Duke.PlaySound("BOSS4_FIRSTSEE");
}
}
class DukeBoss4Stayput : DukeBoss4
{
default
{
pic "BOSS4STAYPUT";
}
}

View file

@ -0,0 +1,19 @@
class DukeBoss5 : DukeBoss1
{
default
{
pic "BOSS5";
}
}
class DukeBoss5Stayput : DukeBoss5
{
default
{
pic "BOSS5STAYPUT";
}
}

View file

@ -124,12 +124,12 @@ class DukeFlamethrowerFlame : DukeActor
[j, x] = actor.findplayer();
sang = (j.Actor.opos.XY - spos.XY).Angle();
if (actor.checktype("BOSS5"))
if (actor is 'DukeBoss5')
{
vel = 33;
spos.Z += 24;
}
else if (actor.checktype("BOSS3"))
else if (actor is 'DukeBoss3')
spos.Z -= 32;
double dist = (j.actor.pos.XY - actor.pos.XY).Length();
@ -179,7 +179,7 @@ class DukeFlamethrowerFlame : DukeActor
if (p == null)
{
if (actor.checktype("BOSS5"))
if (actor is 'DukeBoss5')
{
spawned.pos += sang.ToVector() * (128. / 7);
spawned.scale = (0.15625, 0.15625);

View file

@ -85,6 +85,40 @@ struct MapRecord native
USERMAP = 2,
}
enum EMapFlags
{
LEVEL_NOINTERMISSION = 1,
LEVEL_SECRETEXITOVERRIDE = 2, // when given an explicit level number, override with secret exit in the map, mainly for compiling episodes out of single levels.
LEVEL_CLEARINVENTORY = 4,
LEVEL_CLEARWEAPONS = 8,
LEVEL_FORCENOEOG = 16, // RR E1L7 needs this to override its boss's death ending the game.
};
enum EMapGameFlags
{
LEVEL_RR_HULKSPAWN = 1,
LEVEL_RR_CLEARMOONSHINE = 2,
LEVEL_EX_COUNTDOWN = 4,
LEVEL_EX_TRAINING = 8,
LEVEL_EX_ALTSOUND = 16,
LEVEL_EX_MULTI = 32,
LEVEL_SW_SPAWNMINES = 64,
LEVEL_SW_BOSSMETER_SERPENT = 128,
LEVEL_SW_BOSSMETER_SUMO = 256,
LEVEL_SW_BOSSMETER_ZILLA = 512,
LEVEL_SW_DEATHEXIT_SERPENT = 1024,
LEVEL_SW_DEATHEXIT_SUMO = 2048,
LEVEL_SW_DEATHEXIT_ZILLA = 4096,
LEVEL_SW_DEATHEXIT_SERPENT_NEXT = 8192,
LEVEL_WT_BOSSSPAWN = 16384,
LEVEL_BOSSONLYCUTSCENE = 32768,
};
native readonly int parTime;
native readonly int designerTime;
native readonly String fileName;
@ -93,6 +127,7 @@ struct MapRecord native
native readonly String music;
native readonly int cdSongId;
native readonly int flags;
native readonly int gameflags;
native readonly int levelNumber;
native readonly int cluster;
native readonly String InterBackground;