diff --git a/src/dehacked.c b/src/dehacked.c index c83a4712f..c51d9821b 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -2396,6 +2396,8 @@ static actionpointer_t actionpointers[] = {{A_DustDevilThink}, "A_DUSTDEVILTHINK"}, {{A_TNTExplode}, "A_TNTEXPLODE"}, {{A_DebrisRandom}, "A_DEBRISRANDOM"}, + {{A_TrainCameo}, "A_TRAINCAMEO"}, + {{A_TrainCameo2}, "A_TRAINCAMEO2"}, {{NULL}, "NONE"}, // This NULL entry must be the last in the list @@ -5734,6 +5736,14 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_ARIDDUST2", "S_ARIDDUST3", + // Train cameo + "S_TRAINCAMEOSPAWNER_1", + "S_TRAINCAMEOSPAWNER_2", + "S_TRAINCAMEOSPAWNER_3", + "S_TRAINCAMEOSPAWNER_4", + "S_TRAINCAMEOSPAWNER_5", + "S_TRAINPUFFMAKER", + // Flame jet "S_FLAMEJETSTND", "S_FLAMEJETSTART", @@ -7430,6 +7440,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_DUSTDEVIL", "MT_DUSTLAYER", "MT_ARIDDUST", + "MT_TRAINCAMEOSPAWNER", + "MT_TRAINSEG", // Red Volcano Scenery "MT_FLAMEJET", diff --git a/src/hardware/hw_light.c b/src/hardware/hw_light.c index bec9580c9..52d5ec448 100644 --- a/src/hardware/hw_light.c +++ b/src/hardware/hw_light.c @@ -356,6 +356,8 @@ light_t *t_lspr[NUMSPRITES] = &lspr[NOLIGHT], // SPR_REMT &lspr[NOLIGHT], // SPR_TAZD &lspr[NOLIGHT], // SPR_ADST + &lspr[NOLIGHT], // SPR_TRAE + &lspr[NOLIGHT], // SPR_TRAI // Red Volcano Scenery &lspr[REDBALL_L], // SPR_FLME diff --git a/src/info.c b/src/info.c index bce2328fc..18de789ec 100644 --- a/src/info.c +++ b/src/info.c @@ -251,6 +251,8 @@ char sprnames[NUMSPRITES + 1][5] = "REMT", // TNT proximity shell "TAZD", // Dust devil "ADST", // Arid dust + "TRAE", // Train cameo locomotive + "TRAI", // Train cameo wagon // Red Volcano Scenery "FLME", // Flame jet @@ -2373,6 +2375,14 @@ state_t states[NUMSTATES] = {SPR_ADST, 3|FF_ANIMATE, 24, {NULL}, 3, 8, S_NULL}, // S_ARIDDUST2 {SPR_ADST, 6|FF_ANIMATE, 24, {NULL}, 3, 8, S_NULL}, // S_ARIDDUST3 + // Train cameo + {SPR_NULL, 0, -1, {NULL}, 0, 0, S_TRAINCAMEOSPAWNER_2}, // S_TRAINCAMEOSPAWNER_1 + {SPR_NULL, 0, 14, {A_TrainCameo}, 20, 18, S_TRAINCAMEOSPAWNER_3}, // S_TRAINCAMEOSPAWNER_2 + {SPR_NULL, 0, 1, {A_Repeat}, 1, 0, S_TRAINCAMEOSPAWNER_4}, // S_TRAINCAMEOSPAWNER_3 + {SPR_NULL, 0, 18, {A_TrainCameo2}, 20, 44, S_TRAINCAMEOSPAWNER_5}, // S_TRAINCAMEOSPAWNER_4 + {SPR_NULL, 0, 1, {A_Repeat}, 5, S_TRAINCAMEOSPAWNER_4, S_NULL}, // S_TRAINCAMEOSPAWNER_5 + {SPR_NULL, 0, 2, {A_SmokeTrailer}, MT_SMOKE, 0, S_TRAINPUFFMAKER}, // S_TRAINPUFFMAKER + // Flame jet {SPR_NULL, 0, 2*TICRATE, {NULL}, 0, 0, S_FLAMEJETSTART}, // S_FLAMEJETSTND {SPR_NULL, 0, 3*TICRATE, {A_ToggleFlameJet}, 0, 0, S_FLAMEJETSTOP}, // S_FLAMEJETSTART @@ -11638,6 +11648,60 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_TRAINCAMEOSPAWNER + 1222, // doomednum + S_TRAINCAMEOSPAWNER_1, // spawnstate + 1, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 28*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIP, // flags + S_NULL // raisestate + }, + + { // MT_TRAINSEG + -1, // doomednum + S_INVISIBLE, // spawnstate + 1, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + FRACUNIT, // radius + FRACUNIT, // height + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + { // MT_FLAMEJET 1300, // doomednum S_FLAMEJETSTND, // spawnstate diff --git a/src/info.h b/src/info.h index 1b89ff748..f0ca27e10 100644 --- a/src/info.h +++ b/src/info.h @@ -254,6 +254,9 @@ void A_Boss5BombExplode(); void A_DustDevilThink(); void A_TNTExplode(); void A_DebrisRandom(); +void A_TrainCameo(); +void A_TrainCameo2(); + // ratio of states to sprites to mobj types is roughly 6 : 1 : 1 #define NUMMOBJFREESLOTS 256 @@ -485,6 +488,8 @@ typedef enum sprite SPR_REMT, // TNT proximity shell SPR_TAZD, // Dust devil SPR_ADST, // Arid dust + SPR_TRAE, // Train cameo locomotive + SPR_TRAI, // Train cameo wagon // Red Volcano Scenery SPR_FLME, // Flame jet @@ -2487,6 +2492,14 @@ typedef enum state S_ARIDDUST2, S_ARIDDUST3, + // Train cameo + S_TRAINCAMEOSPAWNER_1, + S_TRAINCAMEOSPAWNER_2, + S_TRAINCAMEOSPAWNER_3, + S_TRAINCAMEOSPAWNER_4, + S_TRAINCAMEOSPAWNER_5, + S_TRAINPUFFMAKER, + // Flame jet S_FLAMEJETSTND, S_FLAMEJETSTART, @@ -4203,6 +4216,8 @@ typedef enum mobj_type MT_DUSTDEVIL, MT_DUSTLAYER, MT_ARIDDUST, + MT_TRAINCAMEOSPAWNER, + MT_TRAINSEG, // Red Volcano Scenery MT_FLAMEJET, diff --git a/src/p_enemy.c b/src/p_enemy.c index f5b75dc0c..be4701009 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -283,6 +283,8 @@ void A_Boss5BombExplode(mobj_t *actor); void A_DustDevilThink(mobj_t *actor); void A_TNTExplode(mobj_t *actor); void A_DebrisRandom(mobj_t *actor); +void A_TrainCameo(mobj_t *actor); +void A_TrainCameo2(mobj_t *actor); //for p_enemy.c // @@ -12803,5 +12805,92 @@ void A_DebrisRandom(mobj_t *actor) var2 = 359; A_ChangeAngleAbsolute(actor); P_Thrust(actor, actor->angle, FRACUNIT * 2); +} +static mobj_t *P_TrainSeg(mobj_t *src, fixed_t x, fixed_t y, fixed_t z, angle_t ang, spritenum_t spr, UINT32 frame) +{ + mobj_t *s = P_SpawnMobj(x, y, z, MT_TRAINSEG); + s->fuse = 16*TICRATE; + s->sprite = spr; + s->frame = frame|FF_PAPERSPRITE; + s->angle = ang; + P_Thrust(s, src->angle, 7*FRACUNIT); + return s; +} + +// Function: A_TrainCameo +// +// Description: Sets up train cameo locomotive. +// +// var1 = Train width. +// var2 = Train length. +// +void A_TrainCameo(mobj_t *actor) +{ + INT32 locvar1 = var1; + INT32 locvar2 = var2; + fixed_t x = actor->x; + fixed_t y = actor->y; + fixed_t z = actor->z; + angle_t ang = actor->angle; + mobj_t *m; + spritenum_t spr = SPR_TRAE; + fixed_t span = locvar1*FRACUNIT; + fixed_t len = locvar2*FRACUNIT; + +#ifdef HAVE_BLUA + if (LUA_CallAction("A_TrainCameo", actor)) + return; +#endif + + //Spawn sides. + P_TrainSeg(actor, x, y + span, z, ang, spr, 0); + P_TrainSeg(actor, x, y - span, z, ang, spr, 0); + + //Center. + P_TrainSeg(actor, x, y, z, ang, spr, 1); + + //Front and back. + P_TrainSeg(actor, x + len, y, z, ang + ANGLE_90, spr, 2); + P_TrainSeg(actor, x - len, y, z, ang + ANGLE_90, spr, 2); + + //Smoke spawner. + m = P_TrainSeg(actor, x - (20 * FRACUNIT), y, z + (30 * FRACUNIT), ang + ANGLE_90, spr, 0); + P_SetMobjState(m, S_TRAINPUFFMAKER); +} + +// Function: A_TrainCameo2 +// +// Description: Sets up train cameo wagon. +// +// var1 = Train width. +// var2 = Train length. +// +void A_TrainCameo2(mobj_t *actor) +{ + INT32 locvar1 = var1; + INT32 locvar2 = var2; + fixed_t x = actor->x; + fixed_t y = actor->y; + fixed_t z = actor->z; + angle_t ang = actor->angle; + spritenum_t spr = SPR_TRAI; + fixed_t span = locvar1*FRACUNIT; + fixed_t len = locvar2*FRACUNIT; + +#ifdef HAVE_BLUA + if (LUA_CallAction("A_TrainCameo2", actor)) + return; +#endif + + //Spawn sides. + P_TrainSeg(actor, x, y + span, z, ang, spr, 0); + P_TrainSeg(actor, x, y - span, z, ang, spr, 0); + + //Center. + P_TrainSeg(actor, x, y, z, ang, spr, 1); + + //Front and back. + P_TrainSeg(actor, x + len, y, z, ang + ANGLE_90, spr, 2); + P_TrainSeg(actor, x - len, y, z, ang + ANGLE_90, spr, 2); } \ No newline at end of file diff --git a/src/sounds.c b/src/sounds.c index 8c4c1e48c..3139ba1e3 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -196,6 +196,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"corkp", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Cork fired"}, {"corkh", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Cork hit"}, {"bowl", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Bowling"}, + {"chuchu", false, 32, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Train horn"}, // Menu, interface {"chchng", false, 120, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Score"}, diff --git a/src/sounds.h b/src/sounds.h index 54318e215..489e28826 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -262,6 +262,7 @@ typedef enum sfx_corkp, sfx_corkh, sfx_bowl, + sfx_chuchu, // Menu, interface sfx_chchng,