mirror of
https://github.com/ZDoom/Raze.git
synced 2024-12-02 09:02:18 +00:00
c19653262e
This cannot be in the actor because event scripts can be called without a valid actor. It is now part of the parse state, but execute allows returning it to the caller, which is needed in one place.
562 lines
15 KiB
Text
562 lines
15 KiB
Text
// sector effector lotags. Preferably these should be eliminated once SE's get converted to classes. Until then we still need these.
|
|
enum EEffectorTypes
|
|
{
|
|
SE_0_ROTATING_SECTOR = 0,
|
|
SE_1_PIVOT = 1,
|
|
SE_2_EARTHQUAKE = 2,
|
|
SE_3_RANDOM_LIGHTS_AFTER_SHOT_OUT = 3,
|
|
SE_4_RANDOM_LIGHTS = 4,
|
|
SE_5_BOSS = 5,
|
|
SE_6_SUBWAY = 6,
|
|
|
|
SE_7_TELEPORT = 7,
|
|
SE_8_UP_OPEN_DOOR_LIGHTS = 8,
|
|
SE_9_DOWN_OPEN_DOOR_LIGHTS = 9,
|
|
SE_10_DOOR_AUTO_CLOSE = 10,
|
|
SE_11_SWINGING_DOOR = 11,
|
|
SE_12_LIGHT_SWITCH = 12,
|
|
SE_13_EXPLOSIVE = 13,
|
|
SE_14_SUBWAY_CAR = 14,
|
|
SE_15_SLIDING_DOOR = 15,
|
|
SE_16_REACTOR = 16,
|
|
SE_17_WARP_ELEVATOR = 17,
|
|
SE_18_INCREMENTAL_SECTOR_RISE_FALL = 18,
|
|
SE_19_EXPLOSION_LOWERS_CEILING = 19,
|
|
SE_20_STRETCH_BRIDGE = 20,
|
|
SE_21_DROP_FLOOR = 21,
|
|
SE_22_TEETH_DOOR = 22,
|
|
SE_23_ONE_WAY_TELEPORT = 23,
|
|
SE_24_CONVEYOR = 24,
|
|
SE_25_PISTON = 25,
|
|
SE_26 = 26,
|
|
SE_27_DEMO_CAM = 27,
|
|
SE_28_LIGHTNING = 28,
|
|
SE_29_WAVES = 29,
|
|
SE_30_TWO_WAY_TRAIN = 30,
|
|
SE_31_FLOOR_RISE_FALL = 31,
|
|
SE_32_CEILING_RISE_FALL = 32,
|
|
SE_33_QUAKE_DEBRIS = 33,
|
|
SE_34 = 34,
|
|
SE_35 = 35,
|
|
SE_36_PROJ_SHOOTER = 36,
|
|
SE_47_LIGHT_SWITCH = 47,
|
|
SE_48_LIGHT_SWITCH = 48,
|
|
SE_49_POINT_LIGHT = 49,
|
|
SE_50_SPOT_LIGHT = 50,
|
|
SE_128_GLASS_BREAKING = 128,
|
|
SE_130 = 130,
|
|
SE_131 = 131,
|
|
SE_156_CONVEYOR_NOSCROLL = 156,
|
|
};
|
|
|
|
enum ESectorTriggers
|
|
{
|
|
ST_0_NO_EFFECT = 0,
|
|
ST_1_ABOVE_WATER = 1,
|
|
ST_2_UNDERWATER = 2,
|
|
ST_3 = 3,
|
|
// ^^^ maybe not complete substitution in code
|
|
ST_9_SLIDING_ST_DOOR = 9,
|
|
ST_15_WARP_ELEVATOR = 15,
|
|
ST_16_PLATFORM_DOWN = 16,
|
|
ST_17_PLATFORM_UP = 17,
|
|
ST_18_ELEVATOR_DOWN = 18,
|
|
ST_19_ELEVATOR_UP = 19,
|
|
ST_20_CEILING_DOOR = 20,
|
|
ST_21_FLOOR_DOOR = 21,
|
|
ST_22_SPLITTING_DOOR = 22,
|
|
ST_23_SWINGING_DOOR = 23,
|
|
ST_25_SLIDING_DOOR = 25,
|
|
ST_26_SPLITTING_ST_DOOR = 26,
|
|
ST_27_STRETCH_BRIDGE = 27,
|
|
ST_28_DROP_FLOOR = 28,
|
|
ST_29_TEETH_DOOR = 29,
|
|
ST_30_ROTATE_RISE_BRIDGE = 30,
|
|
ST_31_TWO_WAY_TRAIN = 31,
|
|
|
|
ST_41_JAILDOOR = 41,
|
|
ST_42_MINECART = 42,
|
|
|
|
ST_160_FLOOR_TELEPORT = 160,
|
|
ST_161_CEILING_TELEPORT = 161,
|
|
|
|
// left: ST 32767, 65534, 65535
|
|
};
|
|
|
|
enum dukeinv_t
|
|
{
|
|
GET_STEROIDS, // 0
|
|
GET_SHIELD,
|
|
GET_SCUBA,
|
|
GET_HOLODUKE,
|
|
GET_JETPACK,
|
|
GET_DUMMY1, // 5
|
|
GET_ACCESS,
|
|
GET_HEATS,
|
|
GET_DUMMY2,
|
|
GET_FIRSTAID,
|
|
GET_BOOTS, // 10
|
|
GET_MAX,
|
|
|
|
GET_MOONSHINE = 0,
|
|
GET_KELVAR = 1,
|
|
GET_BEER = 3,
|
|
GET_COWPIE = 4,
|
|
GET_KEYS = 6,
|
|
GET_WHISKEY = 9,
|
|
|
|
|
|
};
|
|
|
|
class DukeActor : CoreActor native
|
|
{
|
|
default
|
|
{
|
|
setgamedefaults;
|
|
falladjustz 24;
|
|
autoaimangle 8.4375;
|
|
projectilespread 5.625;
|
|
jumptoplayer_factor 2.0;
|
|
justjump1_factor 2.133;
|
|
justjump2_factor 2.667;
|
|
windang_factor 2.667;
|
|
floating_floordist 0;
|
|
floating_ceilingdist 66;
|
|
landmovefactor 1;
|
|
watermovefactor 1;
|
|
gravityfactor 1;
|
|
sparkoffset 5;
|
|
move "SHRUNKVELS", 32;
|
|
move "RESPAWN_ACTOR_FLAG";
|
|
action "ANULLACTION", 0;
|
|
}
|
|
enum EStatnums
|
|
{
|
|
STAT_DEFAULT = 0,
|
|
STAT_ACTOR = 1,
|
|
STAT_ZOMBIEACTOR = 2,
|
|
STAT_EFFECTOR = 3,
|
|
STAT_PROJECTILE = 4,
|
|
STAT_MISC = 5,
|
|
STAT_STANDABLE = 6,
|
|
STAT_LOCATOR = 7,
|
|
STAT_ACTIVATOR = 8,
|
|
STAT_TRANSPORT = 9,
|
|
STAT_PLAYER = 10,
|
|
STAT_FX = 11,
|
|
STAT_FALLER = 12,
|
|
STAT_DUMMYPLAYER = 13,
|
|
STAT_LIGHT = 14,
|
|
STAT_RAROR = 15,
|
|
|
|
STAT_DESTRUCT = 100,
|
|
STAT_BOWLING = 105,
|
|
STAT_CHICKENPLANT = 106,
|
|
STAT_LUMBERMILL = 107,
|
|
STAT_TELEPORT = 108,
|
|
STAT_BOBBING = 118,
|
|
STAT_RABBITSPAWN = 119,
|
|
|
|
STAT_REMOVED = MAXSTATUS-2,
|
|
|
|
};
|
|
|
|
enum amoveflags_t
|
|
{
|
|
face_player = 1,
|
|
faceplayer = 1,
|
|
geth = 2,
|
|
getv = 4,
|
|
random_angle = 8,
|
|
randomangle = 8,
|
|
face_player_slow = 16,
|
|
faceplayerslow = 16,
|
|
spin = 32,
|
|
face_player_smart = 64,
|
|
faceplayersmart = 64,
|
|
fleeenemy = 128,
|
|
jumptoplayer_only = 256,
|
|
justjump1 = 256,
|
|
jumptoplayer = 257,
|
|
seekplayer = 512,
|
|
furthestdir = 1024,
|
|
dodgebullet = 4096,
|
|
justjump2 = 8192,
|
|
windang = 16384,
|
|
antifaceplayerslow = 32768
|
|
};
|
|
|
|
enum pstateflags
|
|
{
|
|
pstanding = 1,
|
|
pwalking = 2,
|
|
prunning = 4,
|
|
pducking = 8,
|
|
pfalling = 16,
|
|
pjumping = 32,
|
|
phigher = 64,
|
|
pwalkingback = 128,
|
|
prunningback = 256,
|
|
pkicking = 512,
|
|
pshrunk = 1024,
|
|
pjetpack = 2048,
|
|
ponsteroids = 4096,
|
|
ponground = 8192,
|
|
palive = 16384,
|
|
pdead = 32768,
|
|
pfacing = 65536
|
|
}
|
|
|
|
const ONFIRETIME = 164;
|
|
const FIREPAINFREQ = 16;
|
|
const SHRUNKDONECOUNT = 304;
|
|
const SPAWNAMMOODDS = 96;
|
|
const SWEARFREQUENCY = 100;
|
|
const MAXSLEEPDISTF = 1024;
|
|
const SHRUNKCOUNT = 270;
|
|
const SLEEPTIME = 1536;
|
|
const THAWTIME = 138;
|
|
const FROZENQUICKKICKDIST = 980;
|
|
const FROZENDRIPTIME = 90;
|
|
const PLAYDEADTIME = 120;
|
|
const RESPAWNACTORTIME = 768;
|
|
const MAXXSTRETCH = 70;
|
|
const MAXYSTRETCH = 70;
|
|
const MINXSTRETCH = 9;
|
|
const MINYSTRETCH = 8;
|
|
const SQUISHABLEDISTANCE = 1024;
|
|
const RETRIEVEDISTANCE = 844;
|
|
const RESPAWNITEMTIME = 768;
|
|
|
|
const WEAKEST = 1;
|
|
const WEAK = 5;
|
|
const MEDIUMSTRENGTH = 10;
|
|
const TOUGH = 20;
|
|
const REALLYTOUGH = 30;
|
|
const MAXPLAYERHEALTH = 100;
|
|
const MEGASTRENGTH = 10000;
|
|
|
|
|
|
const STEROID_AMOUNT = 400;
|
|
const SHIELD_AMOUNT = 100;
|
|
const SCUBA_AMOUNT = 6400;
|
|
const HOLODUKE_AMOUNT = 2400;
|
|
const JETPACK_AMOUNT = 1600;
|
|
const HEAT_AMOUNT = 1200;
|
|
const FIRSTAID_AMOUNT = MAXPLAYERHEALTH;
|
|
const BOOT_AMOUNT = 200;
|
|
|
|
meta int gutsoffset;
|
|
meta int falladjustz;
|
|
meta int aimoffset;
|
|
meta int strength;
|
|
meta double autoaimangle;
|
|
meta double sparkoffset;
|
|
meta double projectilespread;
|
|
meta double shootzoffset;
|
|
meta double moveclipdist;
|
|
meta double jumptoplayer_factor;
|
|
meta double justjump1_factor;
|
|
meta double justjump2_factor;
|
|
meta double windang_factor;
|
|
meta double floating_floordist;
|
|
meta double floating_ceilingdist;
|
|
meta double landmovefactor;
|
|
meta double watermovefactor;
|
|
meta double gravityfactor;
|
|
meta double minhitscale;
|
|
|
|
property prefix: none;
|
|
property gutsoffset: gutsoffset;
|
|
property falladjustz: falladjustz;
|
|
property aimoffset: aimoffset;
|
|
property strength: strength;
|
|
property autoaimangle: autoaimangle;
|
|
property sparkoffset: sparkoffset;
|
|
property projectilespread: projectilespread;
|
|
property shootzoffset: shootzoffset;
|
|
property moveclipdist: moveclipdist;
|
|
property jumptoplayer_factor: jumptoplayer_factor;
|
|
property justjump1_factor: justjump1_factor;
|
|
property justjump2_factor: justjump2_factor;
|
|
property windang_factor: windang_factor;
|
|
property floating_floordist: floating_floordist;
|
|
property floating_ceilingdist: floating_ceilingdist;
|
|
property landmovefactor: landmovefactor;
|
|
property watermovefactor: watermovefactor;
|
|
property gravityfactor: gravityfactor;
|
|
property minhitscale: minhitscale;
|
|
|
|
|
|
native void SetSpritesetImage(int index);
|
|
native int GetSpritesetSize();
|
|
|
|
native class<DukeActor> attackertype;
|
|
native DukeActor ownerActor, hitOwnerActor;
|
|
native uint8 cgg;
|
|
native uint8 spriteextra; // moved here for easier maintenance. This was originally a hacked in field in the sprite structure called 'filler'.
|
|
native int16 hitextra;
|
|
native uint16 movflag;
|
|
native int16 tempval; /*, dispicnum;*/
|
|
native int16 timetosleep;
|
|
native bool mapSpawned;
|
|
native double floorz, ceilingz, hitang;
|
|
native int saved_ammo;
|
|
native int palvals;
|
|
native int counter;
|
|
native int temp_data[5];
|
|
native private int flags1, flags2, flags3;
|
|
native walltype temp_walls[2];
|
|
native sectortype temp_sect, actorstayput;
|
|
|
|
native DukeActor temp_actor, seek_actor;
|
|
native Vector3 temp_pos, temp_pos2;
|
|
native double temp_angle;
|
|
|
|
native ActorAction curAction;
|
|
native ActorMove curMove;
|
|
native Name curAI;
|
|
native int16 actioncounter;
|
|
|
|
// flags are implemented natively to avoid the prefixes.
|
|
|
|
native void getglobalz();
|
|
native DukePlayer, double findplayer();
|
|
native DukePlayer GetPlayer();
|
|
native int ifhitbyweapon();
|
|
native int domove(int clipmask);
|
|
native int PlayActorSound(Sound snd, int chan = CHAN_AUTO, int flags = 0);
|
|
native int CheckSoundPlaying(Sound snd, int chan = CHAN_AUTO);
|
|
native bool CheckAnyActorSoundPlaying();
|
|
native void StopSound(Sound snd, int flags = 0);
|
|
native DukeActor spawn(class<DukeActor> type);
|
|
native DukeActor spawnsprite(int type); // for cases where the map has a tilenum stored. Avoid when possible.
|
|
native void lotsofglass(int count, walltype wal = null);
|
|
native void lotsofcolourglass(int count, walltype wal = null);
|
|
native void makeitfall();
|
|
native void detonate(class<DukeActor> type);
|
|
native void checkhitdefault(DukeActor proj);
|
|
native void operatesectors(sectortype sec);
|
|
native int SpriteWidth();
|
|
native int SpriteHeight();
|
|
native DukeActor, bool aim(readonly<DukeActor> weapon, double aimangle = -1);
|
|
|
|
// CON simulation
|
|
native void SetAction(Name act);
|
|
native void SetAI(Name ai);
|
|
native void SetMove(Name mov, int flags = 0);
|
|
native bool checkp(DukePlayer p, int flags);
|
|
native bool cansee(DukePlayer p);
|
|
native void actoroperate();
|
|
native bool ifsquished(DukePlayer p);
|
|
native void ChangeType(class<DukeActor> newtype);
|
|
native void fall(DukePlayer p);
|
|
native void actorsizeto(double x, double y);
|
|
native bool dodge();
|
|
native bool ifcanshoottarget(DukePlayer p, double pdist);
|
|
native void spriteglass(int n);
|
|
native void spawndebris(int dnum, int count);
|
|
native void respawnhitag();
|
|
|
|
|
|
virtual native void Tick();
|
|
|
|
|
|
virtual void StaticSetup() {}
|
|
virtual void onHit(DukeActor hitter) { checkhitdefault(hitter); }
|
|
virtual void onHurt(DukePlayer p) {}
|
|
virtual bool onUse(DukePlayer user) { return false; }
|
|
virtual void onTouch(DukePlayer toucher) {}
|
|
virtual void onMotoSmash(DukePlayer toucher) {}
|
|
virtual void onRespawn(int tag) { }
|
|
virtual bool animate(tspritetype tspr) { return false; }
|
|
virtual void RunState(DukePlayer p, double pdist) {} // this is the CON function.
|
|
virtual void PlayFTASound(int mode) {}
|
|
virtual void StandingOn(DukePlayer p) {}
|
|
virtual bool TriggerSwitch(DukePlayer activator) { return false; }
|
|
virtual bool shootthis(DukeActor actor, DukePlayer p, Vector3 pos, double ang) const // this gets called on the defaults.
|
|
{
|
|
return false;
|
|
}
|
|
virtual class<DukeActor> GetRadiusDamageType(int targhealth)
|
|
{
|
|
return 'DukeRadiusExplosion';
|
|
}
|
|
|
|
native void RandomScrap();
|
|
native void hitradius(int r, int hp1, int hp2, int hp3, int hp4);
|
|
native double, DukeActor hitasprite();
|
|
native int badguy();
|
|
native int scripted();
|
|
native int isplayer();
|
|
native void lotsofstuff(class<DukeActor> type, int count);
|
|
native int movesprite(Vector3 move, int clipmask);
|
|
native int movesprite_ex(Vector3 move, int clipmask, CollisionData coll);
|
|
native void shoot(class<DukeActor> spawnclass);
|
|
native void setClipDistFromTile();
|
|
native void insertspriteq();
|
|
native void operateforcefields(int tag);
|
|
native void restoreloc();
|
|
native void fakebubbaspawn(DukePlayer p);
|
|
native void destroyit();
|
|
native void mamaspawn();
|
|
native void garybanjo();
|
|
native Sound GetAmbientSound();
|
|
native double GetAmbientDist();
|
|
native void addkill();
|
|
native void subkill();
|
|
native void killit();
|
|
|
|
|
|
|
|
|
|
virtual void Initialize(DukeActor spawner)
|
|
{
|
|
if (!self.bSIMPLEINIT && !self.badguy() && self.scripted())
|
|
{
|
|
if (!self.mapSpawned) self.lotag = 0;
|
|
|
|
if (self.scale.X == 0 || self.scale.Y == 0)
|
|
{
|
|
self.scale = (REPEAT_SCALE, REPEAT_SCALE);
|
|
}
|
|
|
|
self.clipdist = 10;
|
|
if (spawner != null) self.angle = spawner.angle;
|
|
self.ownerActor = self;
|
|
self.ChangeStat(STAT_ACTOR);
|
|
}
|
|
}
|
|
|
|
|
|
void commonItemSetup(DukeActor spawner, Vector2 scale = (0.5, 0.5), int usefloorshade = -1, bool noinitialmove = false)
|
|
{
|
|
if (spawner && spawner != self)
|
|
{
|
|
self.lotag = 0;
|
|
if (!noinitialmove)
|
|
{
|
|
self.pos.Z -= 32;
|
|
self.vel.Z = -4;
|
|
}
|
|
else
|
|
self.vel.Z = 0;
|
|
self.DoMove(CLIPMASK0);
|
|
self.cstat |= randomxflip();
|
|
}
|
|
else
|
|
{
|
|
self.cstat = 0;
|
|
}
|
|
|
|
if (ud.multimode < 2 && self.pal != 0)
|
|
{
|
|
self.scale = (0, 0);
|
|
self.ChangeStat(STAT_MISC);
|
|
return;
|
|
}
|
|
|
|
self.pal = 0;
|
|
self.shade = -17;
|
|
self.scale = scale;
|
|
|
|
if (spawner && spawner != self) self.ChangeStat(STAT_ACTOR);
|
|
else
|
|
{
|
|
self.ChangeStat(STAT_ZOMBIEACTOR);
|
|
self.makeitfall();
|
|
}
|
|
|
|
// RR defaults to using the floor shade here, let's make this configurable.
|
|
if (usefloorshade == 1 || (usefloorshade == -1 && isRR()))
|
|
{
|
|
self.shade = self.sector.floorshade;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
int checkLocationForFloorSprite(double radius)
|
|
{
|
|
bool away = self.isAwayFromWall(radius);
|
|
|
|
if (!away)
|
|
{
|
|
self.scale = (0, 0);
|
|
self.ChangeStat(STAT_MISC);
|
|
return false;
|
|
}
|
|
|
|
if (self.sector.lotag == ST_1_ABOVE_WATER)
|
|
{
|
|
self.scale = (0, 0);
|
|
self.ChangeStat(STAT_MISC);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
extend struct _
|
|
{
|
|
native @DukeGameInfo gs;
|
|
native @DukeUserDefs ud;
|
|
native DukeLevel dlevel;
|
|
native DukeActor camsprite;
|
|
}
|
|
|
|
// The level struct is a wrapper to group all level related global variables and static functions into one object.
|
|
// On the script side we do not really want scattered global data that is publicly accessible.
|
|
struct DukeLevel
|
|
{
|
|
enum animtype_t
|
|
{
|
|
anim_floorz,
|
|
anim_ceilingz,
|
|
anim_vertexx,
|
|
anim_vertexy,
|
|
};
|
|
|
|
native DukeActor SpawnActor(sectortype sect, Vector3 pos, class<DukeActor> type, int shade, Vector2 scale, double angle, double vel, double zvel, DukeActor owner, int stat = -1);
|
|
native static int check_activator_motion(int lotag);
|
|
native static void operatemasterswitches(int lotag);
|
|
native static void operateactivators(int lotag, DukePlayer p);
|
|
native static int floorsurface(sectortype s);
|
|
native static int ceilingsurface(sectortype s);
|
|
native static void AddCycler(sectortype sector, int lotag, int shade, int shade2, int hitag, int state);
|
|
native static void addtorch(sectortype sector, int shade, int lotag);
|
|
native static void addlightning(sectortype sector, int shade);
|
|
native static int addambient(int hitag, int lotag);
|
|
native static void resetswitch(int tag); //
|
|
native static bool isMirror(walltype wal);
|
|
native static void checkhitwall(walltype wal, DukeActor hitter, Vector3 hitpos);
|
|
native static void checkhitceiling(sectortype wal, DukeActor hitter);
|
|
native static DukeActor LocateTheLocator(int n, sectortype sect);
|
|
native static int getanimationindex(int type, sectortype sec);
|
|
native static int setanimation(sectortype animsect, int type, sectortype sec, double target, double vel);
|
|
native static void tearitup(sectortype sect);
|
|
}
|
|
|
|
struct DukeStatIterator
|
|
{
|
|
private DukeActor nextp;
|
|
native DukeActor Next();
|
|
native DukeActor First(int stat);
|
|
}
|
|
|
|
struct DukeSectIterator
|
|
{
|
|
private DukeActor nextp;
|
|
native DukeActor Next();
|
|
native DukeActor First(sectortype sect);
|
|
}
|
|
|
|
struct DukeSpriteIterator
|
|
{
|
|
private DukeActor nextp;
|
|
private int stat;
|
|
native DukeActor Next();
|
|
native DukeActor First();
|
|
}
|
|
|
|
|