diff --git a/src/deh_tables.c b/src/deh_tables.c index 588bbea9beab385695b191c74e0b22630af72584..689d8746b86429c594894216969e98b3b39f89ee 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3697,7 +3697,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 276e03297b6f0d453ad0d0c65fc8bd9196d9680c..e2b4b08346c1b5c0c7da93b34280b76a8c7558e6 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -221,6 +221,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 a17d988078e63ab4f3ac3173700384571b357ed3..ed2e3fa51a8d11e64d74e68125cb93744fed1966 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4001,6 +4001,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 cc44fd053ecbf557b90afd8c52da3e6ebdaaab10..416b328ee1c7ec6a996b3c5aef07a3726572d498 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -229,6 +229,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 bab6945d6ec15900cac9764572280ba95b83dff8..15ff40c675e8d3c05486c50c3aa2cdc110dd080d 100644 --- a/src/info.c +++ b/src/info.c @@ -7157,33 +7157,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 f5ab1595e87ffc104c87fb45976a9f32d13065cc..a2d87dbdc10644edaaf34187d45495d70ba49f85 100644 --- a/src/info.h +++ b/src/info.h @@ -4529,7 +4529,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 8256d73756b4367d8215c928d225468359e31dc4..4376f96c6e1554f31d6ece1f9d1d63069039a03c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10013,6 +10013,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; @@ -10021,7 +10025,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) { @@ -10029,20 +10037,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) @@ -10612,7 +10616,6 @@ static fixed_t P_DefaultMobjShadowScale (mobj_t *thing) case MT_FLICKY_16: case MT_SECRETFLICKY_01: case MT_SECRETFLICKY_02: - return FRACUNIT; default: @@ -11497,6 +11500,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 // @@ -12077,12 +12098,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])) @@ -12170,14 +12191,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) @@ -13211,8 +13225,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: @@ -13271,6 +13283,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 @@ -13428,7 +13443,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);