diff --git a/extras/conf/udb/Includes/SRB222_things.cfg b/extras/conf/udb/Includes/SRB222_things.cfg index 5736cb7bf72463fbe0dd3266bb5c3ea35d1df98d..31d6b794d747f277fb8df9c15a1c6132460423e6 100644 --- a/extras/conf/udb/Includes/SRB222_things.cfg +++ b/extras/conf/udb/Includes/SRB222_things.cfg @@ -3895,6 +3895,25 @@ udmf sprite = "EGGMA1"; width = 24; height = 76; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } } 201 { @@ -3902,6 +3921,25 @@ udmf sprite = "EGGNA1"; width = 24; height = 76; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } } 202 { @@ -3909,6 +3947,25 @@ udmf sprite = "EGGOA1"; width = 32; height = 116; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } } 203 { @@ -3916,6 +3973,30 @@ udmf sprite = "EGGPA1"; width = 24; height = 76; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } + arg4 + { + title = "Cage drop trigger tag"; + type = 15; + } } 204 { @@ -3923,6 +4004,25 @@ udmf sprite = "FANGA1"; width = 24; height = 60; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } } 206 { @@ -3930,6 +4030,30 @@ udmf sprite = "BRAKB1"; width = 48; height = 160; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } + arg4 + { + title = "Platform trigger tag"; + type = 15; + } } 207 { @@ -3944,6 +4068,25 @@ udmf sprite = "METLC1"; width = 16; height = 48; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } } 209 { @@ -3951,6 +4094,30 @@ udmf sprite = "BRAK01"; width = 48; height = 160; + arg0 + { + title = "Boss ID"; + } + arg1 + { + title = "Death trigger tag"; + type = 15; + } + arg2 + { + title = "Victory trigger tag"; + type = 15; + } + arg3 + { + title = "Pinch trigger tag"; + type = 15; + } + arg4 + { + title = "Attack trigger tag"; + type = 15; + } } 290 { diff --git a/src/info.c b/src/info.c index d456d2afe380d980880198cc563a74559024886b..ddcf6709e99779f428c6908d4660c7f9413dad53 100644 --- a/src/info.c +++ b/src/info.c @@ -1452,7 +1452,7 @@ state_t states[NUMSTATES] = {SPR_FANG, 18, 16, {A_FaceTarget}, 3, 0, S_FANG_PINCHLOBSHOT1}, // S_FANG_PINCHLOBSHOT0 {SPR_FANG, 19, 2, {A_FaceTarget}, 3, 0, S_FANG_PINCHLOBSHOT2}, // S_FANG_PINCHLOBSHOT1 {SPR_FANG, 20, 30, {A_Boss5MakeItRain}, MT_FBOMB, -16, S_FANG_PINCHLOBSHOT3}, // S_FANG_PINCHLOBSHOT2 - {SPR_FANG, 20, 18, {A_LinedefExecute}, LE_BOSS4DROP, 0, S_FANG_PINCHLOBSHOT4}, // S_FANG_PINCHLOBSHOT3 + {SPR_FANG, 20, 18, {A_LinedefExecuteFromArg}, 3, 0, S_FANG_PINCHLOBSHOT4}, // S_FANG_PINCHLOBSHOT3 {SPR_FANG, 0, 0, {A_Boss5Calm}, 0, 0, S_FANG_PATHINGSTART1}, // S_FANG_PINCHLOBSHOT4 {SPR_FANG, 21, 0, {A_DoNPCPain}, 0, 0, S_FANG_DIE2}, // S_FANG_DIE1 @@ -1584,7 +1584,7 @@ state_t states[NUMSTATES] = {SPR_BRAK, 21, 3*TICRATE, {NULL}, 0, 0, S_BLACKEGG_DESTROYPLAT2}, // S_BLACKEGG_DESTROYPLAT1 {SPR_BRAK, 21, 1, {A_PlaySound}, sfx_s3k54, 0, S_BLACKEGG_DESTROYPLAT3}, // S_BLACKEGG_DESTROYPLAT2 - {SPR_BRAK, 21, 14, {A_LinedefExecute}, LE_BRAKPLATFORM, 0, S_BLACKEGG_STND}, // S_BLACKEGG_DESTROYPLAT3 + {SPR_BRAK, 21, 14, {A_LinedefExecuteFromArg}, 4, 0, S_BLACKEGG_STND}, // S_BLACKEGG_DESTROYPLAT3 {SPR_NULL, 0, 1, {A_CapeChase}, (160 - 20) << 16, 0, S_BLACKEGG_HELPER}, // S_BLACKEGG_HELPER @@ -1618,7 +1618,7 @@ state_t states[NUMSTATES] = {SPR_BRAK, 26 + FF_FULLBRIGHT, 2, {A_BrakFireShot}, MT_CYBRAKDEMON_FLAMESHOT, 128, S_CYBRAKDEMON_FLAME_ATTACK4}, // S_CYBRAKDEMON_FLAME_ATTACK3 // Fire {SPR_BRAK, 7, 1, {A_Repeat}, 30, S_CYBRAKDEMON_FLAME_ATTACK3, S_CYBRAKDEMON_FINISH_ATTACK1}, // S_CYBRAKDEMON_FLAME_ATTACK4 // Loop {SPR_BRAK, 0, 6, {A_RandomState}, S_CYBRAKDEMON_VILE_ATTACK1, S_CYBRAKDEMON_NAPALM_ATTACK1, S_CYBRAKDEMON_MISSILE_ATTACK1}, // S_CYBRAKDEMON_CHOOSE_ATTACK2 - {SPR_BRAK, 20, 0, {A_LinedefExecute}, LE_BRAKVILEATACK, 0, S_CYBRAKDEMON_VILE_ATTACK2}, // S_CYBRAKDEMON_VILE_ATTACK1 + {SPR_BRAK, 20, 0, {A_LinedefExecuteFromArg}, 4, 0, S_CYBRAKDEMON_VILE_ATTACK2}, // S_CYBRAKDEMON_VILE_ATTACK1 {SPR_BRAK, 20, 24, {A_VileTarget}, MT_CYBRAKDEMON_TARGET_RETICULE, 1, S_CYBRAKDEMON_VILE_ATTACK3}, // S_CYBRAKDEMON_VILE_ATTACK2 {SPR_BRAK, 19, 8, {A_FaceTarget}, 0, 0, S_CYBRAKDEMON_VILE_ATTACK4}, // S_CYBRAKDEMON_VILE_ATTACK3 {SPR_BRAK, 18, 8, {A_FaceTarget}, 0, 0, S_CYBRAKDEMON_VILE_ATTACK5}, // S_CYBRAKDEMON_VILE_ATTACK4 @@ -1631,7 +1631,7 @@ state_t states[NUMSTATES] = {SPR_BRAK, 0, 0, {A_SetReactionTime}, 0, 0, S_CYBRAKDEMON_WALK1}, // S_CYBRAKDEMON_FINISH_ATTACK2 // If just attacked, remove MF2_FRET w/out going back to spawnstate {SPR_BRAK, 18, 24, {A_Pain}, 0, 0, S_CYBRAKDEMON_PAIN2}, // S_CYBRAKDEMON_PAIN1 {SPR_BRAK, 18, 0, {A_CheckHealth}, 3, S_CYBRAKDEMON_PAIN3, S_CYBRAKDEMON_CHOOSE_ATTACK1}, // S_CYBRAKDEMON_PAIN2 - {SPR_BRAK, 18, 0, {A_LinedefExecute}, LE_PINCHPHASE, 0, S_CYBRAKDEMON_CHOOSE_ATTACK1}, // S_CYBRAKDEMON_PAIN3 + {SPR_BRAK, 18, 0, {A_LinedefExecuteFromArg}, 3, 0, S_CYBRAKDEMON_CHOOSE_ATTACK1}, // S_CYBRAKDEMON_PAIN3 {SPR_BRAK, 18, 1, {A_Repeat}, 1, S_CYBRAKDEMON_DIE1, S_CYBRAKDEMON_DIE2}, // S_CYBRAKDEMON_DIE1 {SPR_BRAK, 18, 2, {A_BossScream}, 2, 0, S_CYBRAKDEMON_DIE3}, // S_CYBRAKDEMON_DIE2 {SPR_BRAK, 18, 0, {A_Repeat}, 52, S_CYBRAKDEMON_DIE2, S_CYBRAKDEMON_DIE4}, // S_CYBRAKDEMON_DIE3 diff --git a/src/p_enemy.c b/src/p_enemy.c index 220f8cf1695b2c140e4ceb7e96c030268f5b0cd0..5d7cacb366f71b5690ef211c7059d8eddfd84a03 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3911,7 +3911,8 @@ static void P_DoBossVictory(mobj_t *mo) } // victory! - P_LinedefExecute(LE_ALLBOSSESDEAD, mo, NULL); + if (mo->spawnpoint) + P_LinedefExecute(mo->spawnpoint->args[1], mo, NULL); if (stoppedclock && modeattacking) // if you're just time attacking, skip making the capsule appear since you don't need to step on it anyways. return; @@ -4081,14 +4082,14 @@ static void P_DoBoss5Death(mobj_t *mo) static void P_DoBossDefaultDeath(mobj_t *mo) { - UINT8 extrainfo = (mo->spawnpoint ? mo->spawnpoint->extrainfo : 0); + INT32 bossid = (mo->spawnpoint ? mo->spawnpoint->args[0] : 0); // Stop exploding and prepare to run. P_SetMobjState(mo, mo->info->xdeathstate); if (P_MobjWasRemoved(mo)) return; - P_SetTarget(&mo->target, P_FindBossFlyPoint(mo, extrainfo)); + P_SetTarget(&mo->target, P_FindBossFlyPoint(mo, bossid)); mo->flags |= MF_NOGRAVITY|MF_NOCLIP; mo->flags |= MF_NOCLIPHEIGHT; @@ -4122,12 +4123,12 @@ static void P_DoBossDefaultDeath(mobj_t *mo) void A_BossDeath(mobj_t *mo) { INT32 i; - UINT8 extrainfo = (mo->spawnpoint ? mo->spawnpoint->extrainfo : 0); if (LUA_CallAction(A_BOSSDEATH, mo)) return; - P_LinedefExecute(LE_BOSSDEAD+(extrainfo*LE_PARAMWIDTH), mo, NULL); + if (mo->spawnpoint) + P_LinedefExecute(mo->spawnpoint->args[1], mo, NULL); mo->health = 0; // Boss is dead (but not necessarily fleeing...) @@ -7070,10 +7071,8 @@ void A_Boss1Chase(mobj_t *actor) } else { - if (actor->spawnpoint && actor->spawnpoint->extrainfo) - P_LinedefExecute(LE_PINCHPHASE+(actor->spawnpoint->extrainfo*LE_PARAMWIDTH), actor, NULL); - else - P_LinedefExecute(LE_PINCHPHASE, actor, NULL); + if (actor->spawnpoint) + P_LinedefExecute(actor->spawnpoint->args[3], actor, NULL); P_SetMobjState(actor, actor->info->raisestate); } @@ -8324,8 +8323,6 @@ void A_LinedefExecute(mobj_t *actor) if (locvar2) tagnum += locvar2*(AngleFixed(actor->angle)>>FRACBITS); - else if (actor->spawnpoint && actor->spawnpoint->extrainfo) - tagnum += (actor->spawnpoint->extrainfo*LE_PARAMWIDTH); CONS_Debug(DBG_GAMELOGIC, "A_LinedefExecute: Running mobjtype %d's sector with tag %d\n", actor->type, tagnum); @@ -12714,7 +12711,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) INT32 locvar1 = var1; boolean avoidcenter; INT32 i; - UINT8 extrainfo = (actor->spawnpoint ? actor->spawnpoint->extrainfo : 0); + INT32 bossid = (actor->spawnpoint ? actor->spawnpoint->args[0] : 0); if (LUA_CallAction(A_BOSS5FINDWAYPOINT, actor)) return; @@ -12723,7 +12720,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) if (locvar1 == 2) // look for the boss flypoint { - P_SetTarget(&actor->tracer, P_FindBossFlyPoint(actor, extrainfo)); + P_SetTarget(&actor->tracer, P_FindBossFlyPoint(actor, bossid)); if (!actor->tracer) return; // no boss flypoints found @@ -12735,7 +12732,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) if (avoidcenter) goto nowaypoints; // if we can't go the center, why on earth are we doing this? - TAG_ITER_THINGS(extrainfo, i) + TAG_ITER_THINGS(bossid, i) { if (!mapthings[i].mobj) continue; @@ -12762,7 +12759,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) actor->z += hackoffset; // first, count how many waypoints we have - TAG_ITER_THINGS(extrainfo, i) + TAG_ITER_THINGS(bossid, i) { if (!mapthings[i].mobj) continue; @@ -12817,7 +12814,7 @@ void A_Boss5FindWaypoint(mobj_t *actor) numfangwaypoints = 0; // now find them again and add them to the table! - TAG_ITER_THINGS(extrainfo, i) + TAG_ITER_THINGS(bossid, i) { if (!mapthings[i].mobj) continue; diff --git a/src/p_mobj.c b/src/p_mobj.c index 7e8f4b39710050f2fd590da3a05c88bc4f12bda3..406519e22d61b0de27be460ef37aaf79ad9a089a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -4347,7 +4347,8 @@ static void P_Boss2Thinker(mobj_t *mobj) { mobj->flags &= ~MF_NOGRAVITY; A_Boss2Pogo(mobj); - P_LinedefExecute(LE_PINCHPHASE, mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); } } @@ -4476,7 +4477,8 @@ static void P_Boss3Thinker(mobj_t *mobj) dummy->cusval = mobj->cusval; CONS_Debug(DBG_GAMELOGIC, "Eggman path %d - Dummy selected paths %d and %d\n", way0, way1, way2); - P_LinedefExecute(LE_PINCHPHASE+(mobj->cusval*LE_PARAMWIDTH), mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); } } else if (mobj->movecount) // Firing mode @@ -4642,12 +4644,14 @@ static void P_Boss3Thinker(mobj_t *mobj) // Move Boss4's sectors by delta. static boolean P_Boss4MoveCage(mobj_t *mobj, fixed_t delta) { - const UINT16 tag = 65534 + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0); INT32 snum; sector_t *sector; boolean gotcage = false; - TAG_ITER_SECTORS(tag, snum) + if (!mobj->spawnpoint) + return false; + + TAG_ITER_SECTORS(mobj->spawnpoint->args[3], snum) { sector = §ors[snum]; sector->floorheight += delta; @@ -4726,13 +4730,15 @@ static void P_Boss4PinchSpikeballs(mobj_t *mobj, angle_t angle, fixed_t dz) // Destroy cage FOFs. static void P_Boss4DestroyCage(mobj_t *mobj) { - const UINT16 tag = 65534 + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0); INT32 snum; size_t a; sector_t *sector, *rsec; ffloor_t *rover; - TAG_ITER_SECTORS(tag, snum) + if (!mobj->spawnpoint) + return; + + TAG_ITER_SECTORS(mobj->spawnpoint->args[3], snum) { sector = §ors[snum]; @@ -5005,13 +5011,15 @@ static void P_Boss4Thinker(mobj_t *mobj) { // Proceed to pinch phase! P_Boss4DestroyCage(mobj); mobj->movedir = 3; - P_LinedefExecute(LE_PINCHPHASE + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0), mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); P_Boss4MoveSpikeballs(mobj, FixedAngle(mobj->movecount), 0); var1 = 3; A_BossJetFume(mobj); return; } - P_LinedefExecute(LE_BOSS4DROP - (mobj->info->spawnhealth-mobj->health) + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0), mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[4] - (mobj->info->spawnhealth-mobj->health), mobj, NULL); // 1 -> 1.5 second timer mobj->threshold = TICRATE+(TICRATE*(mobj->info->spawnhealth-mobj->health)/10); if (mobj->threshold < 1) @@ -5043,7 +5051,8 @@ static void P_Boss4Thinker(mobj_t *mobj) { // Proceed to pinch phase! P_Boss4DestroyCage(mobj); mobj->movedir = 3; - P_LinedefExecute(LE_PINCHPHASE + (mobj->spawnpoint ? mobj->spawnpoint->extrainfo*LE_PARAMWIDTH : 0), mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); var1 = 3; A_BossJetFume(mobj); return; @@ -5183,7 +5192,8 @@ static void P_Boss7Thinker(mobj_t *mobj) // Begin platform destruction mobj->flags2 |= MF2_FRET; P_SetMobjState(mobj, mobj->info->raisestate); - P_LinedefExecute(LE_PINCHPHASE, mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); } } else if (mobj->state == &states[S_BLACKEGG_HITFACE4] && mobj->tics == mobj->state->tics) @@ -5277,7 +5287,7 @@ static void P_Boss7Thinker(mobj_t *mobj) INT32 i; boolean foundgoop = false; INT32 closestNum; - UINT8 extrainfo = (mobj->spawnpoint ? mobj->spawnpoint->extrainfo : 0); + UINT8 bossid = (mobj->spawnpoint ? mobj->spawnpoint->args[0] : 0); // Looks for players in goop. If you find one, try to jump on him. for (i = 0; i < MAXPLAYERS; i++) @@ -5307,7 +5317,7 @@ static void P_Boss7Thinker(mobj_t *mobj) continue; if (!mo2->spawnpoint) continue; - if (mo2->spawnpoint->extrainfo != extrainfo) + if (mo2->spawnpoint->extrainfo != bossid) continue; if (mobj->health <= mobj->info->damage && !(mo2->spawnpoint->options & 7)) continue; // don't jump to center @@ -5364,7 +5374,7 @@ static void P_Boss7Thinker(mobj_t *mobj) continue; if ((mo2->spawnpoint->options & 7) != waypointNum) continue; - if (mo2->spawnpoint->extrainfo != extrainfo) + if (mo2->spawnpoint->extrainfo != bossid) continue; hitspot = mo2; @@ -6040,7 +6050,8 @@ static void P_Boss9Thinker(mobj_t *mobj) mobj->watertop = mobj->floorz + 16*FRACUNIT; else mobj->watertop = mobj->target->floorz + 16*FRACUNIT; - P_LinedefExecute(LE_PINCHPHASE, mobj, NULL); + if (mobj->spawnpoint) + P_LinedefExecute(mobj->spawnpoint->args[3], mobj, NULL); #if 0 whoosh = P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_GHOST); // done here so the offset is correct @@ -10147,7 +10158,7 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->flags & MF_NOTHINK) return; - if ((mobj->flags & MF_BOSS) && mobj->spawnpoint && (bossdisabled & (1<<mobj->spawnpoint->extrainfo))) + if ((mobj->flags & MF_BOSS) && mobj->spawnpoint && (bossdisabled & (1<<mobj->spawnpoint->args[0]))) return; // Remove dead target/tracer. diff --git a/src/p_setup.c b/src/p_setup.c index ac7d9e919027f71880b26d23853ac9289e8754bb..7fe66148fd6e69e1f7e86d65406c64e5aa5af99a 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3175,6 +3175,8 @@ static line_t *P_FindPointPushLine(taglist_t *list) static void P_ConvertBinaryMap(void) { size_t i; + mobjtype_t mobjtypeofthing[4096]; + mobjtype_t mobjtype; for (i = 0; i < numlines; i++) { @@ -4872,6 +4874,14 @@ static void P_ConvertBinaryMap(void) } } + for (i = 0; i < NUMMOBJTYPES; i++) + { + if (mobjinfo[i].doomednum < 0 || mobjinfo[i].doomednum >= 4096) + continue; + + mobjtypeofthing[mobjinfo[i].doomednum] = (mobjtype_t)i; + } + for (i = 0; i < nummapthings; i++) { if (mapthings[i].type >= 1 && mapthings[i].type <= 35) @@ -4880,6 +4890,19 @@ static void P_ConvertBinaryMap(void) continue; } + mobjtype = mobjtypeofthing[mapthings[i].type]; + if (mobjtype) + { + if (mobjinfo[mobjtype].flags & MF_BOSS) + { + INT32 paramoffset = mapthings[i].extrainfo*LE_PARAMWIDTH; + mapthings[i].args[0] = mapthings[i].extrainfo; + mapthings[i].args[1] = LE_BOSSDEAD + paramoffset; + mapthings[i].args[2] = LE_ALLBOSSESDEAD + paramoffset; + mapthings[i].args[3] = LE_PINCHPHASE + paramoffset; + } + } + switch (mapthings[i].type) { case 102: //SDURF @@ -4901,6 +4924,18 @@ static void P_ConvertBinaryMap(void) case 136: //Pyre Fly mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break; + case 203: //Egg Colosseum + mapthings[i].args[4] = LE_BOSS4DROP + mapthings[i].extrainfo * LE_PARAMWIDTH; + break; + case 204: //Fang + mapthings[i].args[3] = LE_BOSS4DROP + mapthings[i].extrainfo*LE_PARAMWIDTH; + break; + case 206: //Brak Eggman (Old) + mapthings[i].args[4] = LE_BRAKPLATFORM + mapthings[i].extrainfo*LE_PARAMWIDTH; + break; + case 209: //Brak Eggman + mapthings[i].args[4] = LE_BRAKVILEATACK + mapthings[i].extrainfo*LE_PARAMWIDTH; + break; case 294: mapthings[i].args[0] = !!(mapthings[i].options & MTF_AMBUSH); break;