From 707b6caa1e9a3da4898ca79e43e5b80ca9093695 Mon Sep 17 00:00:00 2001 From: Ren Erthilo Date: Wed, 25 Apr 2012 00:35:54 +0100 Subject: [PATCH] TG: Integrated BS12's improved uplink code, courtesy of SkyMarshal. This means items now spawn in your hand if possible, items are sorted into categories, and only items you have enough telecrystals to purchase will be displayed. Also, the same basic code is now used for PDA, headset and nuke- round uplinks, and it should be easier to add new items. Revision: r3216 Author: musketstgstation --- code/game/gamemodes/cult/cult.dm | 55 +++++++++++++------- code/game/gamemodes/meteor/meteor.dm | 4 +- code/game/gamemodes/nuclear/nuclear.dm | 14 ++--- code/game/gamemodes/revolution/revolution.dm | 4 ++ code/game/gamemodes/sandbox/sandbox.dm | 3 -- code/game/gamemodes/traitor/traitor.dm | 10 ++++ code/game/gamemodes/wizard/wizard.dm | 4 ++ code/game/jobs/job_controller.dm | 51 +++++++++++++++--- code/modules/mob/living/say.dm | 9 +++- 9 files changed, 113 insertions(+), 41 deletions(-) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index b528394a39d..938a8ec180a 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -9,10 +9,10 @@ /proc/is_convertable_to_cult(datum/mind/mind) if(!istype(mind)) return 0 - //This makes security unconvertable. *comments out* -/* for(var/obj/item/weapon/implant/loyalty/L in mind.current) +/* if(istype(mind.current, /mob/living/carbon/human) && (mind.assigned_role in list("Captain", "Head of Security", "Security Officer", "Detective", "Chaplain", "Warden"))) return 0 + for(var/obj/item/weapon/implant/loyalty/L in mind.current) if(L && L.implanted) - return 0 */ + return 0*/ return 1 @@ -20,10 +20,14 @@ name = "cult" config_tag = "cult" restricted_jobs = list("AI", "Cyborg") +// protected_jobs = list("Security Officer", "Warden", "Detective", "Captain", "Head of Security") required_players = 3 required_enemies = 3 recommended_enemies = 4 + uplink_welcome = "Nar-Sie Uplink Console:" + uplink_uses = 10 + var/datum/mind/sacrifice_target = null var/finished = 0 var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) @@ -40,9 +44,6 @@ var/const/max_cultists_to_start = 4 var/acolytes_survived = 0 - uplink_welcome = "Nar-Sie Uplink Console:" - uplink_uses = 10 - /datum/game_mode/cult/announce() world << "The current game mode is - Cult!" @@ -50,6 +51,15 @@ /datum/game_mode/cult/pre_setup() + if(prob(50) || num_players() < 10) // don't give summon nar-sie if less than 10 people, it's literally impossible in that case! + objectives += "survive" + objectives += "sacrifice" + else + objectives += "eldergod" + objectives += "sacrifice" + + if(config.protect_roles_from_antagonist) + restricted_jobs += protected_jobs var/list/cultists_possible = get_players_for_role(BE_CULTIST) for(var/datum/mind/player in cultists_possible) @@ -64,26 +74,18 @@ cultists_possible -= cultist cult += cultist - // don't give summon nar-sie if less than 10 people, - // it's literally impossible in that case! - if(prob(50) || num_players() < 10) - objectives += "survive" - objectives += "sacrifice" - else - objectives += "eldergod" - objectives += "sacrifice" - return (cult.len>0) /datum/game_mode/cult/post_setup() modePlayer += cult if("sacrifice" in objectives) - var/list/possible_targets = list() + var/list/possible_targets = get_unconvertables() - for(var/mob/living/carbon/human/player in world) - if(player.mind && !(player.mind in cult)) - possible_targets += player.mind + if(!possible_targets.len) + for(var/mob/living/carbon/human/player in world) + if(player.mind && !(player.mind in cult)) + possible_targets += player.mind if(possible_targets.len > 0) sacrifice_target = pick(possible_targets) @@ -254,6 +256,14 @@ del(I) +/datum/game_mode/cult/proc/get_unconvertables() + var/list/ucs = list() + for(var/mob/living/carbon/human/player in world) + if(!is_convertable_to_cult(player.mind)) + ucs += player.mind + return ucs + + /datum/game_mode/cult/proc/check_cult_victory() var/cult_fail = 0 if(objectives.Find("survive")) @@ -301,23 +311,30 @@ if("survive") if(!check_survive()) explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. \green Success!" + //feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]") else explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. \red Failed." + //feedback_add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]") if("sacrifice") if(!sacrifice_target) explanation = "Free objective" else if(sacrificed.Find(sacrifice_target)) explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.role_alt_title ? sacrifice_target.role_alt_title : sacrifice_target.assigned_role]. \green Success!" + //feedback_add_details("cult_objective","cult_sacrifice|SUCCESS") else if(sacrifice_target && sacrifice_target.current) explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.role_alt_title ? sacrifice_target.role_alt_title : sacrifice_target.assigned_role]. \red Failed." + //feedback_add_details("cult_objective","cult_sacrifice|FAIL") else explanation = "Sacrifice Unknown, the Unknown whos body was likely gibbed. \red Failed." + //feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED") if("eldergod") if(!eldergod) explanation = "Summon Nar-Sie. \green Success!" + //feedback_add_details("cult_objective","cult_narsie|SUCCESS") else explanation = "Summon Nar-Sie. \red Failed." + //feedback_add_details("cult_objective","cult_narsie|FAIL") world << "Objective #[obj_count]: [explanation]" ..() diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 76113946fba..94dfc03b75c 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -52,8 +52,8 @@ else survivors[player.real_name] = "alive" - feedback_set_details("round_end_result","end - evacuation") - feedback_set("round_end_result",survivors.len) + //feedback_set_details("round_end_result","end - evacuation") + //feedback_set("round_end_result",survivors.len) if (survivors.len) world << "\blue The following survived the meteor attack!" diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 2f86ac6568d..fd090b36c09 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -132,9 +132,9 @@ if(!leader_selected) prepare_syndicate_leader(synd_mind, nuke_code) leader_selected = 1 - //else - //synd_mind.current.real_name = "[syndicate_name()] Operative #[agent_number]" - //agent_number++ +/* else + synd_mind.current.real_name = "[syndicate_name()] Operative #[agent_number]" + agent_number++*/ equip_syndicate(synd_mind.current,freq) update_synd_icons_added(synd_mind) @@ -166,10 +166,10 @@ /datum/game_mode/proc/prepare_syndicate_leader(var/datum/mind/synd_mind, var/nuke_code) - // var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") - // spawn(1) // don't change names anymore! - // NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen - //synd_mind.current.real_name = "[syndicate_name()] [leader_title]" +/* var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") + spawn(1) + NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen + synd_mind.current.real_name = "[syndicate_name()] [leader_title]"*/ if (nuke_code) synd_mind.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) synd_mind.current << "The nuclear authorization code is: [nuke_code]" diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 04d534826dd..bf996b30ee1 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -40,6 +40,10 @@ //Gets the round setup, cancelling if there's not enough players at the start// /////////////////////////////////////////////////////////////////////////////// /datum/game_mode/revolution/pre_setup() + + if(config.protect_roles_from_antagonist) + restricted_jobs += protected_jobs + var/list/datum/mind/possible_headrevs = get_players_for_role(BE_REV) var/head_check = 0 diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm index e6f51b9dacb..f3c83149600 100644 --- a/code/game/gamemodes/sandbox/sandbox.dm +++ b/code/game/gamemodes/sandbox/sandbox.dm @@ -15,9 +15,6 @@ for(var/mob/M in world) if(M.client) M.CanBuild() - -// setup_sectors() -// spawn_exporation_packs() return 1 /datum/game_mode/sandbox/check_finished() diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index f2a79377d8d..87c782a3dec 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -6,6 +6,7 @@ name = "traitor" config_tag = "traitor" restricted_jobs = list("Cyborg", "AI")//Approved by headmins for a week test, if you see this it would be nice if you didn't spread it everywhere +// protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") required_players = 0 required_enemies = 1 recommended_enemies = 4 @@ -29,6 +30,10 @@ /datum/game_mode/traitor/pre_setup() + + if(config.protect_roles_from_antagonist) + restricted_jobs += protected_jobs + var/list/possible_traitors = get_players_for_role(BE_TRAITOR) // stop setup if no possible traitors @@ -118,6 +123,7 @@ /datum/game_mode/traitor/declare_completion() + ..() return//Traitors will be checked as part of check_extra_completion. Leaving this here as a reminder. @@ -166,15 +172,19 @@ for(var/datum/objective/objective in traitor.objectives) if(objective.check_completion()) world << "Objective #[count]: [objective.explanation_text] \green Success" + //feedback_add_details("traitor_objective","[objective.type]|SUCCESS") else world << "Objective #[count]: [objective.explanation_text] \red Failed" + //feedback_add_details("traitor_objective","[objective.type]|FAIL") traitorwin = 0 count++ if(traitorwin) world << "The [special_role_text] was successful!" + //feedback_add_details("traitor_success","SUCCESS") else world << "The [special_role_text] has failed!" + //feedback_add_details("traitor_success","FAIL") return 1 diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 9ae136270a6..2fc32363892 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -183,15 +183,19 @@ for(var/datum/objective/objective in wizard.objectives) if(objective.check_completion()) world << "Objective #[count]: [objective.explanation_text] \green Success" + //feedback_add_details("wizard_objective","[objective.type]|SUCCESS") else world << "Objective #[count]: [objective.explanation_text] \red Failed" + //feedback_add_details("wizard_objective","[objective.type]|FAIL") wizardwin = 0 count++ if(wizard.current && wizard.current.stat!=2 && wizardwin) world << "The wizard was successful!" + //feedback_add_details("wizard_success","SUCCESS") else world << "The wizard has failed!" + //feedback_add_details("wizard_success","FAIL") return 1 //OTHER PROCS diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 0f079a9ffed..f926b53445e 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -4,7 +4,6 @@ var/global/datum/controller/occupations/job_master var //List of all jobs list/occupations = list() - list/occupations2 = list() //Players who need jobs list/unassigned = list() //Debug info @@ -28,6 +27,8 @@ var/global/datum/controller/occupations/job_master if(!job) continue if(job.faction != faction) continue occupations += job + + return 1 @@ -151,6 +152,8 @@ var/global/datum/controller/occupations/job_master Debug("Running DO") SetupOccupations() + occupations = shuffle(occupations) //Shuffles job-list at round start so that people don't have their job picks randomized + //Get the players who are ready for(var/mob/new_player/player in world) if((player) && (player.client) && (player.ready) && (player.mind) && (!player.mind.assigned_role)) @@ -160,7 +163,8 @@ var/global/datum/controller/occupations/job_master if(unassigned.len == 0) return 0 //Shuffle players and jobs unassigned = shuffle(unassigned) - occupations2 = shuffle(occupations) + + //HandleFeedbackGathering() //Assistants are checked first Debug("DO, Running Assistant Check 1") @@ -186,11 +190,14 @@ var/global/datum/controller/occupations/job_master //Other jobs are now checked Debug("DO, Running Standard Check") for(var/level = 1 to 3) - for(var/datum/job/job in occupations2) + for(var/datum/job/job in occupations) Debug("Checking job: [job]") - if(!job) continue - if(!unassigned.len) break - if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1) continue + if(!job) + continue + if(!unassigned.len) + break + if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1) + continue var/list/candidates = FindOccupationCandidates(job, level) while(candidates.len && ((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)) var/mob/new_player/candidate = pick(candidates) @@ -294,7 +301,7 @@ var/global/datum/controller/occupations/job_master if(!H.equip_if_possible(new /obj/item/weapon/pen(H), H.slot_r_store)) H.equip_if_possible(new /obj/item/weapon/pen(H), H.slot_ears) H.equip_if_possible(new /obj/item/device/pda(H), H.slot_belt) - if(locate(/obj/item/device/pda,H))//I bet this could just use locate + if(locate(/obj/item/device/pda,H))//I bet this could just use locate. It can --SkyMarshal var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H) pda.owner = H.real_name pda.ownjob = H.wear_id.assignment @@ -344,4 +351,32 @@ var/global/datum/controller/occupations/job_master if(name == "AI" || name == "Cyborg")//I dont like this here but it will do for now J.total_positions = 0 - return 1 \ No newline at end of file + return 1 + +/* + proc/HandleFeedbackGathering() + for(var/datum/job/job in occupations) + var/tmp_str = "|[job.title]|" + + var/level1 = 0 //high + var/level2 = 0 //medium + var/level3 = 0 //low + var/level4 = 0 //never + var/level5 = 0 //banned + for(var/mob/new_player/player in world) + if(!((player) && (player.client) && (player.ready) && (player.mind) && (!player.mind.assigned_role))) + continue //This player is not ready + if(jobban_isbanned(player, job.title)) + level5++ + continue + if(player.preferences.GetJobDepartment(job, 1) & job.flag) + level1++ + else if(player.preferences.GetJobDepartment(job, 2) & job.flag) + level2++ + else if(player.preferences.GetJobDepartment(job, 3) & job.flag) + level3++ + else level4++ //not selected + + tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|-" + feedback_add_details("job_preferences",tmp_str) +*/ \ No newline at end of file diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 16ebc0e5699..c6d1d0e5472 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -319,8 +319,6 @@ for (var/O in listening) world << O var/list/V = view(message_range, T) - var/list/W = V - //find mobs in lockers, cryo, intellicards, brains, MMIs, and so on. for (var/mob/M in world) if (!M.client) @@ -378,6 +376,13 @@ if(O && !istype(O.loc, /obj/item/weapon/storage)) O.hear_talk(src, message) + +/* Commented out as replaced by code above from BS12 + for (var/obj/O in ((V | contents)-used_radios)) //radio in pocket could work, radio in backpack wouldn't --rastaf0 + spawn (0) + if (O) + O.hear_talk(src, message) +*/ if(isbrain(src))//For brains to properly talk if they are in an MMI..or in a brain. Could be extended to other mobs I guess. for(var/obj/O in loc)//Kinda ugly but whatever. if(O)