From: z411 Date: Tue, 12 Oct 2021 18:37:35 +0000 (-0300) Subject: Fix MMM murderer/detective amount calculation X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=3d8277925eeb6888fa637bc7820fadb016fade8c;p=xonotic%2Fxonotic-data.pk3dir.git Fix MMM murderer/detective amount calculation --- diff --git a/gamemodes-server.cfg b/gamemodes-server.cfg index 8121dab8b..7f577325b 100644 --- a/gamemodes-server.cfg +++ b/gamemodes-server.cfg @@ -576,8 +576,8 @@ set g_duel_not_dm_maps 0 "when this is set, DM maps will NOT be listed in duel" set g_mmm 0 "Murder in Megaerebus Manor: A group of space civilians have murderers among them. Murderers must kill civilians, while the civilians have to try to find and kill the murderers" set g_mmm_not_lms_maps 0 "when this is set, LMS maps will NOT be listed in mmm" set g_mmm_not_dm_maps 0 "when this is set, DM maps will NOT be listed in mmm" -set g_mmm_civilian_count 0.625 "number of players who will become civilians, set between 0 and 0.9 to use a multiplier of the current players, or 1 and above to specify an exact number of players" -//set g_mmm_murderer_count 0.25 "number of players who will become murderers, set between 0 and 0.9 to use a multiplier of the current players, or 1 and above to specify an exact number of players" +set g_mmm_murderer_count 0.25 "number of players who will become murderers, set between 0 and 0.9 to use a multiplier of the current players, or 1 and above to specify an exact number of players" +set g_mmm_detective_count 0.125 "number of players who will become detectives, set between 0 and 0.9 to use a multiplier of the current players, or 1 and above, to specify an exact number of players. 0 = no detectives" set g_mmm_punish_teamkill 0 "enable option to kill the player when they kill an ally" set g_mmm_reward_civilian 1 "give a point to all civilian players if the round timelimit is reached, in addition to the points given for kills" set g_mmm_warmup 10 "how long the players will have time to run around the map before the round starts" diff --git a/qcsrc/common/gamemodes/gamemode/mmm/sv_mmm.qc b/qcsrc/common/gamemodes/gamemode/mmm/sv_mmm.qc index 596a3a3f4..20f288047 100644 --- a/qcsrc/common/gamemodes/gamemode/mmm/sv_mmm.qc +++ b/qcsrc/common/gamemodes/gamemode/mmm/sv_mmm.qc @@ -1,9 +1,7 @@ #include "sv_mmm.qh" -//set g_mmm_detective_count 0.125 "number of players who will become detectives, set between 0 and 0.9 to use a multiplier of the current players, or 1 and above to specify an exact number of players" -//float autocvar_g_mmm_detective_count = 0.125; //I don't think that it'll be used... -float autocvar_g_mmm_civilian_count = 0.625; -//float autocvar_g_mmm_murderer_count = 0.25; +float autocvar_g_mmm_detective_count = 0.125; +float autocvar_g_mmm_murderer_count = 0.25; float autocvar_g_mmm_round_timelimit = 180; float autocvar_g_mmm_warmup = 10; bool autocvar_g_mmm_punish_teamkill = false; @@ -243,101 +241,34 @@ void mmm_RoundStart() if(IS_PLAYER(it) && !IS_DEAD(it)) { ++playercount; - it.mmm_status = MMM_STATUS_CIVILIAN; } else it.mmm_status = 0; // this is mostly a safety check; if a client manages to somehow maintain a mmm status, clear it before the round starts! it.mmm_validkills = 0; }); - int civilian_count = bound(1, ((autocvar_g_mmm_civilian_count >= 1) ? autocvar_g_mmm_civilian_count : floor(playercount * autocvar_g_mmm_civilian_count)), playercount - 1); // 20%, but ensure at least 1 and less than total - int total_civilians = 0; - //int murderer_count = bound(1, ((autocvar_g_mmm_murderer_count >= 1) ? autocvar_g_mmm_murderer_count : floor(playercount * autocvar_g_mmm_murderer_count)), playercount - 1); // 20%, but ensure at least 1 and less than total + int murderer_count = ((autocvar_g_mmm_murderer_count >= 1) ? autocvar_g_mmm_murderer_count : max(floor(playercount * autocvar_g_mmm_murderer_count), 1)); // There must be at least 1 murderer + int detective_count = ((autocvar_g_mmm_detective_count >= 1 || autocvar_g_mmm_detective_count == 0) ? autocvar_g_mmm_detective_count : floor(playercount * autocvar_g_mmm_detective_count)); // It's fine if there are no detectives + int total_murderers = 0; - //int detective_count = bound(1, ((autocvar_g_mmm_detective_count >= 1) ? autocvar_g_mmm_detective_count : floor(playercount * autocvar_g_mmm_detective_count)), playercount - 1); // 20%, but ensure at least 1 and less than total int total_detectives = 0; + int total_civilians = 0; - //civilians TOTAL FOREACH_CLIENT_RANDOM(IS_PLAYER(it) && !IS_DEAD(it), { - if(total_civilians >= civilian_count) - break; - //LegendGuard fixes the round start again 22-03-2021 - total_civilians++; - if (total_civilians <= 1) - { - if (total_murderers <= 1) - { - total_murderers++; - it.mmm_status = MMM_STATUS_MURDERER; - } - } - else if (total_civilians == 2) - { - if (total_detectives >= 1) - break; - else - { - total_detectives++; - it.mmm_status = MMM_STATUS_DETECTIVE; - } - } - else if (total_civilians == 5) - { - if (total_murderers <= 2) - break; - else - { - total_murderers++; - it.mmm_status = MMM_STATUS_MURDERER; - } - } - else if (total_civilians == 6) - { - if (total_detectives >= 2) - break; - else - { - total_detectives++; - it.mmm_status = MMM_STATUS_DETECTIVE; - } - } - else if (total_civilians == 7) - { - if (total_detectives >= 3) - break; - else if (total_murderers == 3) - { - total_murderers++; - it.mmm_status = MMM_STATUS_MURDERER; - } - else - { - total_detectives++; - it.mmm_status = MMM_STATUS_DETECTIVE; - } - } - else if (total_civilians >= 8) - { - if (total_detectives >= 4) - break; - else if (total_murderers == 4) - { - total_murderers++; - it.mmm_status = MMM_STATUS_MURDERER; - } - else - { - total_detectives++; - it.mmm_status = MMM_STATUS_DETECTIVE; - } - } - else - { - total_murderers++; + if (total_murderers < murderer_count) { it.mmm_status = MMM_STATUS_MURDERER; + total_murderers++; + } else if (total_detectives < detective_count) { + it.mmm_status = MMM_STATUS_DETECTIVE; + total_detectives++; + } else { + it.mmm_status = MMM_STATUS_CIVILIAN; + total_civilians++; } }); + + //LOG_INFOF("Total players: %d || Murderers: %d, Detectives: %d, Civilians: %d", playercount, total_murderers, total_detectives, total_civilians); FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it), {