diff --git a/source/core/actorinfo.cpp b/source/core/actorinfo.cpp index 39db6fd92..34d987f14 100644 --- a/source/core/actorinfo.cpp +++ b/source/core/actorinfo.cpp @@ -250,7 +250,11 @@ void FActorInfo::ResolveTextures(const char* clsname, DCoreActor* defaults) SpriteSet[i] = TileFiles.tileForName(SpriteSetNames[i]); if (SpriteSet[i] == -1) Printf("Unknown texture '%s' in sprite set for class %s\n", SpriteSetNames[i].GetChars(), clsname); } - if (SpriteSet.Size() > 0) defaults->spr.picnum = SpriteSet[0]; // Unless picnum is specified it will be set to the first image of the sprite set. + if (SpriteSet.Size() > 0) + { + if (defaults->spritesetindex < 0 || defaults->spritesetindex >= (int)SpriteSet.Size()) defaults->spritesetindex = 0; + defaults->spr.picnum = SpriteSet[defaults->spritesetindex]; // Unless picnum is specified it will be set to the given image of the sprite set. + } if (PicName.IsNotEmpty()) { defaults->spr.picnum = TileFiles.tileForName(PicName); diff --git a/source/core/thingdef_properties.cpp b/source/core/thingdef_properties.cpp index 85491e287..74681e300 100644 --- a/source/core/thingdef_properties.cpp +++ b/source/core/thingdef_properties.cpp @@ -350,7 +350,7 @@ DEFINE_PROPERTY(intangle, I, CoreActor) //========================================================================== // //========================================================================== -DEFINE_PROPERTY(xvel, I, CoreActor) +DEFINE_PROPERTY(xint, I, CoreActor) { PROP_INT_PARM(i, 0); defaults->spr.xint = i; @@ -360,7 +360,7 @@ DEFINE_PROPERTY(xvel, I, CoreActor) //========================================================================== // //========================================================================== -DEFINE_PROPERTY(yvel, I, CoreActor) +DEFINE_PROPERTY(yint, I, CoreActor) { PROP_INT_PARM(i, 0); defaults->spr.yint = i; @@ -370,7 +370,7 @@ DEFINE_PROPERTY(yvel, I, CoreActor) //========================================================================== // //========================================================================== -DEFINE_PROPERTY(zvel, I, CoreActor) +DEFINE_PROPERTY(inittype, I, CoreActor) { PROP_INT_PARM(i, 0); defaults->spr.inittype = i; @@ -511,6 +511,15 @@ DEFINE_PROPERTY(spriteset, Sssssssssssssssssssssssssssssss, CoreActor) } } +//========================================================================== +// +//========================================================================== +DEFINE_PROPERTY(spritesetindex, I, CoreActor) +{ + PROP_INT_PARM(i, 0); + defaults->spritesetindex = i; +} + //========================================================================== // //========================================================================== diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp index 034fcc406..dbdc69509 100644 --- a/source/games/duke/src/actors_d.cpp +++ b/source/games/duke/src/actors_d.cpp @@ -819,107 +819,6 @@ static void moveviewscreen(DDukeActor* actor) } } -//--------------------------------------------------------------------------- -// -// Duke only -// -//--------------------------------------------------------------------------- - -static void movesidebolt(DDukeActor* actor) -{ - double xx; - auto sectp = actor->sector(); - - findplayer(actor, &xx); - if (xx > 1280) return; - -CLEAR_THE_BOLT2: - if (actor->temp_data[2]) - { - actor->temp_data[2]--; - return; - } - if ((actor->spr.scale.X == 0 && actor->spr.scale.Y) == 0) - { - actor->spr.scale = DVector2(actor->temp_pos.X, actor->temp_pos.Y); - } - if ((krand() & 8) == 0) - { - actor->temp_pos.X = actor->spr.scale.X; - actor->temp_pos.Y = actor->spr.scale.Y; - actor->temp_data[2] = global_random & 4; - actor->spr.scale = DVector2(0, 0); - goto CLEAR_THE_BOLT2; - } - actor->spr.picnum++; - - if ((krand() & 1) && (gs.tileinfo[sectp->floorpicnum].flags & TFLAG_ELECTRIC)) - S_PlayActorSound(SHORT_CIRCUIT, actor); - - if (actor->spr.picnum == SIDEBOLT1 + 4) actor->spr.picnum = SIDEBOLT1; -} - -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - -static void movebolt(DDukeActor *actor) -{ - double xx; - auto sectp = actor->sector(); - - findplayer(actor, &xx); - if (xx > 1280) return; - - if (actor->temp_data[3] == 0) - actor->temp_data[3] = sectp->floorshade; - -CLEAR_THE_BOLT: - if (actor->temp_data[2]) - { - actor->temp_data[2]--; - sectp->floorshade = 20; - sectp->ceilingshade = 20; - return; - } - if (actor->spr.scale.X == 0 && actor->spr.scale.Y == 0) - { - actor->spr.scale = DVector2(actor->temp_pos.X, actor->temp_pos.Y); - } - else if ((krand() & 8) == 0) - { - actor->temp_pos.X = actor->spr.scale.X; - actor->temp_pos.Y = actor->spr.scale.Y; - actor->temp_data[2] = global_random & 4; - actor->spr.scale = DVector2(0, 0); - goto CLEAR_THE_BOLT; - } - actor->spr.picnum++; - - int l = global_random & 7; - actor->spr.scale.X = (0.125 + l * REPEAT_SCALE); - - if (l & 1) actor->spr.cstat ^= CSTAT_SPRITE_TRANSLUCENT; - - if (actor->spr.picnum == (BOLT1+1) && (krand()&7) == 0 && (gs.tileinfo[sectp->floorpicnum].flags & TFLAG_ELECTRIC)) - S_PlayActorSound(SHORT_CIRCUIT,actor); - - if (actor->spr.picnum==BOLT1+4) actor->spr.picnum=BOLT1; - - if (actor->spr.picnum & 1) - { - sectp->floorshade = 0; - sectp->ceilingshade = 0; - } - else - { - sectp->floorshade = 20; - sectp->ceilingshade = 20; - } -} - //--------------------------------------------------------------------------- // // this has been broken up into lots of smaller subfunctions @@ -950,16 +849,6 @@ void movestandables_d(void) moveviewscreen(act); } - else if (picnum >= SIDEBOLT1 && picnum <= SIDEBOLT1 + 3) - { - movesidebolt(act); - } - - else if (picnum >= BOLT1 && picnum <= BOLT1 + 3) - { - movebolt(act); - } - else if (picnum == WATERDRIP) { movewaterdrip(act, WATERDRIP); diff --git a/source/games/duke/src/actors_r.cpp b/source/games/duke/src/actors_r.cpp index df86a28da..8814c846c 100644 --- a/source/games/duke/src/actors_r.cpp +++ b/source/games/duke/src/actors_r.cpp @@ -707,67 +707,6 @@ void movefallers_r(void) // //--------------------------------------------------------------------------- -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - -static void movebolt(DDukeActor* actor) -{ - double xx; - auto sectp = actor->sector(); - - findplayer(actor, &xx); - if (xx > 1280) return; - - if (actor->temp_data[3] == 0) - actor->temp_data[3] = sectp->floorshade; - -CLEAR_THE_BOLT: - if (actor->temp_data[2]) - { - actor->temp_data[2]--; - sectp->floorshade = 20; - sectp->ceilingshade = 20; - return; - } - if (actor->spr.scale.X == 0 && actor->spr.scale.Y == 0) - { - actor->spr.scale = DVector2(actor->temp_pos.X, actor->temp_pos.Y); - } - else if ((krand() & 8) == 0) - { - actor->temp_pos.X = actor->spr.scale.X; - actor->temp_pos.Y = actor->spr.scale.Y; - actor->temp_data[2] = global_random & 4; - actor->spr.scale = DVector2(0, 0); - goto CLEAR_THE_BOLT; - } - actor->spr.picnum++; - - int l = global_random & 7; - actor->spr.scale.X = (0.125 + l * REPEAT_SCALE); - - if (l & 1) actor->spr.cstat ^= CSTAT_SPRITE_TRANSLUCENT; - - if (actor->spr.picnum == (BOLT1 + 1) && (krand() & 1) && (gs.tileinfo[sectp->floorpicnum].flags & TFLAG_ELECTRIC)) - S_PlayActorSound(SHORT_CIRCUIT, actor); - - if (actor->spr.picnum == BOLT1 + 4) actor->spr.picnum = BOLT1; - - if (actor->spr.picnum & 1) - { - sectp->floorshade = 0; - sectp->ceilingshade = 0; - } - else - { - sectp->floorshade = 20; - sectp->ceilingshade = 20; - } -} - //--------------------------------------------------------------------------- // // this has been broken up into lots of smaller subfunctions @@ -793,16 +732,6 @@ void movestandables_r(void) continue; } - else if (picnum == TRASH) - { - movetrash(act); - } - - else if (picnum >= BOLT1 && picnum <= BOLT1 + 3) - { - movebolt(act); - } - else if (picnum == WATERDRIP) { movewaterdrip(act, WATERDRIP); diff --git a/source/games/duke/src/flags_d.cpp b/source/games/duke/src/flags_d.cpp index 043cfa7b2..26980d81e 100644 --- a/source/games/duke/src/flags_d.cpp +++ b/source/games/duke/src/flags_d.cpp @@ -210,7 +210,7 @@ void initactorflags_d() setflag(SFLAG_HITRADIUS_FLAG2, { TRIPBOMB, QUEBALL, STRIPEBALL, DUKELYINGDEAD }); setflag(SFLAG_CHECKSLEEP, { RUBBERCAN, EXPLODINGBARREL, WOODENHORSE, HORSEONSIDE, CANWITHSOMETHING, FIREBARREL, NUKEBARREL, NUKEBARRELDENTED, NUKEBARRELLEAKED, TRIPBOMB }); setflag(SFLAG_NOTELEPORT, { TRANSPORTERSTAR, TRANSPORTERBEAM, TRIPBOMB, BULLETHOLE, WATERSPLASH2, BURNING, BURNING2, FIRE, FIRE2, TOILETWATER, LASERLINE }); - setflag(SFLAG_SE24_NOCARRY, { TRIPBOMB, LASERLINE, BOLT1, BOLT1 + 1,BOLT1 + 2, BOLT1 + 3, SIDEBOLT1, SIDEBOLT1 + 1, SIDEBOLT1 + 2, SIDEBOLT1 + 3, CRANE, CRANE1, CRANE2, BARBROKE }); + setflag(SFLAG_SE24_NOCARRY, { TRIPBOMB, LASERLINE, BOLT1, BOLT2, BOLT3, BOLT4, SIDEBOLT1, SIDEBOLT2, SIDEBOLT3, SIDEBOLT4, CRANE, CRANE1, CRANE2, BARBROKE }); setflag(SFLAG_SE24_REMOVE, { BLOODPOOL, PUKE, FOOTPRINTS, FOOTPRINTS2, FOOTPRINTS3, FOOTPRINTS4, BULLETHOLE, BLOODSPLAT1, BLOODSPLAT2, BLOODSPLAT3, BLOODSPLAT4 }); setflag(SFLAG_BLOCK_TRIPBOMB, { TRIPBOMB }); // making this a flag adds the option to let other things block placing trip bombs as well. setflag(SFLAG_NOFALLER, { CRACK1, CRACK2, CRACK3, CRACK4, SPEAKER, LETTER, DUCK, TARGET, TRIPBOMB, VIEWSCREEN, VIEWSCREEN2 }); diff --git a/source/games/duke/src/flags_r.cpp b/source/games/duke/src/flags_r.cpp index 0a7152c2a..ccbac965b 100644 --- a/source/games/duke/src/flags_r.cpp +++ b/source/games/duke/src/flags_r.cpp @@ -240,7 +240,7 @@ void initactorflags_r() setflag(SFLAG_HITRADIUS_FLAG2, { QUEBALL, STRIPEBALL, BOWLINGPIN, DUKELYINGDEAD }); setflag(SFLAG_CHECKSLEEP, { RUBBERCAN, EXPLODINGBARREL, WOODENHORSE, HORSEONSIDE, CANWITHSOMETHING, FIREBARREL, NUKEBARREL, NUKEBARRELDENTED, NUKEBARRELLEAKED, EGG }); setflag(SFLAG_NOTELEPORT, { TRANSPORTERSTAR, TRANSPORTERBEAM, BULLETHOLE, WATERSPLASH2, BURNING, FIRE, MUD }); - setflag(SFLAG_SE24_NOCARRY, { BULLETHOLE, BOLT1, BOLT1 + 1,BOLT1 + 2, BOLT1 + 3, CRANE, CRANE1, CRANE2, BARBROKE }); + setflag(SFLAG_SE24_NOCARRY, { BULLETHOLE, BOLT1, BOLT2, BOLT3, BOLT4, CRANE, CRANE1, CRANE2, BARBROKE }); setflag(SFLAG_SE24_REMOVE, { BLOODPOOL, PUKE, FOOTPRINTS, FOOTPRINTS2, FOOTPRINTS3 }); setflag(SFLAG_NOFALLER, { CRACK1, CRACK2, CRACK3, CRACK4 }); setflag(SFLAG2_EXPLOSIVE, {RPG, RADIUSEXPLOSION, SEENINE, OOZFILTER }); diff --git a/source/games/duke/src/funct.h b/source/games/duke/src/funct.h index e9d1b0695..9ceea7379 100644 --- a/source/games/duke/src/funct.h +++ b/source/games/duke/src/funct.h @@ -32,7 +32,6 @@ void movefta(); void clearcameras(int i, player_struct* p); void RANDOMSCRAP(DDukeActor* i); void detonate(DDukeActor* i, int explosion); -void movetrash(DDukeActor* i); void movewaterdrip(DDukeActor* i, int drip); void movedoorshock(DDukeActor* i); void movetouchplate(DDukeActor* i, int plate); diff --git a/source/games/duke/src/namelist_d.h b/source/games/duke/src/namelist_d.h index 48b2e3842..ee3f59efa 100644 --- a/source/games/duke/src/namelist_d.h +++ b/source/games/duke/src/namelist_d.h @@ -180,6 +180,9 @@ x(BRICK, 626) x(SPLINTERWOOD, 630) x(PIPE2B, 633) x(BOLT1, 634) +x(BOLT2, 635) +x(BOLT3, 636) +x(BOLT4, 637) x(W_NUMBERS, 640) x(WATERDRIP, 660) x(WATERBUBBLE, 661) @@ -753,6 +756,9 @@ x(PIRATE6A, 4515) x(PIRATEHALF, 4516) x(CHESTOFGOLD, 4520) x(SIDEBOLT1, 4525) +x(SIDEBOLT2, 4526) +x(SIDEBOLT3, 4527) +x(SIDEBOLT4, 4528) x(FOODOBJECT1, 4530) x(FOODOBJECT2, 4531) x(FOODOBJECT3, 4532) diff --git a/source/games/duke/src/namelist_r.h b/source/games/duke/src/namelist_r.h index 34be5ac27..155eccb11 100644 --- a/source/games/duke/src/namelist_r.h +++ b/source/games/duke/src/namelist_r.h @@ -298,6 +298,9 @@ x(PIPE3, 1123) x(PIPE1, 1124) x(PIPE2B, 1126) x(BOLT1, 1127) +x(BOLT2, 1128) +x(BOLT3, 1129) +x(BOLT4, 1130) x(PIPE3B, 1132) x(CAMERA1, 1134) x(BRICK, 1139) diff --git a/source/games/duke/src/spawn_d.cpp b/source/games/duke/src/spawn_d.cpp index 98843f868..54135766a 100644 --- a/source/games/duke/src/spawn_d.cpp +++ b/source/games/duke/src/spawn_d.cpp @@ -684,18 +684,6 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray* act->spr.cstat |= CSTAT_SPRITE_INVISIBLE; ChangeActorStat(act, STAT_STANDABLE); break; - case BOLT1: - case BOLT1 + 1: - case BOLT1 + 2: - case BOLT1 + 3: - case SIDEBOLT1: - case SIDEBOLT1 + 1: - case SIDEBOLT1 + 2: - case SIDEBOLT1 + 3: - act->temp_pos.XY() = act->spr.scale; - act->spr.yint = 0; - ChangeActorStat(act, STAT_STANDABLE); - break; case TARGET: case DUCK: case LETTER: diff --git a/source/games/duke/src/spawn_r.cpp b/source/games/duke/src/spawn_r.cpp index 6b368a029..bf8016a0a 100644 --- a/source/games/duke/src/spawn_r.cpp +++ b/source/games/duke/src/spawn_r.cpp @@ -691,14 +691,6 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray* act->spr.cstat |= CSTAT_SPRITE_INVISIBLE; ChangeActorStat(act, STAT_STANDABLE); break; - case BOLT1: - case BOLT1 + 1: - case BOLT1 + 2: - case BOLT1 + 3: - act->temp_pos.XY() = act->spr.scale; - act->spr.yint = 0; - ChangeActorStat(act, STAT_STANDABLE); - break; // this is not really nice... case BIKERB: diff --git a/source/games/duke/src/vmexports.cpp b/source/games/duke/src/vmexports.cpp index f935661ff..5693fe513 100644 --- a/source/games/duke/src/vmexports.cpp +++ b/source/games/duke/src/vmexports.cpp @@ -84,6 +84,29 @@ DEFINE_ACTION_FUNCTION_NATIVE(_Duke, checkcursectnums, duke_checkcursectnums) ACTION_RETURN_POINTER(duke_checkcursectnums(sect)); } +int duke_floorflags(sectortype* sector) +{ + return gs.tileinfo[sector->floorpicnum].flags; +} + +DEFINE_ACTION_FUNCTION_NATIVE(_Duke, floorflags, duke_floorflags) +{ + PARAM_PROLOGUE; + PARAM_POINTER(sect, sectortype); + ACTION_RETURN_INT(duke_floorflags(sect)); +} + +int duke_global_random() +{ + return global_random; +} + +DEFINE_ACTION_FUNCTION_NATIVE(_Duke, global_random, duke_global_random) +{ + PARAM_PROLOGUE; + ACTION_RETURN_INT(global_random); +} + DEFINE_GLOBAL_UNSIZED(dlevel) //--------------------------------------------------------------------------- diff --git a/wadsrc/static/filter/duke/engine/engine.def b/wadsrc/static/filter/duke/engine/engine.def index 2e1396262..c4877ca37 100644 --- a/wadsrc/static/filter/duke/engine/engine.def +++ b/wadsrc/static/filter/duke/engine/engine.def @@ -26,5 +26,12 @@ spawnclasses 1079 = DukeOozFilter 1247 = DukeSeenine 1272 = DukeTrash - + 634 = DukeBolt1 + 635 = DukeBolt2 + 636 = DukeBolt3 + 637 = DukeBolt4 + 4525 = DukeSideBolt1 + 4526 = DukeSideBolt2 + 4527 = DukeSideBolt3 + 4528 = DukeSideBolt4 } diff --git a/wadsrc/static/filter/redneck/engine/engine.def b/wadsrc/static/filter/redneck/engine/engine.def index 7a6ab397b..47e3ba969 100644 --- a/wadsrc/static/filter/redneck/engine/engine.def +++ b/wadsrc/static/filter/redneck/engine/engine.def @@ -22,5 +22,9 @@ spawnclasses 1273 = DukeOozFilter 1324 = DukeSeenine 1346 = DukeTrash + 1127 = DukeBolt1 + 1128 = DukeBolt2 + 1129 = DukeBolt3 + 1130 = DukeBolt4 } diff --git a/wadsrc/static/zscript.txt b/wadsrc/static/zscript.txt index 91688940b..797efbb90 100644 --- a/wadsrc/static/zscript.txt +++ b/wadsrc/static/zscript.txt @@ -61,6 +61,7 @@ version "4.10" #include "zscript/games/duke/actors/fireext.zs" #include "zscript/games/duke/actors/oozfilter.zs" #include "zscript/games/duke/actors/trash.zs" +#include "zscript/games/duke/actors/bolt.zs" #include "zscript/games/blood/bloodgame.zs" #include "zscript/games/blood/ui/menu.zs" diff --git a/wadsrc/static/zscript/games/duke/actors/bolt.zs b/wadsrc/static/zscript/games/duke/actors/bolt.zs new file mode 100644 index 000000000..760650219 --- /dev/null +++ b/wadsrc/static/zscript/games/duke/actors/bolt.zs @@ -0,0 +1,164 @@ +class DukeBolt1 : DukeActor +{ + default + { + yint 0; + statnum STAT_STANDABLE; + SpriteSet "BOLT1", "BOLT2", "BOLT3", "BOLT4"; + spritesetindex 0; + } + override void Initialize() + { + self.temp_pos.XY = self.scale; + } + + override void Tick() + { + DukePlayer p; + double xx; + let sectp = self.sector; + + [p, xx] = self.findplayer(); + if (xx > 1280) return; + + if (self.temp_data[3] == 0) + self.temp_data[3] = sectp.floorshade; + + while (true) + { + if (self.temp_data[2]) + { + self.temp_data[2]--; + sectp.floorshade = 20; + sectp.ceilingshade = 20; + return; + } + if (self.scale == (0, 0)) + { + self.scale = self.temp_pos.XY; + } + else if ((random() & 8) == 0) + { + self.temp_pos.XY = self.scale; + self.temp_data[2] = Duke.global_random() & 4; + self.scale = (0, 0); + continue; + } + break; + } + self.SetSpritesetImage((self.spritesetindex + 1) % self.GetSpriteSetSize()); + + int l = Duke.global_random() & 7; + self.scale.X = (0.125 + l * REPEAT_SCALE); + + if (l & 1) self.cstat ^= CSTAT_SPRITE_TRANSLUCENT; + + if (self.spritesetindex == 1 && random(0, 7) == 0 && (Duke.floorflags(sectp) & Duke.TFLAG_ELECTRIC)) + self.PlayActorSound(DukeSnd.SHORT_CIRCUIT); + + if (self.spritesetindex & 1) + { + sectp.floorshade = 0; + sectp.ceilingshade = 0; + } + else + { + sectp.floorshade = 20; + sectp.ceilingshade = 20; + } + + } +} + +class DukeBolt2 : DukeBolt1 +{ + default + { + spritesetindex 1; + } +} + +class DukeBolt3 : DukeBolt1 +{ + default + { + spritesetindex 2; + } +} + +class DukeBolt4 : DukeBolt1 +{ + default + { + spritesetindex 3; + } +} + +class DukeSideBolt1 : DukeBolt1 +{ + default + { + SpriteSet "SIDEBOLT1", "SIDEBOLT2", "SIDEBOLT3", "SIDEBOLT4"; + } + + override void Tick() + { + DukePlayer p; + double xx; + let sectp = self.sector; + + [p, xx] = self.findplayer(); + if (xx > 1280) return; + + while (true) + { + if (self.temp_data[2]) + { + self.temp_data[2]--; + return; + } + if (self.scale == (0, 0)) + { + self.scale = self.temp_pos.XY; + } + if ((random() & 8) == 0) + { + self.temp_pos.XY = self.scale; + self.temp_data[2] = Duke.global_random() & 4; + self.scale = (0, 0); + continue; + } + break; + } + self.SetSpriteSetImage((self.spritesetindex + 1) % self.GetSpriteSetSize()); + + if (random(0, 1) && (Duke.floorflags(sectp) & Duke.TFLAG_ELECTRIC)) + self.PlayActorSound(DukeSnd.SHORT_CIRCUIT); + } + +} + +class DukeSideBolt2 : DukeSideBolt1 +{ + default + { + spritesetindex 1; + } +} + +class DukeSideBolt3 : DukeSideBolt1 +{ + default + { + spritesetindex 2; + } +} + +class DukeSideBolt4 : DukeSideBolt1 +{ + default + { + spritesetindex 3; + } +} + diff --git a/wadsrc/static/zscript/games/duke/dukegame.zs b/wadsrc/static/zscript/games/duke/dukegame.zs index 629b8e5c0..e3c88e057 100644 --- a/wadsrc/static/zscript/games/duke/dukegame.zs +++ b/wadsrc/static/zscript/games/duke/dukegame.zs @@ -68,6 +68,16 @@ struct Duke native CLIPMASK1 = (256 << 16) + 64 } + enum ETextureFlags + { + TFLAG_WALLSWITCH = 1, + TFLAG_ADULT = 2, + TFLAG_ELECTRIC = 4, + TFLAG_CLEARINVENTORY = 8, // really dumb Duke stuff... + TFLAG_SLIME = 16, + }; + + native static void PlaySpecialMusic(int which); native static int PlaySound(int num, int channel = CHAN_AUTO, int flags = 0, float vol =0.8f); native static void StopSound(int num); @@ -75,6 +85,8 @@ struct Duke native native static DukePlayer GetViewPlayer(); native static int MaxAmmoAmount(int weap); native static DukePlayer checkcursectnums(sectortype sect); + native static int floorflags(sectortype s); + native static int global_random(); static void PlayBonusMusic() {