diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index ae0b05441c6..131ab92ae41 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -57,7 +57,8 @@ var/list/blob_nodes = list() var/list/candidates = list() for(var/mob/living/carbon/human/player in player_list) if(!player.stat && player.mind && !player.mind.special_role && !jobban_isbanned(player, "Syndicate") && (player.client.prefs.be_special & BE_BLOB)) - candidates += player + if(age_check(player.client)) + candidates += player return candidates diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index ab64a285afc..9e53d64cfc3 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -87,8 +87,9 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" if(changelings.len <= (changelingcap - 2) || prob(100 - (config.changeling_scaling_coeff*2))) if(character.client.prefs.be_special & BE_CHANGELING) if(!jobban_isbanned(character.client, "changeling") && !jobban_isbanned(character.client, "Syndicate")) - if(!(character.job in ticker.mode.restricted_jobs)) - character.mind.make_Changling() + if(age_check(character.client)) + if(!(character.job in ticker.mode.restricted_jobs)) + character.mind.make_Changling() ..() /datum/game_mode/proc/forge_changeling_objectives(var/datum/mind/changeling) diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index 6f13e670890..37535659afb 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -71,6 +71,7 @@ if(changelings.len <= (changelingcap - 2) || prob(100 / (config.changeling_scaling_coeff * 4))) if(character.client.prefs.be_special & BE_CHANGELING) if(!jobban_isbanned(character.client, "changeling") && !jobban_isbanned(character.client, "Syndicate")) - if(!(character.job in ticker.mode.restricted_jobs)) - character.mind.make_Changling() + if(age_check(character.client)) + if(!(character.job in ticker.mode.restricted_jobs)) + character.mind.make_Changling() ..() diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index ab63a288f26..b4abfb1c20d 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -29,6 +29,7 @@ required_players = 20 required_enemies = 6 recommended_enemies = 6 + enemy_minimum_age = 14 var/finished = 0 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 4940484f902..04fa08b5a57 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -31,6 +31,7 @@ var/datum/mind/sacrifice_target = null var/round_converted = 0 var/reroll_friendly //During mode conversion only these are in the running + var/enemy_minimum_age = 7 //How many days must players have been playing before they can play this antagonist var/const/waittime_l = 600 var/const/waittime_h = 1800 // started at 1800 @@ -225,7 +226,8 @@ if(player.client && player.ready) if(player.client.prefs.be_special & role) if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, roletext)) //Nodrak/Carn: Antag Job-bans - candidates += player.mind // Get a list of all the people who want to be the antagonist for this round + if(age_check(player.client)) //Must be older than the minimum age + candidates += player.mind // Get a list of all the people who want to be the antagonist for this round if(restricted_jobs) for(var/datum/mind/player in candidates) @@ -391,3 +393,22 @@ proc/display_roundstart_logout_report() text += ")" return text + +//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1 +/datum/game_mode/proc/age_check(client/C) + if(get_remaining_days(C) == 0) + return 1 //Available in 0 days = available right now = player is old enough to play. + return 0 + + +/datum/game_mode/proc/get_remaining_days(client/C) + if(!C) + return 0 + if(!config.use_age_restriction_for_jobs) + return 0 + if(!isnum(C.player_age)) + return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced + if(!isnum(enemy_minimum_age)) + return 0 + + return max(0, enemy_minimum_age - C.player_age) \ No newline at end of file diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index 8bbb539f6f4..6a687cab9ae 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -15,6 +15,7 @@ required_players = 20 required_enemies = 2 recommended_enemies = 4 + enemy_minimum_age = 14 var/finished = 0 var/checkwin_counter = 0 diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index eeb4e86d056..1e2e53f7661 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -9,6 +9,7 @@ required_enemies = 1 recommended_enemies = 1 pre_setup_before_jobs = 1 + enemy_minimum_age = 30 //Same as AI minimum age var/AI_win_timeleft = 5400 //started at 5400, in case I change this for testing round end. diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index a2a75543f92..afd98a9ab5d 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -10,6 +10,7 @@ recommended_enemies = 5 pre_setup_before_jobs = 1 antag_flag = BE_OPERATIVE + enemy_minimum_age = 14 var/const/agents_possible = 5 //If we ever need more syndicate agents. diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 20427ecc5df..6a493fbfd89 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -18,6 +18,7 @@ required_players = 20 required_enemies = 1 recommended_enemies = 3 + enemy_minimum_age = 14 var/finished = 0 var/check_counter = 0 diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 0fe48bda7f4..07fc56c7264 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -80,8 +80,9 @@ if(traitors.len <= (traitorcap - 2) || prob(100 / (config.traitor_scaling_coeff * 2))) if(character.client.prefs.be_special & BE_TRAITOR) if(!jobban_isbanned(character.client, "traitor") && !jobban_isbanned(character.client, "Syndicate")) - if(!(character.job in ticker.mode.restricted_jobs)) - add_latejoin_traitor(character.mind) + if(age_check(character.client)) + if(!(character.job in ticker.mode.restricted_jobs)) + add_latejoin_traitor(character.mind) ..() /datum/game_mode/traitor/proc/add_latejoin_traitor(var/datum/mind/character) diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index f2704347e88..e622a8811be 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -73,20 +73,22 @@ for(var/mob/dead/observer/G in player_list) if(G.client && !G.client.holder && !G.client.is_afk() && G.client.prefs.be_special & BE_WIZARD) if(!jobban_isbanned(G, "wizard") && !jobban_isbanned(G, "Syndicate")) - candidates += G + if(age_check(G.client)) + candidates += G if(!candidates.len) message_admins("No applicable ghosts for the next ragin' mage, asking ghosts instead.") var/time_passed = world.time for(var/mob/dead/observer/G in player_list) if(!jobban_isbanned(G, "wizard") && !jobban_isbanned(G, "Syndicate")) - spawn(0) - switch(alert(G, "Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. + if(age_check(G.client)) + spawn(0) + switch(alert(G, "Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","Yes","No")) + if("Yes") + if((world.time-time_passed)>300)//If more than 30 game seconds passed. + continue + candidates += G + if("No") continue - candidates += G - if("No") - continue sleep(300) if(!candidates.len) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 95242dadc3e..c091c9c3f02 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -9,6 +9,7 @@ required_enemies = 1 recommended_enemies = 1 pre_setup_before_jobs = 1 + enemy_minimum_age = 14 var/use_huds = 0 var/finished = 0 diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 422b26ec36d..2083034a1f9 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -75,8 +75,9 @@ client/proc/one_click_antag() if(applicant.mind) if (!applicant.mind.special_role) if(!jobban_isbanned(applicant, "traitor") && !jobban_isbanned(applicant, "Syndicate")) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant + if(temp.age_check(applicant.client)) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant if(candidates.len) var/numTraitors = min(candidates.len, 3) @@ -110,8 +111,9 @@ client/proc/one_click_antag() if(applicant.mind) if (!applicant.mind.special_role) if(!jobban_isbanned(applicant, "changeling") && !jobban_isbanned(applicant, "Syndicate")) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant + if(temp.age_check(applicant.client)) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant if(candidates.len) var/numChanglings = min(candidates.len, 3) @@ -143,8 +145,9 @@ client/proc/one_click_antag() if(applicant.mind) if(!applicant.mind.special_role) if(!jobban_isbanned(applicant, "revolutionary") && !jobban_isbanned(applicant, "Syndicate")) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant + if(temp.age_check(applicant.client)) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant if(candidates.len) var/numRevs = min(candidates.len, 3) @@ -158,22 +161,24 @@ client/proc/one_click_antag() return 0 /datum/admins/proc/makeWizard() + var/datum/game_mode/wizard/temp = new var/list/mob/dead/observer/candidates = list() var/mob/dead/observer/theghost = null var/time_passed = world.time for(var/mob/dead/observer/G in player_list) if(!jobban_isbanned(G, "wizard") && !jobban_isbanned(G, "Syndicate")) - spawn(0) - switch(alert(G, "Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. + if(temp.age_check(G.client)) + spawn(0) + switch(alert(G, "Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","Yes","No")) + if("Yes") + if((world.time-time_passed)>300)//If more than 30 game seconds passed. + return + candidates += G + if("No") + return + else return - candidates += G - if("No") - return - else - return sleep(300) @@ -211,8 +216,9 @@ client/proc/one_click_antag() if(applicant.mind) if(!applicant.mind.special_role) if(!jobban_isbanned(applicant, "cultist") && !jobban_isbanned(applicant, "Syndicate")) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant + if(temp.age_check(applicant.client)) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant if(candidates.len) var/numCultists = min(candidates.len, 4) @@ -231,6 +237,7 @@ client/proc/one_click_antag() /datum/admins/proc/makeNukeTeam() + var/datum/game_mode/nuclear/temp = new var/list/mob/dead/observer/candidates = list() var/list/mob/dead/observer/chosen = list() var/mob/dead/observer/theghost = null @@ -238,16 +245,17 @@ client/proc/one_click_antag() for(var/mob/dead/observer/G in player_list) if(!jobban_isbanned(G, "operative") && !jobban_isbanned(G, "Syndicate")) - spawn(0) - switch(alert(G,"Do you wish to be considered for a nuke team being sent in?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. + if(temp.age_check(G.client)) + spawn(0) + switch(alert(G,"Do you wish to be considered for a nuke team being sent in?","Please answer in 30 seconds!","Yes","No")) + if("Yes") + if((world.time-time_passed)>300)//If more than 30 game seconds passed. + return + candidates += G + if("No") + return + else return - candidates += G - if("No") - return - else - return sleep(300) @@ -414,8 +422,9 @@ client/proc/one_click_antag() if(applicant.mind) if(!applicant.mind.special_role) if(!jobban_isbanned(applicant, "gangster") && !jobban_isbanned(applicant, "Syndicate")) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant + if(temp.age_check(applicant.client)) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant if(candidates.len >= 2) H = pick(candidates) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 402b5698577..523bdb74165 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -2,22 +2,20 @@ var/list/preferences_datums = list() -#define IS_MODE_COMPILED(MODE) (ispath(text2path("/datum/game_mode/"+(MODE)))) - var/global/list/special_roles = list( //keep synced with the defines BE_* in setup.dm //some autodetection here. - "traitor" = IS_MODE_COMPILED("traitor"), // 0 - "operative" = IS_MODE_COMPILED("nuclear"), // 1 - "changeling" = IS_MODE_COMPILED("changeling"), // 2 - "wizard" = IS_MODE_COMPILED("wizard"), // 3 - "malf AI" = IS_MODE_COMPILED("malfunction"), // 4 - "revolutionary" = IS_MODE_COMPILED("revolution"), // 5 - "alien" = 1, //always show // 6 - "pAI candidate" = 1, // 7 - "cultist" = IS_MODE_COMPILED("cult"), // 8 - "blob" = IS_MODE_COMPILED("blob"), // 9 - "monkey" = IS_MODE_COMPILED("monkey"), // 10 - "gangster" = IS_MODE_COMPILED("gang") // 11 + "traitor" = /datum/game_mode/traitor, //0 + "operative" = /datum/game_mode/nuclear, //1 + "changeling" = /datum/game_mode/changeling, //2 + "wizard" = /datum/game_mode/wizard, //3 + "malf AI" = /datum/game_mode/malfunction, //4 + "revolutionary" = /datum/game_mode/revolution, //5 + "alien", //6 + "pAI", //7 + "cultist" = /datum/game_mode/cult, //8 + "blob" = /datum/game_mode/blob, //9 + "monkey" = /datum/game_mode/monkey, //10 + "gangster" = /datum/game_mode/gang //11 ) @@ -250,17 +248,23 @@ datum/preferences dat += "