diff --git a/src/deh_tables.c b/src/deh_tables.c index 5f473654cf17792a0d6127eda25bcab0ea09f264..c256218613640758fab8cc685498ff1621dcccba 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3690,7 +3690,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_TOKEN", // Special Stage token for special stage "MT_REDFLAG", // Red CTF Flag "MT_BLUEFLAG", // Blue CTF Flag - "MT_TEAMFLAG", // Team flag "MT_EMBLEM", "MT_EMERALD1", "MT_EMERALD2", diff --git a/src/doomdata.h b/src/doomdata.h index 576fe03e29e9abc18659ce14972bfb41d5b1756e..439cb22b1555ac003b8e440f444d14d736893e9c 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -217,6 +217,8 @@ typedef struct struct mobj_s *mobj; } mapthing_t; +#define THING_TYPE_CTF_TEAM_FLAG 324 + #define ZSHIFT 4 #define NUMMAPS 1035 diff --git a/src/g_game.c b/src/g_game.c index cc9767bed4e9c4c698df49364a64dcd84debe643..08beccd92d465cfaf6efe95da35f03a106652f1d 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3995,6 +3995,20 @@ UINT8 G_GetTeamListFromTeamFlags(UINT8 *teamlist, UINT32 flags) return count; } +UINT8 G_GetTeamByName(const char *name) +{ + if (name != NULL) + { + for (UINT8 i = 0; i < numteams; i++) + { + if (!strcmp(name, teamnames[i][1])) + return i; + } + } + + return MAXTEAMS; +} + const char *G_GetTeamName(UINT8 team) { if (team >= numteams || !teams[team].name) diff --git a/src/g_game.h b/src/g_game.h index 6119645c1bedaa01ff6427ccc813dd8180eb3dd0..b1d8d1bbbc1370075376cf5a26a3bba18ba08cc3 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -228,6 +228,7 @@ UINT8 G_GetGametypeTeam(UINT8 gtype, UINT8 team); UINT8 G_GetTeam(UINT8 team); UINT8 G_GetTeamFromTeamFlag(UINT32 flag); UINT8 G_GetTeamListFromTeamFlags(UINT8 *teamlist, UINT32 flags); +UINT8 G_GetTeamByName(const char *name); const char *G_GetTeamName(UINT8 team); const char *G_GetTeamFlagName(UINT8 team); UINT32 G_GetTeamWeaponMobjtype(UINT8 team); diff --git a/src/info.c b/src/info.c index bc5214f597c016365a2662b0f54b855837cff2f1..47e4b6b9357b0a90a4705d05d971ff4bd1d1081b 100644 --- a/src/info.c +++ b/src/info.c @@ -7149,33 +7149,6 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - { // MT_TEAMFLAG - 323, // doomednum - S_NULL, // spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 8, // 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_lvpass, // deathsound - 8, // speed - 24*FRACUNIT, // radius - 64*FRACUNIT, // height - 0, // display offset - 0, // mass - 0, // damage - sfx_None, // activesound - MF_SPECIAL, // flags - S_NULL // raisestate - }, - { // MT_EMBLEM 322, // doomednum S_EMBLEM1, // spawnstate diff --git a/src/info.h b/src/info.h index f7c7f80d4930f036edfee969fd334dd5a529b4fb..5c7a9f3fd428579c674c7f969db44f7d71b88f07 100644 --- a/src/info.h +++ b/src/info.h @@ -4521,7 +4521,6 @@ typedef enum mobj_type MT_TOKEN, // Special Stage token for special stage MT_REDFLAG, // Red CTF Flag MT_BLUEFLAG, // Blue CTF Flag - MT_TEAMFLAG, // Team flag MT_EMBLEM, MT_EMERALD1, MT_EMERALD2, diff --git a/src/p_mobj.c b/src/p_mobj.c index 336e7759332bebc02c4e57a364ac7cd802bb1d5f..6300bde4814bb6f2093fb07d9535f24648053857 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10012,6 +10012,10 @@ static void P_FlagFuseThink(mobj_t *mobj) if (!mobj->spawnpoint) return; + UINT8 team = mobj->extravalue1; + if (team == TEAM_NONE || team >= numteams) + return; + x = mobj->spawnpoint->x << FRACBITS; y = mobj->spawnpoint->y << FRACBITS; z = mobj->spawnpoint->z << FRACBITS; @@ -10020,7 +10024,11 @@ static void P_FlagFuseThink(mobj_t *mobj) z = ss->sector->ceilingheight - mobjinfo[mobj->type].height - z; else z = ss->sector->floorheight + z; - flagmo = P_SpawnMobj(x, y, z, mobj->type); + + flagmo = P_SpawnTeamFlag(team, x, y, z); + if (flagmo == NULL) + return; + flagmo->spawnpoint = mobj->spawnpoint; if (mobj->spawnpoint->options & MTF_OBJECTFLIP) { @@ -10028,20 +10036,16 @@ static void P_FlagFuseThink(mobj_t *mobj) flagmo->flags2 |= MF2_OBJECTFLIP; } - UINT8 team = mobj->info->mass; - if (team < numteams) - { - if (!(mobj->flags2 & MF2_JUSTATTACKED)) - CONS_Printf(M_GetText("The %s%s\200 has returned to base.\n"), GetChatColorForSkincolor(G_GetTeamColor(team)), G_GetTeamFlagName(team)); + if (!(mobj->flags2 & MF2_JUSTATTACKED)) + CONS_Printf(M_GetText("The %s%s\200 has returned to base.\n"), GetChatColorForSkincolor(G_GetTeamColor(team)), G_GetTeamFlagName(team)); - // Assumedly in splitscreen players will be on opposing teams - if (players[consoleplayer].ctfteam == team || splitscreen) - S_StartSound(NULL, sfx_hoop1); - else if (players[consoleplayer].ctfteam != 0) - S_StartSound(NULL, sfx_hoop3); + // Assumedly in splitscreen players will be on opposing teams + if (players[consoleplayer].ctfteam == team || splitscreen) + S_StartSound(NULL, sfx_hoop1); + else if (players[consoleplayer].ctfteam != 0) + S_StartSound(NULL, sfx_hoop3); - P_SetTarget(&flagmobjs[team], flagmo); - } + P_SetTarget(&flagmobjs[team], flagmo); } static boolean P_FuseThink(mobj_t *mobj) @@ -10587,7 +10591,6 @@ static fixed_t P_DefaultMobjShadowScale (mobj_t *thing) case MT_FLICKY_16: case MT_SECRETFLICKY_01: case MT_SECRETFLICKY_02: - return FRACUNIT; default: @@ -11472,6 +11475,24 @@ mobjtype_t P_GetMobjtype(UINT16 mthingtype) return MT_UNKNOWN; } +static mobjtype_t P_GetMobjtypeFromMapthing(mapthing_t *mthing) +{ + if (mthing->type == THING_TYPE_CTF_TEAM_FLAG) // CTF team flag + { + UINT8 team = G_GetTeamByName(mthing->stringargs[0]); + if (team == TEAM_NONE || team >= numteams) + return MT_UNKNOWN; + else + { + mobjtype_t type = teams[team].flag_mobj_type; + if (type == MT_NULL || type >= NUMMOBJTYPES) + return MT_UNKNOWN; + } + } + + return P_GetMobjtype(mthing->type); +} + // // P_RespawnSpecials // @@ -12055,12 +12076,12 @@ static boolean P_AllowMobjSpawn(mapthing_t* mthing, mobjtype_t i) if (!(gametyperules & GTR_TEAMFLAGS)) // CTF specific things { - if (i == MT_BLUEFLAG || i == MT_REDFLAG || i == MT_TEAMFLAG) + if (i == MT_BLUEFLAG || i == MT_REDFLAG || mthing->type == THING_TYPE_CTF_TEAM_FLAG) return false; // No flags in non-CTF modes! } - else if (i == MT_BLUEFLAG || i == MT_REDFLAG || i == MT_TEAMFLAG) + else if (i == MT_BLUEFLAG || i == MT_REDFLAG || mthing->type == THING_TYPE_CTF_TEAM_FLAG) { - UINT8 team = i == MT_TEAMFLAG ? mthing->args[0] : G_GetTeam(mobjinfo[i].mass); + UINT8 team = mthing->type == THING_TYPE_CTF_TEAM_FLAG ? G_GetTeamByName(mthing->stringargs[0]) : G_GetTeam(mobjinfo[i].mass); if (team == TEAM_NONE || team >= numteams) return false; else if (flagmobjs[team] && !P_MobjWasRemoved(flagmobjs[team])) @@ -12148,14 +12169,7 @@ static mobjtype_t P_GetMobjtypeSubstitute(mapthing_t *mthing, mobjtype_t i) return MT_NIGHTSCHIP; } - if (i == MT_TEAMFLAG) - { - INT32 team = mthing->args[0]; - if (team == TEAM_NONE || team >= numteams) - return MT_NULL; - return teams[team].flag_mobj_type; - } - else if (i == MT_BLUEFLAG || i == MT_REDFLAG) + if (i == MT_BLUEFLAG || i == MT_REDFLAG) { INT32 team = G_GetTeam(mobjinfo[i].mass); if (team == TEAM_NONE || team >= numteams) @@ -13189,8 +13203,6 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean case MT_REDFLAG: case MT_BLUEFLAG: mobj->extravalue1 = G_GetTeam(mobj->info->mass); - /* FALLTHRU */ - case MT_TEAMFLAG: mobj->eflags |= MFE_TEAMFLAG; break; case MT_NIGHTSSTAR: @@ -13249,6 +13261,9 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean break; } + if (mthing->type == THING_TYPE_CTF_TEAM_FLAG) + mobj->eflags |= MFE_TEAMFLAG; + if (mobj->flags & MF_BOSS) { if (mthing->args[1]) // No egg trap for this boss @@ -13406,7 +13421,7 @@ mobj_t *P_SpawnMapThing(mapthing_t *mthing) if (!objectplacing && P_SpawnNonMobjMapThing(mthing)) return mobj; - i = P_GetMobjtype(mthing->type); + i = P_GetMobjtypeFromMapthing(mthing); if (i == MT_UNKNOWN) CONS_Alert(CONS_WARNING, M_GetText("Unknown thing type %d placed at (%d, %d)\n"), mthing->type, mthing->x, mthing->y);