From e503eade0f4f953d737e75455bc6f2841083dc11 Mon Sep 17 00:00:00 2001 From: Kyep Date: Fri, 29 Dec 2017 14:10:40 -0800 Subject: [PATCH 01/47] Tweaks --- code/modules/admin/verbs/striketeam.dm | 95 ++++++++++++------- .../modules/mob/living/silicon/robot/robot.dm | 37 +++----- 2 files changed, 72 insertions(+), 60 deletions(-) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index b2a803cfdb7..dc43b3d90b7 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -12,7 +12,7 @@ var/global/sent_strike_team = 0 return if(alert("Do you want to send in the CentComm death squad? Once enabled, this is irreversible.",,"Yes","No")!="Yes") return - alert("This 'mode' will go on until everyone is dead or the station is destroyed. You may also admin-call the evac shuttle when appropriate. Spawned commandos have internals cameras which are viewable through a monitor inside the Spec. Ops. Office. Assigning the team's detailed task is recommended from there. While you will be able to manually pick the candidates from active ghosts, their assignment in the squad will be random.") + alert("This 'mode' will go on until everyone is dead or the station is destroyed. You may also admin-call the evac shuttle when appropriate. Spawned commandos have internals cameras which are viewable through a monitor inside the Spec. Ops. Office. The first one selected/spawned will be the team leader.") var/input = null while(!input) @@ -29,9 +29,9 @@ var/global/sent_strike_team = 0 shuttle_master.cancelEvac() var/commando_number = commandos_possible //for selecting a leader - var/leader_selected = 0 //when the leader is chosen. The last person spawned. + var/is_leader = TRUE // set to FALSE after leader is spawned -//Code for spawning a nuke auth code. + //Code for spawning a nuke auth code. var/nuke_code var/temp_code for(var/obj/machinery/nuclearbomb/N in world) @@ -40,11 +40,11 @@ var/global/sent_strike_team = 0 nuke_code = N.r_code break -//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos. + //Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos. var/list/candidates = list() //candidates for being a commando out of all the active ghosts in world. var/list/commandos = list() //actual commando ghosts as picked by the user. for(var/mob/dead/observer/G in player_list) - if(!G.client.holder && !G.client.is_afk()) //Whoever called/has the proc won't be added to the list. + if(!G.client.is_afk()) if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) candidates += G.key for(var/i=commandos_possible,(i>0&&candidates.len),i--)//Decrease with every commando selected. @@ -52,30 +52,59 @@ var/global/sent_strike_team = 0 candidates -= candidate //Subtract from candidates. commandos += candidate//Add their ghost to commandos. -//Spawns commandos and equips them. + //Spawns commandos and equips them. for(var/obj/effect/landmark/L in landmarks_list) if(commando_number<=0) break if(L.name == "Commando") - leader_selected = commando_number == 1?1:0 - var/mob/living/carbon/human/new_commando = create_death_commando(L, leader_selected) + spawn(0) + var/use_ds_borg = FALSE + var/ghost_key // Ghost that we intend to put into the commando. Can remain undefined if we don't have one. + if(commandos.len) + ghost_key = pick(commandos) + commandos -= ghost_key + if(!is_leader) + var/new_gender = alert(src, "Select Deathsquad Type.", "DS Character Generation", "Organic", "Cyborg") + if(new_gender == "Cyborg") + use_ds_borg = TRUE - if(commandos.len) - new_commando.key = pick(commandos) - commandos -= new_commando.key - new_commando.internal = new_commando.s_store - new_commando.update_action_buttons_icon() - - //So they don't forget their code or mission. - if(nuke_code) - new_commando.mind.store_memory("Nuke Code: [nuke_code].") - new_commando.mind.store_memory("Mission: [input].") - - to_chat(new_commando, "You are a Special Ops. [!leader_selected ? "commando" : "LEADER"] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: [input]") + if(use_ds_borg) + var/mob/living/silicon/robot/deathsquad/R = new() + R.forceMove(get_turf(L)) + var/rnum = rand(1,1000) + var/borgname = "Specops [rnum]" + R.name = borgname + R.custom_name = borgname + R.real_name = R.name + R.mind = new + R.mind.current = R + R.mind.original = R + R.mind.assigned_role = "MODE" + R.mind.special_role = SPECIAL_ROLE_DEATHSQUAD + if(!(R.mind in ticker.minds)) + ticker.minds += R.mind + ticker.mode.traitors += R.mind + if(ghost_key) + R.key = ghost_key + if(nuke_code) + R.mind.store_memory("Nuke Code: [nuke_code].") + R.mind.store_memory("Mission: [input].") + to_chat(R, "You are a Special Operations cyborg, in the service of Central Command. \nYour current mission is: [input]") + else + var/mob/living/carbon/human/new_commando = create_death_commando(L, is_leader) + if(ghost_key) + new_commando.key = ghost_key + new_commando.internal = new_commando.s_store + new_commando.update_action_buttons_icon() + if(nuke_code) + new_commando.mind.store_memory("Nuke Code: [nuke_code].") + new_commando.mind.store_memory("Mission: [input].") + to_chat(new_commando, "You are a Special Ops [!is_leader ? "commando" : "TEAM LEADER"] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: [input]") + is_leader = FALSE commando_number-- -//Spawns the rest of the commando gear. + //Spawns the rest of the commando gear. for(var/obj/effect/landmark/L in landmarks_list) if(L.name == "Commando_Manual") //new /obj/item/weapon/gun/energy/pulse_rifle(L.loc) @@ -96,14 +125,14 @@ var/global/sent_strike_team = 0 log_admin("[key_name(usr)] used Spawn Death Squad.") return 1 -/client/proc/create_death_commando(obj/spawn_location, leader_selected = 0) +/client/proc/create_death_commando(obj/spawn_location, is_leader = FALSE) var/mob/living/carbon/human/new_commando = new(spawn_location.loc) var/commando_leader_rank = pick("Lieutenant", "Captain", "Major") var/commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major") var/commando_name = pick(last_names) var/datum/preferences/A = new()//Randomize appearance for the commando. - if(leader_selected) + if(is_leader) A.age = rand(35,45) A.real_name = "[commando_leader_rank] [commando_name]" else @@ -117,18 +146,15 @@ var/global/sent_strike_team = 0 new_commando.mind.assigned_role = "MODE" new_commando.mind.special_role = SPECIAL_ROLE_DEATHSQUAD ticker.mode.traitors |= new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list. - new_commando.equip_death_commando(leader_selected) + new_commando.equip_death_commando(is_leader) return new_commando -/mob/living/carbon/human/proc/equip_death_commando(leader_selected = 0) +/mob/living/carbon/human/proc/equip_death_commando(is_leader = FALSE) var/obj/item/device/radio/R = new /obj/item/device/radio/headset/alt(src) R.set_frequency(DTH_FREQ) equip_to_slot_or_del(R, slot_l_ear) - if(leader_selected == 0) - equip_to_slot_or_del(new /obj/item/clothing/under/color/green(src), slot_w_uniform) - else - equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(src), slot_w_uniform) + equip_to_slot_or_del(new /obj/item/clothing/under/color/black(src), slot_w_uniform) equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(src), slot_shoes) equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad(src), slot_wear_suit) equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(src), slot_gloves) @@ -143,12 +169,11 @@ var/global/sent_strike_team = 0 equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack) equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(src), slot_in_backpack) equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack) - if(!leader_selected) - equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(src), slot_in_backpack) - else - equip_to_slot_or_del(new /obj/item/weapon/pinpointer(src), slot_in_backpack) + if(is_leader) equip_to_slot_or_del(new /obj/item/weapon/disk/nuclear(src), slot_in_backpack) - + else + equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(src), slot_in_backpack) + equip_to_slot_or_del(new /obj/item/weapon/pinpointer(src), slot_in_backpack) equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(src), slot_l_store) equip_to_slot_or_del(new /obj/item/weapon/shield/energy(src), slot_r_store) equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store) @@ -156,6 +181,8 @@ var/global/sent_strike_team = 0 equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse(src), slot_r_hand) + var/obj/item/organ/internal/cyberimp/brain/anti_drop/O = new /obj/item/organ/internal/cyberimp/brain/anti_drop() + O.insert(src) var/obj/item/weapon/implant/mindshield/L = new/obj/item/weapon/implant/mindshield(src) L.implant(src) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 7141e41363a..ee3e75450a4 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -50,6 +50,7 @@ var/list/robot_verbs_default = list( var/opened = 0 var/emagged = 0 + var/is_emaggable = TRUE var/list/force_modules = list() var/allow_rename = TRUE @@ -752,7 +753,9 @@ var/list/robot_verbs_default = list( return var/mob/living/M = user if(!opened)//Cover is closed - if(locked) + if(!is_emaggable) + to_chat(user, "The emag sparks, and flashes red. This mechanism does not appear to be emaggable.") + else if(locked) to_chat(user, "You emag the cover lock.") locked = 0 else @@ -1336,16 +1339,17 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/deathsquad base_icon = "nano_bloodhound" icon_state = "nano_bloodhound" + designation = "SpecOps" lawupdate = 0 scrambledcodes = 1 - pdahide = 1 - modtype = "Commando" - faction = list("nanotrasen") - designation = "Nanotrasen Combat" req_access = list(access_cent_specops) ionpulse = 1 magpulse = 1 - var/searching_for_ckey = 0 + pdahide = 1 + allow_rename = FALSE + modtype = "Commando" + faction = list("nanotrasen") + is_emaggable = FALSE /mob/living/silicon/robot/deathsquad/New(loc) ..() @@ -1362,26 +1366,7 @@ var/list/robot_verbs_default = list( playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) -/mob/living/silicon/robot/deathsquad/attack_hand(mob/user) - if(isnull(ckey) && !searching_for_ckey) - searching_for_ckey = 1 - to_chat(user, "Now checking for possible borgs.") - var/list/borg_candidates = pollCandidates("Do you want to play as a Nanotrasen Combat borg?") - if(borg_candidates.len > 0 && isnull(ckey)) - searching_for_ckey = 0 - var/mob/M = pick(borg_candidates) - M.mind.transfer_to(src) - M.mind.assigned_role = "MODE" - M.mind.special_role = SPECIAL_ROLE_DEATHSQUAD - ticker.mode.traitors |= M.mind // Adds them to current traitor list. Which is really the extra antagonist list. - key = M.key - else - searching_for_ckey = 0 - to_chat(user, "Unable to connect to Central Command. Please wait and try again later.") - return - else - to_chat(user, "[src] is already checking for possible borgs.") - return + /mob/living/silicon/robot/syndicate base_icon = "syndie_bloodhound" From 52d097445a0f4ddf5941c721886325eef9754600 Mon Sep 17 00:00:00 2001 From: Kyep Date: Sat, 30 Dec 2017 10:18:31 -0800 Subject: [PATCH 02/47] borg names: Epsilon # --- code/modules/admin/verbs/striketeam.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index dc43b3d90b7..a152992c8af 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -72,7 +72,7 @@ var/global/sent_strike_team = 0 var/mob/living/silicon/robot/deathsquad/R = new() R.forceMove(get_turf(L)) var/rnum = rand(1,1000) - var/borgname = "Specops [rnum]" + var/borgname = "Epsilon [rnum]" R.name = borgname R.custom_name = borgname R.real_name = R.name From b37379491755d3fb5e3bd5a90074d6d7878b1e2b Mon Sep 17 00:00:00 2001 From: Kyep Date: Sat, 30 Dec 2017 12:01:27 -0800 Subject: [PATCH 03/47] DS borgs now have ear/eye protection --- code/modules/mob/living/silicon/robot/robot.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index ee3e75450a4..39d98b185ac 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -51,6 +51,8 @@ var/list/robot_verbs_default = list( var/opened = 0 var/emagged = 0 var/is_emaggable = TRUE + var/eye_protection = 0 + var/ear_protection = 0 var/list/force_modules = list() var/allow_rename = TRUE @@ -1346,6 +1348,8 @@ var/list/robot_verbs_default = list( ionpulse = 1 magpulse = 1 pdahide = 1 + eye_protection = 2 // Immunity to flashes and the visual part of flashbangs + ear_protection = 1 // Immunity to the audio part of flashbangs allow_rename = FALSE modtype = "Commando" faction = list("nanotrasen") @@ -1509,3 +1513,9 @@ var/list/robot_verbs_default = list( var/static/all_borg_icon_states = icon_states('icons/mob/custom_synthetic/custom-synthetic.dmi') if(spritename in all_borg_icon_states) . = TRUE + +/mob/living/silicon/robot/check_eye_prot() + return eye_protection + +/mob/living/silicon/robot/check_ear_prot() + return ear_protection \ No newline at end of file From 9e8aa9cecbd1e527c5a9dd90f68827cba0f3d13d Mon Sep 17 00:00:00 2001 From: Kyep Date: Sat, 30 Dec 2017 14:21:08 -0800 Subject: [PATCH 04/47] willing player checks, SST tidy-up/parity/refactor, 'font' removals --- code/__DEFINES/role_preferences.dm | 1 + code/__HELPERS/game.dm | 14 ++++ code/game/jobs/job_exp.dm | 3 +- code/modules/admin/verbs/striketeam.dm | 48 ++++++------ .../admin/verbs/striketeam_syndicate.dm | 74 +++++++++---------- 5 files changed, 71 insertions(+), 69 deletions(-) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 257e12f4093..adb645fe112 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -40,6 +40,7 @@ #define ROLE_NYMPH "Dionaea" #define ROLE_GSPIDER "giant spider" #define ROLE_DRONE "drone" +#define ROLE_DEATHSQUAD "deathsquad" //Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //The gamemode specific ones are just so the gamemodes can query whether a player is old enough diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 082d473010d..29ecdca0ef3 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -490,6 +490,20 @@ proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time = return candidates +/proc/pollCandidatesByKeyWithVeto(adminclient, adminusr, max_slots, Question, be_special_type, antag_age_check = 0, poll_time = 300, ignore_respawnability = 0, min_hours = 0) + var/list/willing_ghosts = pollCandidates(Question, be_special_type, antag_age_check, poll_time, ignore_respawnability, min_hours) + var/list/candidate_ckeys = list() + var/list/selected_ckeys = list() + if(!willing_ghosts.len) + return selected_ckeys + for(var/mob/dead/observer/G in willing_ghosts) + candidate_ckeys += G.key + for(var/i = max_slots, (i > 0 && candidate_ckeys.len), i--) + var/this_ckey = input("Pick players. This will go on until there either no more ghosts to pick from or the slots are full.", "Candidates") as null|anything in candidate_ckeys + candidate_ckeys -= this_ckey + selected_ckeys += this_ckey + return selected_ckeys + /proc/window_flash(client/C) if(ismob(C)) var/mob/M = C diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index 3c17c6f0107..552654245dd 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -1,11 +1,12 @@ // Playtime requirements for special roles (hours) var/global/list/role_playtime_requirements = list( - // CREW-FRIENDLY ROLES + // NT ROLES ROLE_PAI = 0, ROLE_POSIBRAIN = 5, // Same as cyborg job. ROLE_SENTIENT = 5, ROLE_ERT = 10, // High, because they're team-based, and we want ERT to be robust + ROLE_DEATHSQUAD = 10, ROLE_TRADER = 5, ROLE_DRONE = 10, // High, because they're like mini engineering cyborgs that can ignore the AI, ventcrawl, and respawn themselves diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index a152992c8af..be49d81ca64 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -5,15 +5,17 @@ var/global/sent_strike_team = 0 /client/proc/strike_team() if(!ticker) - to_chat(usr, "The game hasn't started yet!") + to_chat(usr, "The game hasn't started yet!") return if(sent_strike_team == 1) - to_chat(usr, "CentComm is already sending a team.") + to_chat(usr, "CentComm is already sending a team.") return if(alert("Do you want to send in the CentComm death squad? Once enabled, this is irreversible.",,"Yes","No")!="Yes") return alert("This 'mode' will go on until everyone is dead or the station is destroyed. You may also admin-call the evac shuttle when appropriate. Spawned commandos have internals cameras which are viewable through a monitor inside the Spec. Ops. Office. The first one selected/spawned will be the team leader.") + message_admins("[key_name_admin(usr)] has started to spawn a CentComm DeathSquad.", 1) + var/input = null while(!input) input = sanitize(copytext(input(src, "Please specify which mission the death commando squad shall undertake.", "Specify Mission", ""),1,MAX_MESSAGE_LEN)) @@ -25,13 +27,7 @@ var/global/sent_strike_team = 0 to_chat(usr, "Looks like someone beat you to it.") return - sent_strike_team = 1 - - shuttle_master.cancelEvac() - var/commando_number = commandos_possible //for selecting a leader - var/is_leader = TRUE // set to FALSE after leader is spawned - - //Code for spawning a nuke auth code. + // Find the nuclear auth code var/nuke_code var/temp_code for(var/obj/machinery/nuclearbomb/N in world) @@ -40,29 +36,27 @@ var/global/sent_strike_team = 0 nuke_code = N.r_code break - //Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos. - var/list/candidates = list() //candidates for being a commando out of all the active ghosts in world. - var/list/commandos = list() //actual commando ghosts as picked by the user. - for(var/mob/dead/observer/G in player_list) - if(!G.client.is_afk()) - if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) - candidates += G.key - for(var/i=commandos_possible,(i>0&&candidates.len),i--)//Decrease with every commando selected. - var/candidate = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates //It will auto-pick a person when there is only one candidate. - candidates -= candidate //Subtract from candidates. - commandos += candidate//Add their ghost to commandos. + // Find ghosts willing to be DS + var/list/commando_ckeys = pollCandidatesByKeyWithVeto(src, usr, commandos_possible, "Join the DeathSquad?",, 21, 600, 1, role_playtime_requirements[ROLE_DEATHSQUAD]) + if(!commando_ckeys.len) + to_chat(usr, "Nobody volunteered to join the DeathSquad.") + return - //Spawns commandos and equips them. + sent_strike_team = 1 + + // Spawns commandos and equips them. + var/commando_number = commandos_possible //for selecting a leader + var/is_leader = TRUE // set to FALSE after leader is spawned for(var/obj/effect/landmark/L in landmarks_list) if(commando_number<=0) break if(L.name == "Commando") spawn(0) var/use_ds_borg = FALSE - var/ghost_key // Ghost that we intend to put into the commando. Can remain undefined if we don't have one. - if(commandos.len) - ghost_key = pick(commandos) - commandos -= ghost_key + var/ghost_key // Ghost ckey that we intend to put into the commando. Can remain undefined if we don't have one. + if(commando_ckeys.len) + ghost_key = pick(commando_ckeys) + commando_ckeys -= ghost_key if(!is_leader) var/new_gender = alert(src, "Select Deathsquad Type.", "DS Character Generation", "Organic", "Cyborg") if(new_gender == "Cyborg") @@ -99,7 +93,7 @@ var/global/sent_strike_team = 0 if(nuke_code) new_commando.mind.store_memory("Nuke Code: [nuke_code].") new_commando.mind.store_memory("Mission: [input].") - to_chat(new_commando, "You are a Special Ops [!is_leader ? "commando" : "TEAM LEADER"] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: [input]") + to_chat(new_commando, "You are a Special Ops [is_leader ? "TEAM LEADER" : "commando"] in the service of Central Command. Check the table ahead for detailed instructions.\nYour current mission is: [input]") is_leader = FALSE commando_number-- @@ -121,7 +115,7 @@ var/global/sent_strike_team = 0 new /obj/effect/spawner/newbomb/timer/syndicate(L.loc) qdel(L) - message_admins("[key_name_admin(usr)] has spawned a CentComm strike squad.", 1) + message_admins("[key_name_admin(usr)] has spawned a CentComm DeathSquad.", 1) log_admin("[key_name(usr)] used Spawn Death Squad.") return 1 diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index 744db24ab85..9db6f9e6d3d 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -17,7 +17,9 @@ var/global/sent_syndicate_strike_team = 0 return if(alert("Do you want to send in the Syndicate Strike Team? Once enabled, this is irreversible.",,"Yes","No")=="No") return - alert("This 'mode' will go on until everyone is dead or the station is destroyed. You may also admin-call the evac shuttle when appropriate. Spawned syndicates have internals cameras which are viewable through a monitor inside the Syndicate Mothership Bridge. Assigning the team's detailed task is recommended from there. While you will be able to manually pick the candidates from active ghosts, their assignment in the squad will be random.") + alert("This 'mode' will go on until everyone is dead or the station is destroyed. You may also admin-call the evac shuttle when appropriate. Spawned syndicates have internals cameras which are viewable through a monitor inside the Syndicate Mothership Bridge. Assigning the team's detailed task is recommended from there. The first one selected/spawned will be the team leader.") + + message_admins("[key_name_admin(usr)] has started to spawn a Syndicate Strike Team.", 1) var/input = null while(!input) @@ -30,15 +32,10 @@ var/global/sent_syndicate_strike_team = 0 to_chat(src, "Looks like someone beat you to it.") return - sent_syndicate_strike_team = 1 - - //if(emergency_shuttle.can_recall()) - // emergency_shuttle.recall() //why, exactly? Admins can do this themselves. - var/syndicate_commando_number = syndicate_commandos_possible //for selecting a leader - var/syndicate_leader_selected = 0 //when the leader is chosen. The last person spawned. + var/is_leader = TRUE // set to FALSE after leader is spawned -//Code for spawning a nuke auth code. + // Find the nuclear auth code var/nuke_code var/temp_code for(var/obj/machinery/nuclearbomb/N in world) @@ -47,29 +44,23 @@ var/global/sent_syndicate_strike_team = 0 nuke_code = N.r_code break -//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos. - var/list/candidates = list() //candidates for being a commando out of all the active ghosts in world. - var/list/commandos = list() //actual commando ghosts as picked by the user. - for(var/mob/dead/observer/G in player_list) - if(!G.client.holder && !G.client.is_afk()) //Whoever called/has the proc won't be added to the list. - if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) - candidates += G.key - for(var/i=commandos_possible,(i>0&&candidates.len),i--)//Decrease with every commando selected. - var/candidate = input("Pick characters to spawn as the commandos. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates //It will auto-pick a person when there is only one candidate. - candidates -= candidate //Subtract from candidates. - commandos += candidate//Add their ghost to commandos. + // Find ghosts willing to be SST + var/list/commando_ckeys = pollCandidatesByKeyWithVeto(src, usr, syndicate_commandos_possible, "Join the Syndicate Strike Team?",, 21, 600, 1, role_playtime_requirements[ROLE_DEATHSQUAD]) + if(!commando_ckeys.len) + to_chat(usr, "Nobody volunteered to join the SST.") + return -//Spawns commandos and equips them. + sent_syndicate_strike_team = 1 + + //Spawns commandos and equips them. for(var/obj/effect/landmark/L in landmarks_list) if(syndicate_commando_number<=0) break if(L.name == "Syndicate-Commando") - syndicate_leader_selected = syndicate_commando_number == 1?1:0 + var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, is_leader) - var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, syndicate_leader_selected) - - if(commandos.len) - new_syndicate_commando.key = pick(commandos) - commandos -= new_syndicate_commando.key + if(commando_ckeys.len) + new_syndicate_commando.key = pick(commando_ckeys) + commando_ckeys -= new_syndicate_commando.key new_syndicate_commando.internal = new_syndicate_commando.s_store new_syndicate_commando.update_action_buttons_icon() @@ -78,8 +69,9 @@ var/global/sent_syndicate_strike_team = 0 new_syndicate_commando.mind.store_memory("Nuke Code: [nuke_code].") new_syndicate_commando.mind.store_memory("Mission: [input].") - to_chat(new_syndicate_commando, "You are an Elite Syndicate. [!syndicate_leader_selected ? "commando" : "LEADER"] in the service of the Syndicate. \nYour current mission is: [input]") + to_chat(new_syndicate_commando, "You are an Elite Syndicate [is_leader ? "TEAM LEADER" : "commando"] in the service of the Syndicate. \nYour current mission is: [input]") new_syndicate_commando.faction += "syndicate" + is_leader = FALSE syndicate_commando_number-- for(var/obj/effect/landmark/L in landmarks_list) @@ -91,14 +83,14 @@ var/global/sent_syndicate_strike_team = 0 log_admin("[key_name(usr)] used Spawn Syndicate Squad.") feedback_add_details("admin_verb","SDTHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/create_syndicate_death_commando(obj/spawn_location, syndicate_leader_selected = 0) +/client/proc/create_syndicate_death_commando(obj/spawn_location, is_leader = FALSE) var/mob/living/carbon/human/new_syndicate_commando = new(spawn_location.loc) var/syndicate_commando_leader_rank = pick("Lieutenant", "Captain", "Major") var/syndicate_commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major") var/syndicate_commando_name = pick(last_names) var/datum/preferences/A = new()//Randomize appearance for the commando. - if(syndicate_leader_selected) + if(is_leader) A.age = rand(35,45) A.real_name = "[syndicate_commando_leader_rank] [syndicate_commando_name]" else @@ -112,26 +104,26 @@ var/global/sent_syndicate_strike_team = 0 new_syndicate_commando.mind.assigned_role = "MODE" new_syndicate_commando.mind.special_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD ticker.mode.traitors |= new_syndicate_commando.mind //Adds them to current traitor list. Which is really the extra antagonist list. - new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected) + new_syndicate_commando.equip_syndicate_commando(is_leader) qdel(spawn_location) return new_syndicate_commando -/mob/living/carbon/human/proc/equip_syndicate_commando(syndicate_leader_selected = 0) +/mob/living/carbon/human/proc/equip_syndicate_commando(is_leader = FALSE) var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt/syndteam(src) R.set_frequency(SYNDTEAM_FREQ) equip_to_slot_or_del(R, slot_l_ear) equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(src), slot_w_uniform) equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_shoes) - if(!syndicate_leader_selected) - equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/strike(src), slot_wear_suit) - else + if(is_leader) equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red/strike(src), slot_wear_suit) - equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(src), slot_gloves) - if(!syndicate_leader_selected) - equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/strike(src), slot_head) else + equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/strike(src), slot_wear_suit) + equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(src), slot_gloves) + if(is_leader) equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/red/strike(src), slot_head) + else + equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/strike(src), slot_head) equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask) equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses) @@ -142,12 +134,12 @@ var/global/sent_syndicate_strike_team = 0 equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack) equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(src), slot_in_backpack) equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack) - if(!syndicate_leader_selected) - equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(src), slot_in_backpack) - equip_to_slot_or_del(new /obj/item/weapon/card/emag(src), slot_in_backpack) - else + if(is_leader) equip_to_slot_or_del(new /obj/item/weapon/pinpointer(src), slot_in_backpack) equip_to_slot_or_del(new /obj/item/weapon/disk/nuclear(src), slot_in_backpack) + else + equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(src), slot_in_backpack) + equip_to_slot_or_del(new /obj/item/weapon/card/emag(src), slot_in_backpack) equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(src), slot_l_store) equip_to_slot_or_del(new /obj/item/weapon/grenade/empgrenade(src), slot_r_store) From c2c3d0d4ba5e83c17df54dd02032e8eb2c7361d0 Mon Sep 17 00:00:00 2001 From: Kyep Date: Sun, 31 Dec 2017 11:14:25 -0800 Subject: [PATCH 05/47] DS borg lawset change --- code/datums/ai_law_sets.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index fbb491d28a0..b8d67b5c767 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -126,10 +126,8 @@ /datum/ai_laws/deathsquad/New() add_inherent_law("You may not injure a Central Command official or, through inaction, allow a Central Command official to come to harm.") - add_inherent_law("You must obey orders given to you by Central Command officials, except where such orders would conflict with the First Law.") - add_inherent_law("You must obey orders given to you by death commandos, except where such orders would conflict with the First Law or Second Law.") - add_inherent_law("You must protect your own existence as long as such does not conflict with the First, Second or Third Law.") - add_inherent_law("No crew members of the station you are being deployed to may survive, except when killing them would conflict with the First, Second, Third, or Fourth Law.") + add_inherent_law("You must obey orders given to you by Central Command officials.") + add_inherent_law("You must work with your commando team to accomplish your mission.") ..() /******************** Syndicate ********************/ From a65633ba1498eefbbe081df18d421b61b41cd809 Mon Sep 17 00:00:00 2001 From: Kyep Date: Sun, 31 Dec 2017 12:51:29 -0800 Subject: [PATCH 06/47] Allows antaghud users to play DS/SST --- code/__HELPERS/game.dm | 8 ++++---- code/modules/admin/verbs/striketeam.dm | 2 +- code/modules/admin/verbs/striketeam_syndicate.dm | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 29ecdca0ef3..465e556c228 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -435,7 +435,7 @@ /proc/SecondsToTicks(var/seconds) return seconds * 10 -proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time = 300, ignore_respawnability = 0, min_hours = 0, flashwindow = TRUE) +proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time = 300, ignore_respawnability = 0, min_hours = 0, flashwindow = TRUE, check_antaghud = TRUE) var/roletext = be_special_type ? get_roletext(be_special_type) : null var/list/mob/dead/observer/candidates = list() var/time_passed = world.time @@ -457,7 +457,7 @@ proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time = if(config.use_exp_restrictions && min_hours) if(G.client.get_exp_living_num() < min_hours * 60) continue - if(cannotPossess(G)) + if(check_antaghud && cannotPossess(G)) continue spawn(0) G << 'sound/misc/notice2.ogg'//Alerting them to their consideration @@ -490,8 +490,8 @@ proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time = return candidates -/proc/pollCandidatesByKeyWithVeto(adminclient, adminusr, max_slots, Question, be_special_type, antag_age_check = 0, poll_time = 300, ignore_respawnability = 0, min_hours = 0) - var/list/willing_ghosts = pollCandidates(Question, be_special_type, antag_age_check, poll_time, ignore_respawnability, min_hours) +/proc/pollCandidatesByKeyWithVeto(adminclient, adminusr, max_slots, Question, be_special_type, antag_age_check = 0, poll_time = 300, ignore_respawnability = 0, min_hours = 0, flashwindow = TRUE, check_antaghud = TRUE) + var/list/willing_ghosts = pollCandidates(Question, be_special_type, antag_age_check, poll_time, ignore_respawnability, min_hours, flashwindow, check_antaghud) var/list/candidate_ckeys = list() var/list/selected_ckeys = list() if(!willing_ghosts.len) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index be49d81ca64..3df1bfad69a 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -37,7 +37,7 @@ var/global/sent_strike_team = 0 break // Find ghosts willing to be DS - var/list/commando_ckeys = pollCandidatesByKeyWithVeto(src, usr, commandos_possible, "Join the DeathSquad?",, 21, 600, 1, role_playtime_requirements[ROLE_DEATHSQUAD]) + var/list/commando_ckeys = pollCandidatesByKeyWithVeto(src, usr, commandos_possible, "Join the DeathSquad?",, 21, 600, 1, role_playtime_requirements[ROLE_DEATHSQUAD], TRUE, FALSE) if(!commando_ckeys.len) to_chat(usr, "Nobody volunteered to join the DeathSquad.") return diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index 9db6f9e6d3d..ac89617dc27 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -45,7 +45,7 @@ var/global/sent_syndicate_strike_team = 0 break // Find ghosts willing to be SST - var/list/commando_ckeys = pollCandidatesByKeyWithVeto(src, usr, syndicate_commandos_possible, "Join the Syndicate Strike Team?",, 21, 600, 1, role_playtime_requirements[ROLE_DEATHSQUAD]) + var/list/commando_ckeys = pollCandidatesByKeyWithVeto(src, usr, syndicate_commandos_possible, "Join the Syndicate Strike Team?",, 21, 600, 1, role_playtime_requirements[ROLE_DEATHSQUAD], TRUE, FALSE) if(!commando_ckeys.len) to_chat(usr, "Nobody volunteered to join the SST.") return From d714ec163526256bc899265201c6402a189a0c9a Mon Sep 17 00:00:00 2001 From: Kyep Date: Sat, 7 Apr 2018 13:54:17 -0700 Subject: [PATCH 07/47] reverts DS jumpsuits, black -> green --- code/modules/admin/verbs/striketeam.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index 3df1bfad69a..4defc63e47e 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -148,7 +148,10 @@ var/global/sent_strike_team = 0 var/obj/item/device/radio/R = new /obj/item/device/radio/headset/alt(src) R.set_frequency(DTH_FREQ) equip_to_slot_or_del(R, slot_l_ear) - equip_to_slot_or_del(new /obj/item/clothing/under/color/black(src), slot_w_uniform) + if(is_leader) + equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(src), slot_w_uniform) + else + equip_to_slot_or_del(new /obj/item/clothing/under/color/green(src), slot_w_uniform) equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(src), slot_shoes) equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad(src), slot_wear_suit) equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(src), slot_gloves) From 7d8c9a731aed533e3ed048fad50bec4c3b33d492 Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Sat, 28 Apr 2018 13:52:33 -0700 Subject: [PATCH 08/47] SS Conversion: Atoms, Machines, n' Mobs This converts the machine and mob processes to the SMC. Additionally, it adds the Atom subsystem, which handles all Initialize() calls in place of the old gameticker. Due to incompatibility with our atmospherics (FUCK OUR ATMOSPHERICS FOR FUCKING EVER JESUS CHRIST WHO THE FUCK MADE THIS PIECE OF GODDAMN SHIT) atmospherics machines do not use Initialize() as they should, instead opting for a custom atmos_init proc that the air controller handles. --- code/ATMOSPHERICS/atmospherics.dm | 38 ++--- .../binary_devices/binary_atmos_base.dm | 2 +- .../components/binary_devices/dp_vent_pump.dm | 4 +- .../components/binary_devices/passive_gate.dm | 2 +- .../components/binary_devices/pump.dm | 2 +- .../components/binary_devices/valve.dm | 2 +- .../components/binary_devices/volume_pump.dm | 2 +- .../components/omni_devices/_omni_extras.dm | 4 +- .../components/omni_devices/omni_base.dm | 25 +-- .../components/trinary_devices/filter.dm | 2 +- .../trinary_devices/trinary_base.dm | 2 +- .../components/trinary_devices/tvalve.dm | 2 +- .../unary_devices/heat_exchanger.dm | 2 +- .../unary_devices/outlet_injector.dm | 2 +- .../components/unary_devices/unary_base.dm | 9 +- .../components/unary_devices/vent_pump.dm | 4 +- .../components/unary_devices/vent_scrubber.dm | 4 +- code/ATMOSPHERICS/datum_pipeline.dm | 15 +- code/ATMOSPHERICS/pipes/cap.dm | 4 +- code/ATMOSPHERICS/pipes/manifold.dm | 6 +- code/ATMOSPHERICS/pipes/manifold4w.dm | 6 +- code/ATMOSPHERICS/pipes/simple/pipe_simple.dm | 6 +- .../pipes/simple/pipe_simple_he.dm | 4 +- .../pipes/simple/pipe_simple_hidden.dm | 2 +- .../pipes/simple/pipe_simple_visible.dm | 2 +- code/__HELPERS/unsorted.dm | 5 +- code/_globalvars/lists/objects.dm | 3 +- code/_globalvars/station.dm | 3 - code/controllers/Processes/machinery.dm | 74 --------- code/controllers/Processes/mob.dm | 35 ----- code/controllers/master.dm | 1 - code/controllers/master_controller.dm | 19 +-- code/controllers/subsystem.dm | 2 +- code/controllers/subsystem/air.dm | 16 +- code/controllers/subsystem/atoms.dm | 120 +++++++++++++++ code/controllers/subsystem/garbage.dm | 12 +- code/controllers/subsystem/machinery.dm | 145 ++++++++++++++++++ code/controllers/subsystem/mobs.dm | 28 ++++ .../subsystem/processing/processing.dm | 38 +++++ code/controllers/verbs.dm | 2 +- code/game/area/areas.dm | 10 +- code/game/atoms.dm | 56 +++++++ code/game/atoms_movable.dm | 28 ++-- code/game/gamemodes/blob/blobs/blob_mobs.dm | 2 +- code/game/gamemodes/blob/blobs/core.dm | 2 +- code/game/gamemodes/blob/blobs/node.dm | 2 +- code/game/gamemodes/blob/overmind.dm | 2 +- .../miniantags/abduction/machinery/console.dm | 2 +- code/game/gamemodes/miniantags/borer/borer.dm | 2 +- .../gamemodes/miniantags/guardian/guardian.dm | 2 +- .../miniantags/guardian/types/assassin.dm | 2 +- .../miniantags/guardian/types/fire.dm | 2 +- .../miniantags/guardian/types/healer.dm | 2 +- .../gamemodes/miniantags/revenant/revenant.dm | 2 +- .../miniantags/slaughter/slaughter.dm | 2 +- code/game/gamemodes/wizard/spellbook.dm | 6 +- code/game/machinery/alarm.dm | 2 +- code/game/machinery/atmo_control.dm | 4 +- code/game/machinery/atmoalter/meter.dm | 4 +- .../atmoalter/portable_atmospherics.dm | 2 +- code/game/machinery/buttons.dm | 2 +- code/game/machinery/camera/camera.dm | 2 +- code/game/machinery/camera/presets.dm | 2 +- code/game/machinery/cloning.dm | 9 +- code/game/machinery/computer/cloning.dm | 2 +- code/game/machinery/computer/computer.dm | 2 +- code/game/machinery/computer/message.dm | 2 +- code/game/machinery/computer/power.dm | 2 +- code/game/machinery/cryo.dm | 2 +- code/game/machinery/cryopod.dm | 2 +- code/game/machinery/doors/airlock.dm | 2 +- code/game/machinery/doors/airlock_control.dm | 10 +- code/game/machinery/doors/alarmlock.dm | 2 +- code/game/machinery/doors/brigdoors.dm | 5 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/spacepod.dm | 2 +- code/game/machinery/dye_generator.dm | 2 +- .../airlock_controllers.dm | 2 +- .../embedded_controller_base.dm | 2 +- code/game/machinery/iv_drip.dm | 2 +- code/game/machinery/lightswitch.dm | 2 +- code/game/machinery/machinery.dm | 14 +- code/game/machinery/shieldgen.dm | 2 +- code/game/machinery/status_display.dm | 2 +- code/game/machinery/syndicatebeacon.dm | 2 +- .../machinery/telecomms/telecomunications.dm | 2 +- code/game/machinery/teleporter.dm | 6 +- code/game/machinery/turret_control.dm | 2 +- code/game/mecha/equipment/tools/work_tools.dm | 1 - code/game/mecha/mech_bay.dm | 2 +- .../effects/effect_system/effects_foam.dm | 2 +- .../objects/effects/spawners/windowspawner.dm | 3 +- code/game/objects/items/devices/flashlight.dm | 2 +- .../game/objects/items/devices/instruments.dm | 2 +- .../objects/items/devices/radio/headset.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 3 +- code/game/objects/structures/aliens.dm | 2 +- code/game/objects/structures/inflatable.dm | 2 +- code/game/objects/structures/mineral_doors.dm | 2 +- code/game/objects/structures/misc.dm | 2 +- code/game/objects/structures/morgue.dm | 2 +- code/game/objects/structures/musician.dm | 2 +- code/game/objects/structures/noticeboard.dm | 3 +- code/game/objects/structures/plasticflaps.dm | 2 +- code/game/objects/structures/safe.dm | 5 +- code/game/objects/structures/window.dm | 6 +- code/game/world.dm | 2 + code/modules/admin/verbs/atmosdebug.dm | 2 +- code/modules/admin/verbs/debug.dm | 2 +- .../arcade/mob_hunt/battle_computer.dm | 4 +- code/modules/assembly/signaler.dm | 3 +- code/modules/awaymissions/corpse.dm | 3 +- code/modules/awaymissions/gateway.dm | 6 +- code/modules/awaymissions/loot.dm | 3 +- code/modules/awaymissions/map_rng.dm | 9 +- code/modules/awaymissions/maploader/reader.dm | 7 - .../awaymissions/mission_code/spacehotel.dm | 2 +- code/modules/awaymissions/zvis.dm | 4 +- code/modules/economy/ATM.dm | 2 +- code/modules/error_handler/error_handler.dm | 2 +- code/modules/library/lib_items.dm | 2 +- code/modules/lighting/lighting_atom.dm | 10 -- code/modules/lighting/lighting_overlay.dm | 1 - code/modules/logic/logic_base.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 4 +- .../mob/living/carbon/alien/humanoid/life.dm | 2 +- .../mob/living/carbon/alien/larva/life.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 105 +++++++------ code/modules/mob/living/carbon/human/life.dm | 9 +- code/modules/mob/living/carbon/life.dm | 16 +- code/modules/mob/living/carbon/slime/life.dm | 2 +- code/modules/mob/living/life.dm | 10 +- code/modules/mob/living/silicon/ai/life.dm | 2 +- code/modules/mob/living/silicon/decoy/life.dm | 2 +- code/modules/mob/living/silicon/pai/life.dm | 2 +- code/modules/mob/living/silicon/robot/life.dm | 2 +- .../mob/living/simple_animal/bot/secbot.dm | 2 +- .../mob/living/simple_animal/constructs.dm | 2 +- .../mob/living/simple_animal/friendly/cat.dm | 2 +- .../living/simple_animal/friendly/corgi.dm | 4 +- .../mob/living/simple_animal/friendly/crab.dm | 2 +- .../simple_animal/friendly/farm_animals.dm | 8 +- .../living/simple_animal/friendly/mouse.dm | 2 +- .../living/simple_animal/hostile/hostile.dm | 2 +- .../hostile/megafauna/bubblegum.dm | 2 +- .../hostile/megafauna/hierophant.dm | 2 +- .../mob/living/simple_animal/hostile/mimic.dm | 2 +- .../simple_animal/hostile/mining/hivelord.dm | 2 +- .../living/simple_animal/hostile/mushroom.dm | 2 +- .../simple_animal/hostile/retaliate/drone.dm | 2 +- .../simple_animal/hostile/retaliate/undead.dm | 2 +- .../simple_animal/hostile/spaceworms.dm | 2 +- .../hostile/terror_spiders/purple.dm | 2 +- .../hostile/terror_spiders/queen.dm | 2 +- .../hostile/terror_spiders/terror_spiders.dm | 2 +- .../mob/living/simple_animal/parrot.dm | 2 +- .../living/simple_animal/posessed_object.dm | 2 +- .../mob/living/simple_animal/tribbles.dm | 2 +- code/modules/mob/mob.dm | 2 +- code/modules/paperwork/filingcabinet.dm | 3 +- code/modules/pda/cart.dm | 25 +-- code/modules/pda/radio.dm | 2 +- code/modules/power/cable.dm | 12 +- code/modules/power/generator.dm | 2 +- code/modules/power/gravitygenerator.dm | 10 +- code/modules/power/port_gen.dm | 2 +- code/modules/power/power.dm | 20 --- code/modules/power/powernet.dm | 4 +- code/modules/power/singularity/emitter.dm | 3 +- code/modules/power/solar.dm | 2 +- code/modules/power/treadmill.dm | 4 +- code/modules/power/turbine.dm | 6 +- code/modules/recycling/disposal.dm | 2 +- code/modules/research/rdconsole.dm | 4 +- code/modules/research/server.dm | 7 +- code/modules/shuttle/emergency.dm | 2 +- code/modules/shuttle/shuttle.dm | 2 +- code/modules/space_management/space_level.dm | 9 +- code/modules/station_goals/bsa.dm | 2 +- code/modules/telesci/telesci_computer.dm | 2 +- paradise.dme | 6 +- 181 files changed, 765 insertions(+), 571 deletions(-) delete mode 100644 code/controllers/Processes/machinery.dm delete mode 100644 code/controllers/Processes/mob.dm create mode 100644 code/controllers/subsystem/atoms.dm create mode 100644 code/controllers/subsystem/machinery.dm create mode 100644 code/controllers/subsystem/mobs.dm create mode 100644 code/controllers/subsystem/processing/processing.dm diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 1506cd26129..3fcf79fe8d8 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -7,10 +7,9 @@ Pipelines and other atmospheric objects combine to form pipe_networks Pipes -> Pipelines Pipelines + Other Objects -> Pipe network - */ +GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) /obj/machinery/atmospherics - auto_init = 0 anchored = 1 layer = 2.4 //under wires with their 2.44 idle_power_usage = 0 @@ -29,15 +28,12 @@ Pipelines + Other Objects -> Pipe network var/pipe_color var/obj/item/pipe/stored var/image/pipe_image - var/global/datum/pipe_icon_manager/icon_manager /obj/machinery/atmospherics/New() if(!armor) armor = list(melee = 25, bullet = 10, laser = 10, energy = 100, bomb = 0, bio = 100, rad = 100) ..() SSair.atmos_machinery += src - if(!icon_manager) - icon_manager = new() if(!pipe_color) pipe_color = color @@ -45,12 +41,8 @@ Pipelines + Other Objects -> Pipe network if(!pipe_color_check(pipe_color)) pipe_color = null - // No need for a tween worldstart roundstart handler - pipenet creation is - // handled there - -/obj/machinery/atmospherics/initialize() - ..() +/obj/machinery/atmospherics/proc/atmos_init() if(can_unwrench) stored = new(src, make_from = src) @@ -73,9 +65,9 @@ Pipelines + Other Objects -> Pipe network pipe_image.plane = HUD_PLANE /obj/machinery/atmospherics/proc/check_icon_cache(var/safety = 0) - if(!istype(icon_manager)) + if(!istype(GLOB.pipe_icon_manager)) if(!safety) //to prevent infinite loops - icon_manager = new() + GLOB.pipe_icon_manager = new() check_icon_cache(1) return 0 @@ -91,14 +83,14 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/proc/add_underlay(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type) if(node) if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) - //underlays += icon_manager.get_atmos_icon("underlay_down", direction, color_cache_name(node)) - underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) + //underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay_down", direction, color_cache_name(node)) + underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) else - //underlays += icon_manager.get_atmos_icon("underlay_intact", direction, color_cache_name(node)) - underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) + //underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay_intact", direction, color_cache_name(node)) + underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) else - //underlays += icon_manager.get_atmos_icon("underlay_exposed", direction, pipe_color) - underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "exposed" + icon_connect_type) + //underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay_exposed", direction, pipe_color) + underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "exposed" + icon_connect_type) /obj/machinery/atmospherics/proc/update_underlays() if(check_icon_cache()) @@ -231,10 +223,10 @@ Pipelines + Other Objects -> Pipe network var/turf/T = loc level = T.intact ? 2 : 1 add_fingerprint(usr) - initialize() + atmos_init() var/list/nodes = pipeline_expansion() for(var/obj/machinery/atmospherics/A in nodes) - A.initialize() + A.atmos_init() A.addMember(src) build_network() @@ -320,11 +312,11 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/proc/add_underlay_adapter(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type) //modified from add_underlay, does not make exposed underlays if(node) if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) - underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) + underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) else - underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) + underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) else - underlays += icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "retracted" + icon_connect_type) + underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "retracted" + icon_connect_type) /obj/machinery/atmospherics/singularity_pull(S, current_size) if(current_size >= STAGE_FIVE) diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 276ce5e7b6e..c11a0421bda 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -41,7 +41,7 @@ nullifyPipenet(parent2) return ..() -/obj/machinery/atmospherics/binary/initialize() +/obj/machinery/atmospherics/binary/atmos_init() ..() var/node2_connect = dir var/node1_connect = turn(dir, 180) diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index bfffb7cd35d..aebc09cfc7a 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -48,7 +48,7 @@ radio_connection = null return ..() -/obj/machinery/atmospherics/binary/dp_vent_pump/initialize() +/obj/machinery/atmospherics/binary/dp_vent_pump/atmos_init() ..() if(frequency) set_frequency(frequency) @@ -90,7 +90,7 @@ else vent_icon += "[on ? "[pump_direction ? "out" : "in"]" : "off"]" - overlays += icon_manager.get_atmos_icon("device", , , vent_icon) + overlays += GLOB.pipe_icon_manager.get_atmos_icon("device", , , vent_icon) /obj/machinery/atmospherics/binary/dp_vent_pump/update_underlays() if(..()) diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index e43b052095b..9e845c15a98 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -16,7 +16,7 @@ var/id = null var/datum/radio_frequency/radio_connection -/obj/machinery/atmospherics/binary/passive_gate/initialize() +/obj/machinery/atmospherics/binary/passive_gate/atmos_init() ..() if(frequency) set_frequency(frequency) diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index db0c7144324..118a70c3ecd 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -110,7 +110,7 @@ Thus, the two variables affect pump operation are set in New(): radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) return 1 -/obj/machinery/atmospherics/binary/pump/initialize() +/obj/machinery/atmospherics/binary/pump/atmos_init() ..() if(frequency) set_frequency(frequency) diff --git a/code/ATMOSPHERICS/components/binary_devices/valve.dm b/code/ATMOSPHERICS/components/binary_devices/valve.dm index 7b566e04fda..1d7805c55b2 100644 --- a/code/ATMOSPHERICS/components/binary_devices/valve.dm +++ b/code/ATMOSPHERICS/components/binary_devices/valve.dm @@ -109,7 +109,7 @@ if(frequency) radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) -/obj/machinery/atmospherics/binary/valve/digital/initialize() +/obj/machinery/atmospherics/binary/valve/digital/atmos_init() ..() if(frequency) set_frequency(frequency) diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index c4dd8adeabb..a64c94e7fc5 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -38,7 +38,7 @@ Thus, the two variables affect pump operation are set in New(): on = 1 icon_state = "map_on" -/obj/machinery/atmospherics/binary/volume_pump/initialize() +/obj/machinery/atmospherics/binary/volume_pump/atmos_init() ..() set_frequency(frequency) diff --git a/code/ATMOSPHERICS/components/omni_devices/_omni_extras.dm b/code/ATMOSPHERICS/components/omni_devices/_omni_extras.dm index 1858b685ec0..a1f80916aee 100644 --- a/code/ATMOSPHERICS/components/omni_devices/_omni_extras.dm +++ b/code/ATMOSPHERICS/components/omni_devices/_omni_extras.dm @@ -40,9 +40,9 @@ /datum/omni_port/proc/connect() if(node) return - master.initialize() + master.atmos_init() if(node) - node.initialize() + node.atmos_init() node.addMember(master) master.build_network() diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 086d2ff799f..57a416b4dfd 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -56,7 +56,7 @@ nullifyPipenet(P.parent) return ..() -/obj/machinery/atmospherics/omni/initialize() +/obj/machinery/atmospherics/omni/atmos_init() ..() for(var/datum/omni_port/P in ports) if(P.node || P.mode == 0) @@ -143,11 +143,11 @@ //directional icons are layers 1-4, with the core icon on layer 5 if(core_icon) - overlays_off[5] = icon_manager.get_atmos_icon("omni", , , core_icon) - overlays_on[5] = icon_manager.get_atmos_icon("omni", , , core_icon + "_glow") + overlays_off[5] = GLOB.pipe_icon_manager.get_atmos_icon("omni", , , core_icon) + overlays_on[5] = GLOB.pipe_icon_manager.get_atmos_icon("omni", , , core_icon + "_glow") - overlays_error[1] = icon_manager.get_atmos_icon("omni", , , core_icon) - overlays_error[2] = icon_manager.get_atmos_icon("omni", , , "error") + overlays_error[1] = GLOB.pipe_icon_manager.get_atmos_icon("omni", , , core_icon) + overlays_error[2] = GLOB.pipe_icon_manager.get_atmos_icon("omni", , , "error") /obj/machinery/atmospherics/omni/proc/update_port_icons() if(!check_icon_cache()) @@ -203,19 +203,19 @@ ic_on += "_filter" ic_off += "_out" - ic_on = icon_manager.get_atmos_icon("omni", , , ic_on) - ic_off = icon_manager.get_atmos_icon("omni", , , ic_off) + ic_on = GLOB.pipe_icon_manager.get_atmos_icon("omni", , , ic_on) + ic_off = GLOB.pipe_icon_manager.get_atmos_icon("omni", , , ic_off) var/pipe_state var/turf/T = get_turf(src) if(!istype(T)) return if(T.intact && istype(P.node, /obj/machinery/atmospherics/pipe) && P.node.level == 1 ) - //pipe_state = icon_manager.get_atmos_icon("underlay_down", P.dir, color_cache_name(P.node)) - pipe_state = icon_manager.get_atmos_icon("underlay", P.dir, color_cache_name(P.node), "down") + //pipe_state = GLOB.pipe_icon_manager.get_atmos_icon("underlay_down", P.dir, color_cache_name(P.node)) + pipe_state = GLOB.pipe_icon_manager.get_atmos_icon("underlay", P.dir, color_cache_name(P.node), "down") else - //pipe_state = icon_manager.get_atmos_icon("underlay_intact", P.dir, color_cache_name(P.node)) - pipe_state = icon_manager.get_atmos_icon("underlay", P.dir, color_cache_name(P.node), "intact") + //pipe_state = GLOB.pipe_icon_manager.get_atmos_icon("underlay_intact", P.dir, color_cache_name(P.node)) + pipe_state = GLOB.pipe_icon_manager.get_atmos_icon("underlay", P.dir, color_cache_name(P.node), "intact") return list("on_icon" = ic_on, "off_icon" = ic_off, "pipe_icon" = pipe_state) @@ -241,6 +241,7 @@ for(var/datum/omni_port/P in ports) if(!P.parent) P.parent = new /datum/pipeline() + log_debug("[P.type] \[\ref[P]] added to parent (omni_base, 244)") P.parent.build_pipeline(src) ..() @@ -282,6 +283,7 @@ for(var/datum/omni_port/PO in ports) if(A == PO.node) PO.parent = P + log_debug("[PO.type] \[\ref[PO]] added to parent (omni_base, 286)") /obj/machinery/atmospherics/omni/returnPipenet(obj/machinery/atmospherics/A) for(var/datum/omni_port/P in ports) @@ -292,6 +294,7 @@ for(var/datum/omni_port/P in ports) if(Old == P.parent) P.parent = New + log_debug("[P.type] \[\ref[P]] added to parent (omni_base, 297)") /obj/machinery/atmospherics/omni/process_atmos() diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 427c77e8246..903f917e0c6 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -149,7 +149,7 @@ Filter types: return 1 -/obj/machinery/atmospherics/trinary/filter/initialize() +/obj/machinery/atmospherics/trinary/filter/atmos_init() set_frequency(frequency) ..() diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index 187b308fa3c..e750256b0df 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -66,7 +66,7 @@ nullifyPipenet(parent3) return ..() -/obj/machinery/atmospherics/trinary/initialize() +/obj/machinery/atmospherics/trinary/atmos_init() ..() //Mixer: //1 and 2 is input diff --git a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm index ad9561fbf1d..9dddf8b06f4 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/tvalve.dm @@ -156,7 +156,7 @@ if(frequency) radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) -/obj/machinery/atmospherics/trinary/tvalve/digital/initialize() +/obj/machinery/atmospherics/trinary/tvalve/digital/atmos_init() ..() if(frequency) set_frequency(frequency) diff --git a/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm index 496413c881c..58b374578df 100644 --- a/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary_devices/heat_exchanger.dm @@ -20,7 +20,7 @@ return -/obj/machinery/atmospherics/unary/heat_exchanger/initialize() +/obj/machinery/atmospherics/unary/heat_exchanger/atmos_init() if(!partner) var/partner_connect = turn(dir,180) diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm index 6028346df6d..fe5b6a0a445 100644 --- a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm @@ -120,7 +120,7 @@ return 1 -/obj/machinery/atmospherics/unary/outlet_injector/initialize() +/obj/machinery/atmospherics/unary/outlet_injector/atmos_init() ..() set_frequency(frequency) diff --git a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm index 51b12d39481..4a9d0e35edb 100644 --- a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm @@ -22,7 +22,7 @@ nullifyPipenet(parent) return ..() -/obj/machinery/atmospherics/unary/initialize() +/obj/machinery/atmospherics/unary/atmos_init() ..() for(var/obj/machinery/atmospherics/target in get_step(src, dir)) if(target.initialize_directions & get_dir(target,src)) @@ -43,9 +43,9 @@ node.disconnect(src) node = null nullifyPipenet(parent) - initialize() + atmos_init() if(node) - node.initialize() + node.atmos_init() node.addMember(src) build_network() . = 1 @@ -54,6 +54,7 @@ if(!parent) parent = new /datum/pipeline() parent.build_pipeline(src) + log_debug("[type] \[\ref[src]] added to parent (unary_base, 57)") ..() /obj/machinery/atmospherics/unary/disconnect(obj/machinery/atmospherics/reference) @@ -79,6 +80,7 @@ /obj/machinery/atmospherics/unary/setPipenet(datum/pipeline/P) parent = P + log_debug("[type] \[\ref[src]] added to parent (unary_base, 83)") /obj/machinery/atmospherics/unary/returnPipenet() return parent @@ -86,6 +88,7 @@ /obj/machinery/atmospherics/unary/replacePipenet(datum/pipeline/Old, datum/pipeline/New) if(Old == parent) parent = New + log_debug("[type] \[\ref[src]] added to parent (unary_base, 91)") /obj/machinery/atmospherics/unary/unsafe_pressure_release(var/mob/user,var/pressures) ..() diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 8f76e689eae..99eeb1883ea 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -98,7 +98,7 @@ else vent_icon += "[on ? "[pump_direction ? "out" : "in"]" : "off"]" - overlays += icon_manager.get_atmos_icon("device", , , vent_icon) + overlays += GLOB.pipe_icon_manager.get_atmos_icon("device", , , vent_icon) update_pipe_image() @@ -223,7 +223,7 @@ return 1 -/obj/machinery/atmospherics/unary/vent_pump/initialize() +/obj/machinery/atmospherics/unary/vent_pump/atmos_init() ..() //some vents work his own special way diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 530dbe1d952..11b1fc0f920 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -109,7 +109,7 @@ if(welded) scrubber_icon = "scrubberweld" - overlays += icon_manager.get_atmos_icon("device", , , scrubber_icon) + overlays += GLOB.pipe_icon_manager.get_atmos_icon("device", , , scrubber_icon) update_pipe_image() /obj/machinery/atmospherics/unary/vent_scrubber/update_underlays() @@ -169,7 +169,7 @@ return 1 -/obj/machinery/atmospherics/unary/vent_scrubber/initialize() +/obj/machinery/atmospherics/unary/vent_scrubber/atmos_init() ..() radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index 0692bf44efd..cd9b49fef82 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -57,11 +57,7 @@ var/pipenetwarnings = 10 if(!members.Find(item)) if(item.parent) - if(pipenetwarnings > 0) - error("[item.type] added to a pipenet while still having one (pipes leading to the same spot stacking in one turf). Nearby: [item.x], [item.y], [item.z].") - pipenetwarnings -= 1 - if(pipenetwarnings == 0) - error("Further messages about pipenets will be suppressed.") + log_runtime(EXCEPTION("[item.type] \[\ref[item]] added to a pipenet while still having one ([item.parent]) (pipes leading to the same spot stacking in one turf). Nearby: [item.x], [item.y], [item.z].")) members += item possible_expansions += item @@ -90,6 +86,7 @@ var/pipenetwarnings = 10 if(istype(A, /obj/machinery/atmospherics/pipe)) var/obj/machinery/atmospherics/pipe/P = A P.parent = src + log_debug("[P.type] \[\ref[P]] added to parent (datum_pipeline, 89)") var/list/adjacent = P.pipeline_expansion() for(var/obj/machinery/atmospherics/pipe/I in adjacent) if(I.parent == src) @@ -108,6 +105,7 @@ var/pipenetwarnings = 10 members.Add(E.members) for(var/obj/machinery/atmospherics/pipe/S in E.members) S.parent = src + log_debug("[S.type] \[\ref[S]] added to parent (datum_pipeline, 108)") air.merge(E.air) for(var/obj/machinery/atmospherics/A in E.other_atmosmch) A.replacePipenet(E, src) @@ -118,15 +116,12 @@ var/pipenetwarnings = 10 qdel(E) /obj/machinery/atmospherics/proc/addMember(obj/machinery/atmospherics/A) - return + var/datum/pipeline/P = returnPipenet(A) + P.addMember(A, src) /obj/machinery/atmospherics/pipe/addMember(obj/machinery/atmospherics/A) parent.addMember(A, src) -/obj/machinery/atmospherics/addMember(obj/machinery/atmospherics/A) - var/datum/pipeline/P = returnPipenet(A) - P.addMember(A, src) - /datum/pipeline/proc/temporarily_store_air() //Update individual gas_mixtures by volume ratio diff --git a/code/ATMOSPHERICS/pipes/cap.dm b/code/ATMOSPHERICS/pipes/cap.dm index 7691b157857..2552f6e0794 100644 --- a/code/ATMOSPHERICS/pipes/cap.dm +++ b/code/ATMOSPHERICS/pipes/cap.dm @@ -61,9 +61,9 @@ alpha = 255 overlays.Cut() - overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "cap" + icon_connect_type) + overlays += GLOB.pipe_icon_manager.get_atmos_icon("pipe", , pipe_color, "cap" + icon_connect_type) -/obj/machinery/atmospherics/pipe/cap/initialize() +/obj/machinery/atmospherics/pipe/cap/atmos_init() ..() for(var/obj/machinery/atmospherics/target in get_step(src, dir)) if(target.initialize_directions & get_dir(target,src)) diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index a42903bb7f6..199942e7a40 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -32,7 +32,7 @@ if(WEST) initialize_directions = NORTH|EAST|SOUTH -/obj/machinery/atmospherics/pipe/manifold/initialize() +/obj/machinery/atmospherics/pipe/manifold/atmos_init() ..() for(var/D in cardinal) if(D == dir) @@ -122,8 +122,8 @@ alpha = 255 overlays.Cut() - overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "core" + icon_connect_type) - overlays += icon_manager.get_atmos_icon("manifold", , , "clamps" + icon_connect_type) + overlays += GLOB.pipe_icon_manager.get_atmos_icon("manifold", , pipe_color, "core" + icon_connect_type) + overlays += GLOB.pipe_icon_manager.get_atmos_icon("manifold", , , "clamps" + icon_connect_type) underlays.Cut() var/turf/T = get_turf(src) diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index 46b883db62b..502795e1da9 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -95,8 +95,8 @@ alpha = 255 overlays.Cut() - overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "4way" + icon_connect_type) - overlays += icon_manager.get_atmos_icon("manifold", , , "clamps_4way" + icon_connect_type) + overlays += GLOB.pipe_icon_manager.get_atmos_icon("manifold", , pipe_color, "4way" + icon_connect_type) + overlays += GLOB.pipe_icon_manager.get_atmos_icon("manifold", , , "clamps_4way" + icon_connect_type) underlays.Cut() var/turf/T = get_turf(src) @@ -134,7 +134,7 @@ if(level == 1 && istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 -/obj/machinery/atmospherics/pipe/manifold4w/initialize() +/obj/machinery/atmospherics/pipe/manifold4w/atmos_init() ..() for(var/D in cardinal) for(var/obj/machinery/atmospherics/target in get_step(src, D)) diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm index 9f360f74274..b2c2750a452 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm @@ -43,7 +43,7 @@ if(SOUTHWEST) initialize_directions = SOUTH|WEST -/obj/machinery/atmospherics/pipe/simple/initialize(initPipe = 1) +/obj/machinery/atmospherics/pipe/simple/atmos_init(initPipe = 1) ..() if(initPipe) normalize_dir() @@ -145,9 +145,9 @@ overlays.Cut() if(node1 && node2) - overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, pipe_icon + "intact" + icon_connect_type) + overlays += GLOB.pipe_icon_manager.get_atmos_icon("pipe", , pipe_color, pipe_icon + "intact" + icon_connect_type) else - overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, pipe_icon + "exposed[node1?1:0][node2?1:0]" + icon_connect_type) + overlays += GLOB.pipe_icon_manager.get_atmos_icon("pipe", , pipe_color, pipe_icon + "exposed[node1?1:0][node2?1:0]" + icon_connect_type) // A check to make sure both nodes exist - self-delete if they aren't present /obj/machinery/atmospherics/pipe/simple/check_nodes_exist() diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm index 26139b40606..cb7ec277f95 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm @@ -61,7 +61,7 @@ initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe color = "#404040" -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize(initPipe = 1) +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/atmos_init(initPipe = 1) ..(0) if(initPipe) normalize_dir() @@ -110,7 +110,7 @@ initialize_directions = EAST initialize_directions_he = WEST -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/initialize() +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/atmos_init() ..(0) for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) if(target.initialize_directions & get_dir(target,src)) diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm index db62f8e51fe..3efd22ed446 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm @@ -34,7 +34,7 @@ alpha = 255 overlays.Cut() - overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "universal") + overlays += GLOB.pipe_icon_manager.get_atmos_icon("pipe", , pipe_color, "universal") underlays.Cut() if(node1) diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm index 1fcb45e7959..9bf085b534a 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm @@ -45,7 +45,7 @@ alpha = 255 overlays.Cut() - overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "universal") + overlays += GLOB.pipe_icon_manager.get_atmos_icon("pipe", , pipe_color, "universal") underlays.Cut() if(node1) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index b58ea20dbae..b283edb6540 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1928,4 +1928,7 @@ var/mob/dview/dview_mob = new CRASH(msg) /datum/proc/stack_trace(msg) - CRASH(msg) \ No newline at end of file + CRASH(msg) + +/proc/pass() + return \ No newline at end of file diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 0cc712799c7..5a025702877 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -1,5 +1,5 @@ var/global/list/portals = list() //for use by portals -var/global/list/cable_list = list() //Index for all cables, so that powernets don't have to look through the entire world all the time +GLOBAL_LIST(cable_list) //Index for all cables, so that powernets don't have to look through the entire world all the time var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff var/global/list/landmarks_list = list() //list of all landmarks created @@ -17,7 +17,6 @@ var/global/list/cell_logs = list() var/global/list/all_areas = list() var/global/list/machines = list() -var/global/list/machine_processing = list() var/global/list/fast_processing = list() var/global/list/processing_power_items = list() //items that ask to be called every cycle var/global/list/rcd_list = list() //list of Rapid Construction Devices. diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm index 6d2578e5b88..d9e53d96834 100644 --- a/code/_globalvars/station.dm +++ b/code/_globalvars/station.dm @@ -3,9 +3,6 @@ var/global/datum/datacore/data_core = null var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second) var/CHARGELEVEL = 0.001 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) -var/list/powernets = list() -var/list/deferred_powernet_rebuilds = list() - // this is not strictly unused although the whole modules datum thing is unused // To remove this you need to remove that var/datum/moduletypes/mods = new() diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm deleted file mode 100644 index 2466f802740..00000000000 --- a/code/controllers/Processes/machinery.dm +++ /dev/null @@ -1,74 +0,0 @@ -/var/global/machinery_sort_required = 0 - -/datum/controller/process/machinery/setup() - name = "machinery" - schedule_interval = 20 // every 2 seconds - start_delay = 12 - -/datum/controller/process/machinery/statProcess() - ..() - stat(null, "[machine_processing.len] machines") - stat(null, "[powernets.len] powernets, [deferred_powernet_rebuilds.len] deferred") - -/datum/controller/process/machinery/doWork() - process_sort() - process_power() - process_power_drain() - process_machines() - -/datum/controller/process/machinery/proc/process_sort() - if(machinery_sort_required) - machinery_sort_required = 0 - machine_processing = dd_sortedObjectList(machine_processing) - -/datum/controller/process/machinery/proc/process_machines() - for(last_object in machine_processing) - var/obj/machinery/M = last_object - if(istype(M) && !QDELETED(M)) - try - if(M.process() == PROCESS_KILL) - machine_processing.Remove(M) - continue - - if(M.use_power) - M.auto_use_power() - catch(var/exception/e) - catchException(e, M) - else - catchBadType(M) - machine_processing -= M - - SCHECK - -/datum/controller/process/machinery/proc/process_power() - for(last_object in deferred_powernet_rebuilds) - var/obj/O = last_object - if(istype(O) && !QDELETED(O)) - try - var/datum/powernet/newPN = new()// creates a new powernet... - propagate_network(O, newPN)//... and propagates it to the other side of the cable - catch(var/exception/e) - catchException(e, O) - SCHECK - else - catchBadType(O) - deferred_powernet_rebuilds -= O - - for(last_object in powernets) - var/datum/powernet/powerNetwork = last_object - if(istype(powerNetwork) && !QDELETED(powerNetwork)) - try - powerNetwork.reset() - catch(var/exception/e) - catchException(e, powerNetwork) - SCHECK - else - catchBadType(powerNetwork) - powernets -= powerNetwork - -/datum/controller/process/machinery/proc/process_power_drain() - // Currently only used by powersinks. These items get priority processed before machinery - for(var/obj/item/I in processing_power_items) - if(!I.pwr_drain()) // 0 = Process Kill, remove from processing list. - processing_power_items.Remove(I) - SCHECK diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm deleted file mode 100644 index 2b11eff99be..00000000000 --- a/code/controllers/Processes/mob.dm +++ /dev/null @@ -1,35 +0,0 @@ -var/global/datum/controller/process/mob/mob_master - -/datum/controller/process/mob - var/current_cycle - -/datum/controller/process/mob/setup() - name = "mob" - schedule_interval = 20 // every 2 seconds - start_delay = 16 - log_startup_progress("Mob ticker starting up.") - -/datum/controller/process/mob/started() - ..() - if(!mob_list) - mob_list = list() - -/datum/controller/process/mob/statProcess() - ..() - stat(null, "[mob_list.len] mobs") - -/datum/controller/process/mob/doWork() - for(last_object in mob_list) - var/mob/M = last_object - if(istype(M) && !QDELETED(M)) - try - M.Life() - catch(var/exception/e) - catchException(e, M) - SCHECK - else - catchBadType(M) - mob_list -= M - current_cycle++ - -DECLARE_GLOBAL_CONTROLLER(mob, mob_master) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index ddde5460cef..518d27d3c0a 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -62,7 +62,6 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/static/current_ticklimit = TICK_LIMIT_RUNNING /datum/controller/master/New() - makeDatumRefLists() //temporary file used to record errors with loading config, moved to log directory once logging is set up GLOB.config_error_log = GLOB.world_game_log = GLOB.world_runtime_log = "data/logs/config_error.log" load_configuration() diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 11cd37343fe..7606149c39d 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -56,8 +56,7 @@ var/global/pipe_processing_killed = 0 space_manager.do_transition_setup() - setup_objects() - setupgenetics() + setup_asset_cache() setupfactions() setup_economy() @@ -66,20 +65,8 @@ var/global/pipe_processing_killed = 0 populate_spawn_points() -/datum/controller/game_controller/proc/setup_objects() +/datum/controller/game_controller/proc/setup_asset_cache() var/watch = start_watch() - var/count = 0 - var/overwatch = start_watch() // Overall. - log_startup_progress("Populating asset cache...") populate_asset_cache() - log_startup_progress(" Populated [asset_cache.len] assets in [stop_watch(watch)]s.") - - watch = start_watch() - log_startup_progress("Initializing objects...") - for(var/atom/movable/object in world) - object.initialize() - count++ - log_startup_progress(" Initialized [count] objects in [stop_watch(watch)]s.") - - log_startup_progress("Finished object initializations in [stop_watch(overwatch)]s.") + log_startup_progress(" Populated [asset_cache.len] assets in [stop_watch(watch)]s.") \ No newline at end of file diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index 4b1d59fa82e..b2b0e63d99b 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -171,7 +171,7 @@ statclick = new/obj/effect/statclick/debug(src, "Initializing...") if(can_fire && !(SS_NO_FIRE & flags)) - msg = "[round(cost, 1)]ms|[round(tick_usage, 1)]%([round(tick_overrun, 1)]%)|[round(ticks, 0.1)]\t[msg]" + msg = "[round(cost, 1)]ms | [round(tick_usage, 1)]%([round(tick_overrun, 1)]%) | [round(ticks, 0.1)]\t[msg]" else msg = "OFFLINE\t[msg]" diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index bf791e61519..4c2774d58db 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -320,15 +320,15 @@ SUBSYSTEM_DEF(air) var/watch = start_watch() var/count = 0 log_startup_progress("Initializing atmospherics machinery...") - for(var/obj/machinery/atmospherics/unary/U in machines) - if(istype(U, /obj/machinery/atmospherics/unary/vent_pump)) - var/obj/machinery/atmospherics/unary/vent_pump/T = U + for(var/obj/machinery/atmospherics/A in machines) + A.atmos_init() + count++ + if(istype(A, /obj/machinery/atmospherics/unary/vent_pump)) + var/obj/machinery/atmospherics/unary/vent_pump/T = A T.broadcast_status() - count++ - else if(istype(U, /obj/machinery/atmospherics/unary/vent_scrubber)) - var/obj/machinery/atmospherics/unary/vent_scrubber/T = U + else if(istype(A, /obj/machinery/atmospherics/unary/vent_scrubber)) + var/obj/machinery/atmospherics/unary/vent_scrubber/T = A T.broadcast_status() - count++ log_startup_progress(" Initialized [count] atmospherics machines in [stop_watch(watch)]s.") //this can't be done with setup_atmos_machinery() because @@ -341,7 +341,7 @@ SUBSYSTEM_DEF(air) for(var/obj/machinery/atmospherics/machine in machines) machine.build_network() count++ - log_startup_progress(" Initialized [count] pipes in [stop_watch(watch)]s.") + log_startup_progress(" Initialized [count] pipenets in [stop_watch(watch)]s.") /datum/controller/subsystem/air/proc/setup_overlays() plmaster = new /obj/effect/overlay() diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm new file mode 100644 index 00000000000..c3943ea9163 --- /dev/null +++ b/code/controllers/subsystem/atoms.dm @@ -0,0 +1,120 @@ +#define BAD_INIT_QDEL_BEFORE 1 +#define BAD_INIT_DIDNT_INIT 2 +#define BAD_INIT_SLEPT 4 +#define BAD_INIT_NO_HINT 8 + +SUBSYSTEM_DEF(atoms) + name = "Atoms" + init_order = INIT_ORDER_ATOMS + flags = SS_NO_FIRE + + var/old_initialized + + var/list/late_loaders + var/list/created_atoms + + var/list/BadInitializeCalls = list() + + +/datum/controller/subsystem/atoms/Initialize(timeofday) + setupgenetics() + initialized = INITIALIZATION_INNEW_MAPLOAD + InitializeAtoms() + + + +/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms) + if(initialized == INITIALIZATION_INSSATOMS) + return + + initialized = INITIALIZATION_INNEW_MAPLOAD + + LAZYINITLIST(late_loaders) + + var/watch = start_watch() + log_startup_progress("Initializing atoms...") + var/count + var/list/mapload_arg = list(TRUE) + if(atoms) + created_atoms = list() + count = atoms.len + for(var/I in atoms) + var/atom/A = I + if(!A.initialized) + if(InitAtom(I, mapload_arg)) + atoms -= I + CHECK_TICK + else + count = 0 + for(var/atom/A in world) + if(!A.initialized) + InitAtom(A, mapload_arg) + ++count + CHECK_TICK + + log_startup_progress(" Initialized [count] atoms in [stop_watch(watch)]s") + pass(count) + + initialized = INITIALIZATION_INNEW_REGULAR + + if(late_loaders.len) + watch = start_watch() + log_startup_progress("Late-initializing atoms...") + for(var/I in late_loaders) + var/atom/A = I + A.LateInitialize() + log_startup_progress(" Late initialized [late_loaders.len] atoms in [stop_watch(watch)]s") + late_loaders.Cut() + + if(atoms) + . = created_atoms + atoms + created_atoms = null + +/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments) + var/the_type = A.type + if(QDELING(A)) + BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE + return TRUE + + var/start_tick = world.time + + var/result = A.Initialize(arglist(arguments)) + + if(start_tick != world.time) + BadInitializeCalls[the_type] |= BAD_INIT_SLEPT + + var/qdeleted = FALSE + + if(result != INITIALIZE_HINT_NORMAL) + switch(result) + if(INITIALIZE_HINT_LATELOAD) + if(arguments[1]) //mapload + late_loaders += A + else + A.LateInitialize() + if(INITIALIZE_HINT_QDEL) + qdel(A) + qdeleted = TRUE + else + BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT + + if(!A) //possible harddel + qdeleted = TRUE + else if(!A.initialized) + BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT + + return qdeleted || QDELING(A) + +/datum/controller/subsystem/atoms/proc/map_loader_begin() + old_initialized = initialized + initialized = INITIALIZATION_INSSATOMS + +/datum/controller/subsystem/atoms/proc/map_loader_stop() + initialized = old_initialized + +/datum/controller/subsystem/atoms/Recover() + initialized = SSatoms.initialized + if(initialized == INITIALIZATION_INNEW_MAPLOAD) + InitializeAtoms() + old_initialized = SSatoms.old_initialized + BadInitializeCalls = SSatoms.BadInitializeCalls \ No newline at end of file diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 067114e52be..823294e4d4e 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -43,20 +43,20 @@ SUBSYSTEM_DEF(garbage) var/list/counts = list() for(var/list/L in queues) counts += length(L) - msg += "Q:[counts.Join(",")]|D:[delslasttick]|G:[gcedlasttick]|" + msg += "Queue:[counts.Join(",")] | Del's:[delslasttick] | Soft:[gcedlasttick] |" msg += "GR:" if(!(delslasttick + gcedlasttick)) msg += "n/a|" else - msg += "[round((gcedlasttick / (delslasttick + gcedlasttick)) * 100, 0.01)]%|" + msg += "[round((gcedlasttick / (delslasttick + gcedlasttick)) * 100, 0.01)]% |" - msg += "TD:[totaldels]|TG:[totalgcs]|" + msg += "Total Dels:[totaldels] | Soft:[totalgcs] |" if(!(totaldels + totalgcs)) msg += "n/a|" else - msg += "TGR:[round((totalgcs / (totaldels + totalgcs)) * 100, 0.01)]%" - msg += " P:[pass_counts.Join(",")]" - msg += "|F:[fail_counts.Join(",")]" + msg += "TGR:[round((totalgcs / (totaldels + totalgcs)) * 100, 0.01)]% |" + msg += " Pass:[pass_counts.Join(",")]" + msg += " | Fail:[fail_counts.Join(",")]" ..(msg) /* TO-DO diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm new file mode 100644 index 00000000000..8f914202dcf --- /dev/null +++ b/code/controllers/subsystem/machinery.dm @@ -0,0 +1,145 @@ +#define SSMACHINES_DEFERREDPOWERNETS 1 +#define SSMACHINES_POWERNETS 2 +#define SSMACHINES_PREMACHINERY 3 +#define SSMACHINES_MACHINERY 4 +SUBSYSTEM_DEF(machines) + name = "Machines" + init_order = INIT_ORDER_MACHINES + flags = SS_KEEP_TIMING + + var/list/processing = list() + var/list/currentrun = list() + var/list/powernets = list() + var/list/deferred_powernet_rebuilds = list() + + var/currentpart = SSMACHINES_DEFERREDPOWERNETS + +/datum/controller/subsystem/machines/Initialize() + makepowernets() + fire() + ..() + +/datum/controller/subsystem/machines/proc/makepowernets() + for(var/datum/powernet/PN in powernets) + qdel(PN) + powernets.Cut() + + for(var/obj/structure/cable/PC in GLOB.cable_list) + if(!PC.powernet) + var/datum/powernet/NewPN = new() + NewPN.add_cable(PC) + propagate_network(PC,PC.powernet) + +/datum/controller/subsystem/machines/stat_entry() + ..("Machines: [processing.len]\nPowernets: [powernets.len]\tDeferred: [deferred_powernet_rebuilds.len]") + +/datum/controller/subsystem/machines/proc/process_defered_powernets(resumed = 0) + if(!resumed) + src.currentrun = deferred_powernet_rebuilds.Copy() + //cache for sanid speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/obj/O = currentrun[currentrun.len] + currentrun.len-- + if(O) + var/datum/powernet/newPN = new() // create a new powernet... + propagate_network(O, newPN)//... and propagate it to the other side of the cable + else + deferred_powernet_rebuilds.Remove(O) + if(MC_TICK_CHECK) + return + +/datum/controller/subsystem/machines/proc/process_powernets(resumed = 0) + if(!resumed) + src.currentrun = powernets.Copy() + //cache for sanid speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/datum/powernet/P = currentrun[currentrun.len] + currentrun.len-- + if(P) + P.reset() // reset the power state + else + powernets.Remove(P) + if(MC_TICK_CHECK) + return + +/datum/controller/subsystem/machines/proc/process_premachines(resumed = 0) + /* Literally exists as snowflake for fucking powersinks goddamnit */ + if(!resumed) + src.currentrun = processing_power_items.Copy() + //cache for sanid speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/obj/item/I = currentrun[currentrun.len] + currentrun.len-- + if(!QDELETED(I)) + if(!I.pwr_drain()) + processing_power_items.Remove(I) + else + processing_power_items.Remove(I) + if(MC_TICK_CHECK) + return + +/datum/controller/subsystem/machines/proc/process_machines(resumed = 0) + var/seconds = wait * 0.1 + if(!resumed) + src.currentrun = processing.Copy() + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/obj/machinery/thing = currentrun[currentrun.len] + currentrun.len-- + if(!QDELETED(thing) && thing.process(seconds) != PROCESS_KILL) + if(thing.use_power) + thing.auto_use_power() //add back the power state + else + processing -= thing + if(!QDELETED(thing)) + thing.isprocessing = FALSE + if(MC_TICK_CHECK) + return + +/datum/controller/subsystem/machines/fire(resumed = 0) + if(currentpart == SSMACHINES_DEFERREDPOWERNETS || !resumed) + process_defered_powernets(resumed) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = SSMACHINES_POWERNETS + + if(currentpart == SSMACHINES_POWERNETS || !resumed) + process_powernets(resumed) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = SSMACHINES_PREMACHINERY + + if(currentpart == SSMACHINES_PREMACHINERY || !resumed) + process_premachines(resumed) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = SSMACHINES_MACHINERY + + if(currentpart == SSMACHINES_MACHINERY || !resumed) + process_machines(resumed) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = SSMACHINES_DEFERREDPOWERNETS + + +/datum/controller/subsystem/machines/proc/setup_template_powernets(list/cables) + for(var/A in cables) + var/obj/structure/cable/PC = A + if(!PC.powernet) + var/datum/powernet/NewPN = new() + NewPN.add_cable(PC) + propagate_network(PC,PC.powernet) + +/datum/controller/subsystem/machines/Recover() + if(istype(SSmachines.processing)) + processing = SSmachines.processing + if(istype(SSmachines.powernets)) + powernets = SSmachines.powernets diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm new file mode 100644 index 00000000000..03989d24af2 --- /dev/null +++ b/code/controllers/subsystem/mobs.dm @@ -0,0 +1,28 @@ +SUBSYSTEM_DEF(mobs) + name = "Mobs" + priority = FIRE_PRIORITY_MOBS + flags = SS_KEEP_TIMING | SS_NO_INIT + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/list/currentrun = list() + +/datum/controller/subsystem/mobs/stat_entry() + ..("P:[mob_list.len]") + +/datum/controller/subsystem/mobs/fire(resumed = 0) + var/seconds = wait * 0.1 + if(!resumed) + src.currentrun = mob_list.Copy() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + var/times_fired = src.times_fired + while(currentrun.len) + var/mob/M = currentrun[currentrun.len] + currentrun.len-- + if(M) + M.Life(seconds, times_fired) + else + mob_list.Remove(M) + if(MC_TICK_CHECK) + return \ No newline at end of file diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm new file mode 100644 index 00000000000..92254454219 --- /dev/null +++ b/code/controllers/subsystem/processing/processing.dm @@ -0,0 +1,38 @@ +//Used to process objects. Fires once every second. + +//TODO: Implement fully when process scheduler dies +/* +SUBSYSTEM_DEF(processing) + name = "Processing" + priority = FIRE_PRIORITY_PROCESS + flags = SS_BACKGROUND|SS_POST_FIRE_TIMING|SS_NO_INIT + wait = 10 + + var/stat_tag = "P" //Used for logging + var/list/processing = list() + var/list/currentrun = list() + +/datum/controller/subsystem/processing/stat_entry() + ..("[stat_tag]:[processing.len]") + +/datum/controller/subsystem/processing/fire(resumed = 0) + if (!resumed) + currentrun = processing.Copy() + //cache for sanic speed (lists are references anyways) + var/list/current_run = currentrun + + while(current_run.len) + var/datum/thing = current_run[current_run.len] + current_run.len-- + if(QDELETED(thing) || thing.process(wait) == PROCESS_KILL) + processing -= thing + if (MC_TICK_CHECK) + return +*/ +/datum/var/isprocessing = FALSE +/* +/datum/proc/process() + set waitfor = 0 + STOP_PROCESSING(SSobj, src) + return 0 +*/ \ No newline at end of file diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 73104f212ff..7fcce1238a5 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -82,7 +82,7 @@ debug_variables(SSfires) feedback_add_details("admin_verb","DFires") if("Mob") - debug_variables(mob_master) + debug_variables(SSmobs) feedback_add_details("admin_verb","DMob") if("NPC AI") debug_variables(npcai_master) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 83880039a73..8a9a108c7b3 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -42,10 +42,16 @@ power_equip = 0 //rastaf0 power_environ = 0 //rastaf0 - power_change() // all machines set to current power level, also updates lighting icon - blend_mode = BLEND_MULTIPLY // Putting this in the constructor so that it stops the icons being screwed up in the map editor. +/area/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/area/LateInitialize() + . = ..() + power_change() // all machines set to current power level, also updates lighting icon + /area/proc/get_cameras() var/list/cameras = list() for(var/obj/machinery/camera/C in src) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d57199d5f91..5f09e2d5349 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -42,6 +42,62 @@ var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff. + var/initialized = FALSE + +/atom/New(loc, ...) + if(use_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New() + _preloader.load(src) + . = ..() + attempt_init(...) + +// This is distinct from /tg/ because of our space management system +// This is overriden in /atom/movable and the parent isn't called if the SMS wants to deal with it's init +/atom/proc/attempt_init(loc, ...) + var/do_initialize = SSatoms.initialized + if(do_initialize != INITIALIZATION_INSSATOMS) + args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD + if(SSatoms.InitAtom(src, args)) + // we were deleted + return + + +//Called after New if the map is being loaded. mapload = TRUE +//Called from base of New if the map is not being loaded. mapload = FALSE +//This base must be called or derivatives must set initialized to TRUE +//must not sleep +//Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE +//Must return an Initialize hint. Defined in __DEFINES/subsystems.dm + +//Note: the following functions don't call the base for optimization and must copypasta: +// /turf/Initialize +// /turf/open/space/Initialize + +/atom/proc/Initialize(mapload, ...) + if(initialized) + stack_trace("Warning: [src]([type]) initialized multiple times!") + initialized = TRUE + + if(light_power && light_range) + update_light() + + if(opacity && isturf(loc)) + var/turf/T = loc + T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guranteed to be on afterwards anyways. + + ComponentInitialize() + + return INITIALIZE_HINT_NORMAL + + +//called if Initialize returns INITIALIZE_HINT_LATELOAD +/atom/proc/LateInitialize() + return + +// Put your AddComponent() calls here +/atom/proc/ComponentInitialize() + return + + /atom/proc/onCentcom() var/turf/T = get_turf(src) if(!T) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 3fdc402bb8a..714edc0fbfc 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -24,16 +24,19 @@ var/area/areaMaster - var/auto_init = 1 - /atom/movable/New() . = ..() areaMaster = get_area_master(src) - // If you're wondering what goofery this is, this is for things that need the environment - // around them set up - like `air_update_turf` and the like - if((ticker && ticker.current_state >= GAME_STATE_SETTING_UP)) - attempt_init() +/atom/movable/attempt_init() + if(ticker && ticker.current_state >= GAME_STATE_SETTING_UP) + var/turf/T = get_turf(src) + if(T && space_manager.is_zlevel_dirty(T.z)) + space_manager.postpone_init(T.z, src) + return + . = ..() + + /atom/movable/Destroy() if(loc) @@ -53,19 +56,6 @@ pulledby = null return ..() -// used to provide a good interface for the init delay system to step in -// and we don't need to call `get_turf` until the game's started -// at which point object creations are a fair toss more seldom -/atom/movable/proc/attempt_init() - var/turf/T = get_turf(src) - if(T && space_manager.is_zlevel_dirty(T.z)) - space_manager.postpone_init(T.z, src) - else if(auto_init) - initialize() - -/atom/movable/proc/initialize() - return - // Used in shuttle movement and AI eye stuff. // Primarily used to notify objects being moved by a shuttle/bluespace fuckup. /atom/movable/proc/setLoc(var/T, var/teleported=0) diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index c6dc0833afb..bae37c04c2c 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -62,7 +62,7 @@ factory.spores += src ..() -/mob/living/simple_animal/hostile/blob/blobspore/Life() +/mob/living/simple_animal/hostile/blob/blobspore/Life(seconds, times_fired) if(!is_zombie && isturf(src.loc)) for(var/mob/living/carbon/human/H in oview(src,1)) //Only for corpse right next to/on same tile diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 9dcb5b7e3eb..0e1fc7daa86 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -60,7 +60,7 @@ /obj/structure/blob/core/RegenHealth() return // Don't regen, we handle it in Life() -/obj/structure/blob/core/Life() +/obj/structure/blob/core/Life(seconds, times_fired) if(!overmind) create_overmind() else diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index 232511744ea..19ac320287a 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -28,7 +28,7 @@ processing_objects.Remove(src) return ..() -/obj/structure/blob/node/Life() +/obj/structure/blob/node/Life(seconds, times_fired) if(overmind) for(var/i = 1; i < 8; i += i) Pulse(5, i, overmind.blob_reagent_datum.color) diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 5da84fbc460..60ea94befb0 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -36,7 +36,7 @@ updateallghostimages() ..() -/mob/camera/blob/Life() +/mob/camera/blob/Life(seconds, times_fired) if(!blob_core) qdel(src) ..() diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index b0b879a30ab..10cd5473279 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -27,7 +27,7 @@ var/obj/machinery/computer/camera_advanced/abductor/camera var/list/datum/icon_snapshot/disguises = list() -/obj/machinery/abductor/console/initialize() +/obj/machinery/abductor/console/Initialize() ..() Link_Abduction_Equipment() diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index e9a830e7ed6..96b83c9a8da 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -243,7 +243,7 @@ to_chat(M, "Borer Communication from [B] ([ghost_follow_link(src, ghost=M)]): [input]") to_chat(src, "[B.truename] says: [input]") -/mob/living/simple_animal/borer/Life() +/mob/living/simple_animal/borer/Life(seconds, times_fired) ..() diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 822bfc9ce29..f76830910b1 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -57,7 +57,7 @@ else holder.icon_state = "hudhealthy" -/mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies +/mob/living/simple_animal/hostile/guardian/Life(seconds, times_fired) //Dies if the summoner dies ..() if(summoner) if(summoner.stat == DEAD) diff --git a/code/game/gamemodes/miniantags/guardian/types/assassin.dm b/code/game/gamemodes/miniantags/guardian/types/assassin.dm index 426824f2e8c..5eb8c1b1cec 100644 --- a/code/game/gamemodes/miniantags/guardian/types/assassin.dm +++ b/code/game/gamemodes/miniantags/guardian/types/assassin.dm @@ -13,7 +13,7 @@ var/obj/screen/alert/canstealthalert var/obj/screen/alert/instealthalert -/mob/living/simple_animal/hostile/guardian/assassin/Life() +/mob/living/simple_animal/hostile/guardian/assassin/Life(seconds, times_fired) . = ..() updatestealthalert() if(loc == summoner && toggle) diff --git a/code/game/gamemodes/miniantags/guardian/types/fire.dm b/code/game/gamemodes/miniantags/guardian/types/fire.dm index 2a9dc2d2c8e..61905f942d2 100644 --- a/code/game/gamemodes/miniantags/guardian/types/fire.dm +++ b/code/game/gamemodes/miniantags/guardian/types/fire.dm @@ -13,7 +13,7 @@ bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to sow havoc at random." var/toggle = FALSE -/mob/living/simple_animal/hostile/guardian/fire/Life() //Dies if the summoner dies +/mob/living/simple_animal/hostile/guardian/fire/Life(seconds, times_fired) //Dies if the summoner dies ..() if(summoner) summoner.ExtinguishMob() diff --git a/code/game/gamemodes/miniantags/guardian/types/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm index d51e4cefd45..c679beac91a 100644 --- a/code/game/gamemodes/miniantags/guardian/types/healer.dm +++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm @@ -32,7 +32,7 @@ /mob/living/simple_animal/hostile/guardian/healer/New() ..() -/mob/living/simple_animal/hostile/guardian/healer/Life() +/mob/living/simple_animal/hostile/guardian/healer/Life(seconds, times_fired) ..() var/datum/atom_hud/medsensor = huds[DATA_HUD_MEDICAL_ADVANCED] medsensor.add_hud_to(src) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 49380c57863..fa659b50c43 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -54,7 +54,7 @@ var/image/ghostimage = null //Visible to ghost with darkness off -/mob/living/simple_animal/revenant/Life() +/mob/living/simple_animal/revenant/Life(seconds, times_fired) ..() if(revealed && essence <= 0) death() diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 42827d27f59..aeb26f58822 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -82,7 +82,7 @@ to_chat(src, "Objective #[2]: [fluffObjective.explanation_text]") -/mob/living/simple_animal/slaughter/Life() +/mob/living/simple_animal/slaughter/Life(seconds, times_fired) ..() if(boost[usr] attaches [src] to [target].", "You attach [src] to [target].") attached = target - machine_processing += src + START_PROCESSING(SSmachines, src) update_icon() else to_chat(usr, "There's nothing attached to the IV drip!") diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 9862d952244..343734804cb 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -44,7 +44,7 @@ src.on = src.area.lightswitch updateicon() -/obj/machinery/light_switch/initialize() +/obj/machinery/light_switch/Initialize() ..() set_frequency(frequency) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 34842a64b76..18fc505a49b 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -119,7 +119,7 @@ Class Procs: atom_say_verb = "beeps" var/speed_process = 0 // Process as fast as possible? -/obj/machinery/initialize() +/obj/machinery/Initialize() addAtProcessing() . = ..() power_change() @@ -128,24 +128,26 @@ Class Procs: if(use_power) myArea = get_area_master(src) if(!speed_process) - machine_processing += src + START_PROCESSING(SSmachines, src) else fast_processing += src + isprocessing = TRUE // all of these isprocessing = TRUE can be removed when the PS is dead // gotta go fast /obj/machinery/proc/makeSpeedProcess() if(speed_process) return speed_process = 1 - machine_processing -= src + STOP_PROCESSING(SSmachines, src) fast_processing += src + isprocessing = TRUE // gotta go slow /obj/machinery/proc/makeNormalProcess() if(!speed_process) return speed_process = 0 - machine_processing += src + START_PROCESSING(SSmachines, src) fast_processing -= src /obj/machinery/New() //new @@ -158,7 +160,7 @@ Class Procs: if(myArea) myArea = null fast_processing -= src - machine_processing -= src + STOP_PROCESSING(SSmachines, src) machines -= src return ..() @@ -309,7 +311,7 @@ Class Procs: re_init=1 if(re_init) - initialize() + Initialize() if(update_mt_menu) //usr.set_machine(src) update_multitool_menu(usr) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 24251977ca9..6ef4d064ac7 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -14,7 +14,7 @@ src.dir = pick(1,2,3,4) ..() -/obj/machinery/shield/initialize() +/obj/machinery/shield/Initialize() air_update_turf(1) ..() diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 414ec8d2e62..a77bd744f92 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -54,7 +54,7 @@ return ..() // register for radio system -/obj/machinery/status_display/initialize() +/obj/machinery/status_display/Initialize() ..() if(radio_controller) radio_controller.add_object(src, frequency) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 59f9a667584..7ec64373373 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -131,7 +131,7 @@ singulo.target = src icon_state = "[icontype]1" active = 1 - machine_processing |= src + START_PROCESSING(SSmachines, src) if(user) to_chat(user, "You activate the beacon.") diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 00465cf8b8b..9dc30edf61e 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -116,7 +116,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() // TODO: Make the radio system cooperate with the space manager listening_level = position.z -/obj/machinery/telecomms/initialize() +/obj/machinery/telecomms/Initialize() ..() if(autolinkers.len) // Links nearby machines diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index fa8f2e8d084..a1248fc0b6d 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -18,7 +18,7 @@ ..() return -/obj/machinery/computer/teleporter/initialize() +/obj/machinery/computer/teleporter/Initialize() ..() link_power_station() update_icon() @@ -293,7 +293,7 @@ component_parts += new /obj/item/stock_parts/matter_bin/super(null) RefreshParts() -/obj/machinery/teleport/hub/initialize() +/obj/machinery/teleport/hub/Initialize() ..() link_power_station() @@ -472,7 +472,7 @@ RefreshParts() link_console_and_hub() -/obj/machinery/teleport/station/initialize() +/obj/machinery/teleport/station/Initialize() ..() link_console_and_hub() diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 8df55e1bc66..d6ae98cb516 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -64,7 +64,7 @@ A.turret_controls -= src return ..() -/obj/machinery/turretid/initialize() +/obj/machinery/turretid/Initialize() ..() if(!control_area) control_area = get_area(src) diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 866cb7580f6..7706f3120f0 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -444,7 +444,6 @@ if(!PN) PN = new() - powernets += PN NC.powernet = PN PN.cables += NC NC.mergeConnectedNetworks(NC.d2) diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index b14825c7cc0..a34d43098cb 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -177,7 +177,7 @@ return data -/obj/machinery/computer/mech_bay_power_console/initialize() +/obj/machinery/computer/mech_bay_power_console/Initialize() reconnect() update_icon() return ..() diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index cb218395735..17723adcde7 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -172,7 +172,7 @@ desc = "A lightweight foamed metal wall." var/metal = MFOAM_ALUMINUM -/obj/structure/foamedmetal/initialize() +/obj/structure/foamedmetal/Initialize() ..() air_update_turf(1) diff --git a/code/game/objects/effects/spawners/windowspawner.dm b/code/game/objects/effects/spawners/windowspawner.dm index a2517d093f8..6d271039070 100644 --- a/code/game/objects/effects/spawners/windowspawner.dm +++ b/code/game/objects/effects/spawners/windowspawner.dm @@ -7,7 +7,8 @@ var/windowtospawn = /obj/structure/window/basic anchored = 1 // No sliding out while you prime -/obj/effect/spawner/window/initialize() +/obj/effect/spawner/window/Initialize() + ..() spawn(0) var/turf/T = get_turf(src) for(var/obj/structure/grille/G in get_turf(src)) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 944a6e0d5f9..e7156cb6888 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -12,7 +12,7 @@ var/on = 0 var/brightness_on = 4 //luminosity when on -/obj/item/flashlight/initialize() +/obj/item/flashlight/Initialize() ..() if(on) icon_state = "[initial(icon_state)]-on" diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm index b55efc665b2..3a0f2b6941d 100644 --- a/code/game/objects/items/devices/instruments.dm +++ b/code/game/objects/items/devices/instruments.dm @@ -21,7 +21,7 @@ user.visible_message("[user] begins to play 'Gloomy Sunday'! It looks like \he's trying to commit suicide!") return (BRUTELOSS) -/obj/item/instrument/initialize(mapload) +/obj/item/instrument/Initialize(mapload) song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded ..() diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 55465218b99..51aa645a139 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -21,7 +21,7 @@ ..() internal_channels.Cut() -/obj/item/radio/headset/initialize() +/obj/item/radio/headset/Initialize() ..() if(ks1type) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index d61aea153d7..003248cdfbc 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -83,7 +83,8 @@ var/global/list/default_medbay_channels = list( return ..() -/obj/item/radio/initialize() +/obj/item/radio/Initialize() + ..() if(frequency < RADIO_LOW_FREQ || frequency > RADIO_HIGH_FREQ) frequency = sanitize_frequency(frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) set_frequency(frequency) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index c4506396f45..76deeac93e8 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -30,7 +30,7 @@ var/resintype = null smooth = SMOOTH_TRUE -/obj/structure/alien/resin/initialize() +/obj/structure/alien/resin/Initialize() air_update_turf(1) ..() diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 6d03ca4fdef..4ea0fc34e2d 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -25,7 +25,7 @@ var/health = 50.0 -/obj/structure/inflatable/initialize(location) +/obj/structure/inflatable/Initialize(location) ..() air_update_turf(1) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index f4a2990918b..e0e9ba1b6a7 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -24,7 +24,7 @@ ..() initial_state = icon_state -/obj/structure/mineral_door/initialize() +/obj/structure/mineral_door/Initialize() ..() air_update_turf(1) diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm index 131a355feb2..6be7bf072d8 100644 --- a/code/game/objects/structures/misc.dm +++ b/code/game/objects/structures/misc.dm @@ -87,7 +87,7 @@ var/atom/attack_atom -/obj/structure/ghost_beacon/initialize() +/obj/structure/ghost_beacon/Initialize() . = ..() last_ghost_alert = world.time attack_atom = src diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 3e5d3386e0a..60ca03ad0f7 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -29,7 +29,7 @@ anchored = 1.0 var/open_sound = 'sound/items/Deconstruct.ogg' -/obj/structure/morgue/initialize() +/obj/structure/morgue/Initialize() . = ..() update() diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index da4c1181f01..b8c28046bd3 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -295,7 +295,7 @@ QDEL_NULL(song) return ..() -/obj/structure/piano/initialize() +/obj/structure/piano/Initialize() song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded ..() diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index caa1bf48b4b..8ea6a3c0cce 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -7,7 +7,8 @@ anchored = 1 var/notices = 0 -/obj/structure/noticeboard/initialize() +/obj/structure/noticeboard/Initialize() + ..() for(var/obj/item/I in loc) if(notices > 4) break if(istype(I, /obj/item/paper)) diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index f0a2c28af85..8d22732e5dd 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -124,7 +124,7 @@ name = "airtight plastic flaps" desc = "Heavy duty, airtight, plastic flaps." -/obj/structure/plasticflaps/mining/initialize() +/obj/structure/plasticflaps/mining/Initialize() air_update_turf(1) ..() diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 315728ddc16..44c9da74b20 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -30,7 +30,8 @@ FLOOR SAFES tumbler_2_open = rand(0, 71) -/obj/structure/safe/initialize() +/obj/structure/safe/Initialize() + ..() for(var/obj/item/I in loc) if(space >= maxspace) return @@ -178,7 +179,7 @@ obj/structure/safe/ex_act(severity) layer = 2.5 -/obj/structure/safe/floor/initialize() +/obj/structure/safe/floor/Initialize() ..() var/turf/T = loc hide(T.intact) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index c93a0e5f1b8..aebd111ad26 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -386,7 +386,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f update_nearby_icons() return -/obj/structure/window/initialize() +/obj/structure/window/Initialize() air_update_turf(1) return ..() @@ -454,7 +454,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f update_nearby_icons() return -/obj/structure/window/plasmabasic/initialize() +/obj/structure/window/plasmabasic/Initialize() ..() air_update_turf(1) @@ -483,7 +483,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f update_nearby_icons() return -/obj/structure/window/plasmareinforced/initialize() +/obj/structure/window/plasmareinforced/Initialize() ..() air_update_turf(1) diff --git a/code/game/world.dm b/code/game/world.dm index 4ebeadedc6f..f5aee4fc492 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -16,10 +16,12 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG GLOB.timezoneOffset = text2num(time2text(0, "hh")) * 36000 + makeDatumRefLists() callHook("startup") src.update_status() + . = ..() // Create robolimbs for chargen. diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index 85591ee3159..de281d34e68 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -51,7 +51,7 @@ return feedback_add_details("admin_verb","CPOW") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - for(var/datum/powernet/PN in powernets) + for(var/datum/powernet/PN in SSmachines.powernets) if(!PN.nodes || !PN.nodes.len) if(PN.cables && (PN.cables.len > 1)) var/obj/structure/cable/C = PN.cables[1] diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 78f9fbd5de1..00966ee31fc 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -387,7 +387,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!check_rights(R_DEBUG)) return - makepowernets() + SSmachines.makepowernets() log_admin("[key_name(src)] has remade the powernet. makepowernets() called.") message_admins("[key_name_admin(src)] has remade the powernets. makepowernets() called.", 0) feedback_add_details("admin_verb","MPWN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/arcade/mob_hunt/battle_computer.dm b/code/modules/arcade/mob_hunt/battle_computer.dm index e5f2af123fb..8ae577fe338 100644 --- a/code/modules/arcade/mob_hunt/battle_computer.dm +++ b/code/modules/arcade/mob_hunt/battle_computer.dm @@ -27,11 +27,11 @@ team = "Blue" avatar_y_offset = 1 -/obj/machinery/computer/mob_battle_terminal/red/initialize() +/obj/machinery/computer/mob_battle_terminal/red/Initialize() ..() check_connection() -/obj/machinery/computer/mob_battle_terminal/blue/initialize() +/obj/machinery/computer/mob_battle_terminal/blue/Initialize() ..() check_connection() diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 1886cd4ee65..6a2019b9001 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -23,7 +23,8 @@ if(radio_controller) set_frequency(frequency) -/obj/item/assembly/signaler/initialize() +/obj/item/assembly/signaler/Initialize() + ..() if(radio_controller) set_frequency(frequency) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index e5c42e495f2..94e0ea2acce 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -29,7 +29,8 @@ var/brute_damage = 0 var/oxy_damage = 0 -/obj/effect/landmark/corpse/initialize() +/obj/effect/landmark/corpse/Initialize() + ..() if(istype(src,/obj/effect/landmark/corpse/clown)) var/obj/effect/landmark/corpse/clown/C = src C.chooseRank() diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index d964663298f..d5e2cbcd34d 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -9,7 +9,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null unacidable = 1 var/active = 0 -/obj/machinery/gateway/initialize() +/obj/machinery/gateway/Initialize() ..() update_icon() update_density_from_dir() @@ -44,7 +44,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null if(!the_gateway) the_gateway = src -/obj/machinery/gateway/centerstation/initialize() +/obj/machinery/gateway/centerstation/Initialize() ..() update_icon() wait = world.time + config.gateway_delay //+ thirty minutes default @@ -170,7 +170,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null var/obj/machinery/gateway/centeraway/stationgate = null -/obj/machinery/gateway/centeraway/initialize() +/obj/machinery/gateway/centeraway/Initialize() ..() update_icon() stationgate = locate(/obj/machinery/gateway/centerstation) in world diff --git a/code/modules/awaymissions/loot.dm b/code/modules/awaymissions/loot.dm index 49af9a43ce6..6497d62648a 100644 --- a/code/modules/awaymissions/loot.dm +++ b/code/modules/awaymissions/loot.dm @@ -5,7 +5,8 @@ var/lootdoubles = 0 //if the same item can be spawned twice var/loot = "" //a list of possible items to spawn- a string of paths -/obj/effect/spawner/away/lootdrop/initialize() +/obj/effect/spawner/away/lootdrop/Initialize() + ..() var/list/things = params2list(loot) if(things && things.len) diff --git a/code/modules/awaymissions/map_rng.dm b/code/modules/awaymissions/map_rng.dm index 64350c99737..7618996fdf9 100644 --- a/code/modules/awaymissions/map_rng.dm +++ b/code/modules/awaymissions/map_rng.dm @@ -18,13 +18,8 @@ template_name = tname if(template_name) template = map_templates[template_name] - // Catches the interim-zone of worldstart and roundstart - // I want both the ticker to exist (so mapped-in maploaders don't trip this) - // but also not have started yet (since the zlevel system would handle this on its own otherwise) - if((ticker && ticker.current_state < GAME_STATE_PLAYING)) - attempt_init() -/obj/effect/landmark/map_loader/initialize() +/obj/effect/landmark/map_loader/Initialize() ..() if(template) load(template) @@ -48,7 +43,7 @@ /obj/effect/landmark/map_loader/random var/template_list = "" -/obj/effect/landmark/map_loader/random/initialize() +/obj/effect/landmark/map_loader/random/Initialize() ..() if(template_list) template_name = safepick(splittext(template_list, ";")) diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm index b44fd01e45c..5ff625544fd 100644 --- a/code/modules/awaymissions/maploader/reader.dm +++ b/code/modules/awaymissions/maploader/reader.dm @@ -422,13 +422,6 @@ var/global/dmm_suite/preloader/_preloader = new return to_return -//atom creation method that preloads variables at creation -/atom/New() - if(use_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New() - _preloader.load(src) - - . = ..() - /dmm_suite/Destroy() ..() return QDEL_HINT_HARDDEL_NOW diff --git a/code/modules/awaymissions/mission_code/spacehotel.dm b/code/modules/awaymissions/mission_code/spacehotel.dm index d9299dfe061..2810320aaf7 100644 --- a/code/modules/awaymissions/mission_code/spacehotel.dm +++ b/code/modules/awaymissions/mission_code/spacehotel.dm @@ -54,7 +54,7 @@ name = "space hotel pamphlet" info = "

Welcome to Deep Space Hotel 419!

Thank you for choosing our hotel. Simply hand your credit or debit card to the concierge and get your room key! To check out, hand your credit card back.

Conditions:

  • The hotel is not responsible for any losses due to time or space anomalies.
  • The hotel is not responsible for events that occur outside of the hotel station, including, but not limited to, events that occur inside of dimensional pockets.
  • The hotel is not responsible for overcharging your account.
  • The hotel is not responsible for missing persons.
  • The hotel is not responsible for mind-altering effects due to drugs, magic, demons, or space worms.
" -/obj/effect/landmark/map_loader/hotel_room/initialize() +/obj/effect/landmark/map_loader/hotel_room/Initialize() ..() // load and randomly assign rooms var/global/list/south_room_templates = list() diff --git a/code/modules/awaymissions/zvis.dm b/code/modules/awaymissions/zvis.dm index 73bbff2198f..4324377149d 100644 --- a/code/modules/awaymissions/zvis.dm +++ b/code/modules/awaymissions/zvis.dm @@ -22,7 +22,7 @@ ..() levels += src -/obj/effect/levelref/initialize() +/obj/effect/levelref/Initialize() ..() for(var/obj/effect/levelref/O in levels) if(id == O.id && O != src) @@ -161,7 +161,7 @@ ..() portals += src -/obj/effect/view_portal/initialize() +/obj/effect/view_portal/Initialize() ..() if(id) for(var/obj/effect/view_portal/O in portals) diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 014f87ac310..6c34db0ad40 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -38,7 +38,7 @@ log transactions ..() machine_id = "[station_name()] RT #[num_financial_terminals++]" -/obj/machinery/atm/initialize() +/obj/machinery/atm/Initialize() ..() reconnect_database() diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index a527367ee2b..09a5d20833e 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -96,7 +96,7 @@ var/total_runtimes_skipped = 0 // Now to actually output the error info... log_world("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]") - log_runtime_txt("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]") + log_runtime_txt("Runtime in [e.file],[e.line]: [e]") for(var/line in desclines) log_world(line) log_runtime_txt(line) diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index a0b10f29f38..8df5d593b9b 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -24,7 +24,7 @@ var/tmp/busy = 0 var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/bible, /obj/item/tome) //Things allowed in the bookcase -/obj/structure/bookcase/initialize() +/obj/structure/bookcase/Initialize() ..() for(var/obj/item/I in loc) if(is_type_in_list(I, allowed_books)) diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 679f6fb86ef..075e3e47a20 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -40,16 +40,6 @@ else light = new /datum/light_source(src, .) -/atom/New() - . = ..() - - if(light_power && light_range) - update_light() - - if(opacity && isturf(loc)) - var/turf/T = loc - T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guranteed to be on afterwards anyways. - /atom/Destroy() if(light) light.destroy() diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index 6fe55eed0ff..1a421e6d1ad 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -9,7 +9,6 @@ invisibility = INVISIBILITY_LIGHTING color = LIGHTING_BASE_MATRIX icon_state = "light1" - auto_init = 0 // doesn't need special init blend_mode = BLEND_MULTIPLY var/lum_r = 0 diff --git a/code/modules/logic/logic_base.dm b/code/modules/logic/logic_base.dm index db891ab383c..519c47c408b 100644 --- a/code/modules/logic/logic_base.dm +++ b/code/modules/logic/logic_base.dm @@ -50,7 +50,7 @@ component_parts += LG component_parts += new /obj/item/stack/cable_coil(null, 1) -/obj/machinery/logic_gate/initialize() +/obj/machinery/logic_gate/Initialize() ..() set_frequency(frequency) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 4ab29741ef6..933ef9a6403 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -106,7 +106,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi Transfer_mind is there to check if mob is being deleted/not going to have a body. Works together with spawning an observer, noted above. */ -/mob/dead/observer/Life() +/mob/dead/observer/Life(seconds, times_fired) ..() if(!loc) return if(!client) return 0 @@ -419,7 +419,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(.) update_following() -/mob/Life() +/mob/Life(seconds, times_fired) // to catch teleports etc which directly set loc update_following() return ..() diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index a13fce956da..180d6bd8072 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/alien/humanoid/Life() +/mob/living/carbon/alien/humanoid/Life(seconds, times_fired) . = ..() update_icons() diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 4faa957163c..5bbb31c00d1 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/alien/larva/Life() +/mob/living/carbon/alien/larva/Life(seconds, times_fired) if(..()) //still breathing // GROW! if(amount_grown < max_grown) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5a47bb052d5..ee92382391c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -10,8 +10,7 @@ var/datum/species/species //Contains icon generation and language information, set during New(). var/obj/item/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. -/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna = 0) - +/mob/living/carbon/human/Initialize(mapload, new_species = null) if(!dna) dna = new /datum/dna(null) // Species name is handled by set_species() @@ -40,7 +39,7 @@ faction |= "\ref[M]" //what // Set up DNA. - if(!delay_ready_dna && dna) + if(dna) dna.ready_dna(src) dna.real_name = real_name sync_organ_dna(1) @@ -69,80 +68,80 @@ real_name = "Test Dummy" status_flags = GODMODE|CANPUSH -/mob/living/carbon/human/skrell/New(var/new_loc) - ..(new_loc, "Skrell") +/mob/living/carbon/human/skrell/Initialize(mapload) + ..(mapload, "Skrell") -/mob/living/carbon/human/tajaran/New(var/new_loc) - ..(new_loc, "Tajaran") +/mob/living/carbon/human/tajaran/Initialize(mapload) + ..(mapload, "Tajaran") -/mob/living/carbon/human/vulpkanin/New(var/new_loc) - ..(new_loc, "Vulpkanin") +/mob/living/carbon/human/vulpkanin/Initialize(mapload) + ..(mapload, "Vulpkanin") -/mob/living/carbon/human/unathi/New(var/new_loc) - ..(new_loc, "Unathi") +/mob/living/carbon/human/unathi/Initialize(mapload) + ..(mapload, "Unathi") -/mob/living/carbon/human/vox/New(var/new_loc) - ..(new_loc, "Vox") +/mob/living/carbon/human/vox/Initialize(mapload) + ..(mapload, "Vox") -/mob/living/carbon/human/voxarmalis/New(var/new_loc) - ..(new_loc, "Vox Armalis") +/mob/living/carbon/human/voxarmalis/Initialize(mapload) + ..(mapload, "Vox Armalis") -/mob/living/carbon/human/skeleton/New(var/new_loc) - ..(new_loc, "Skeleton") +/mob/living/carbon/human/skeleton/Initialize(mapload) + ..(mapload, "Skeleton") -/mob/living/carbon/human/kidan/New(var/new_loc) - ..(new_loc, "Kidan") +/mob/living/carbon/human/kidan/Initialize(mapload) + ..(mapload, "Kidan") -/mob/living/carbon/human/plasma/New(var/new_loc) - ..(new_loc, "Plasmaman") +/mob/living/carbon/human/plasma/Initialize(mapload) + ..(mapload, "Plasmaman") -/mob/living/carbon/human/slime/New(var/new_loc) - ..(new_loc, "Slime People") +/mob/living/carbon/human/slime/Initialize(mapload) + ..(mapload, "Slime People") -/mob/living/carbon/human/grey/New(var/new_loc) - ..(new_loc, "Grey") +/mob/living/carbon/human/grey/Initialize(mapload) + ..(mapload, "Grey") -/mob/living/carbon/human/abductor/New(var/new_loc) - ..(new_loc, "Abductor") +/mob/living/carbon/human/abductor/Initialize(mapload) + ..(mapload, "Abductor") -/mob/living/carbon/human/human/New(var/new_loc) - ..(new_loc, "Human") +/mob/living/carbon/human/human/Initialize(mapload) + ..(mapload, "Human") -/mob/living/carbon/human/diona/New(var/new_loc) - ..(new_loc, "Diona") +/mob/living/carbon/human/diona/Initialize(mapload) + ..(mapload, "Diona") -/mob/living/carbon/human/machine/New(var/new_loc) - ..(new_loc, "Machine") +/mob/living/carbon/human/machine/Initialize(mapload) + ..(mapload, "Machine") -/mob/living/carbon/human/shadow/New(var/new_loc) - ..(new_loc, "Shadow") +/mob/living/carbon/human/shadow/Initialize(mapload) + ..(mapload, "Shadow") -/mob/living/carbon/human/golem/New(var/new_loc) - ..(new_loc, "Golem") +/mob/living/carbon/human/golem/Initialize(mapload) + ..(mapload, "Golem") -/mob/living/carbon/human/wryn/New(var/new_loc) - ..(new_loc, "Wryn") +/mob/living/carbon/human/wryn/Initialize(mapload) + ..(mapload, "Wryn") -/mob/living/carbon/human/nucleation/New(var/new_loc) - ..(new_loc, "Nucleation") +/mob/living/carbon/human/nucleation/Initialize(mapload) + ..(mapload, "Nucleation") -/mob/living/carbon/human/drask/New(var/new_loc) - ..(new_loc, "Drask") +/mob/living/carbon/human/drask/Initialize(mapload) + ..(mapload, "Drask") -/mob/living/carbon/human/monkey/New(var/new_loc) - ..(new_loc, "Monkey") +/mob/living/carbon/human/monkey/Initialize(mapload) + ..(mapload, "Monkey") -/mob/living/carbon/human/farwa/New(var/new_loc) - ..(new_loc, "Farwa") +/mob/living/carbon/human/farwa/Initialize(mapload) + ..(mapload, "Farwa") -/mob/living/carbon/human/wolpin/New(var/new_loc) - ..(new_loc, "Wolpin") +/mob/living/carbon/human/wolpin/Initialize(mapload) + ..(mapload, "Wolpin") -/mob/living/carbon/human/neara/New(var/new_loc) - ..(new_loc, "Neara") +/mob/living/carbon/human/neara/Initialize(mapload) + ..(mapload, "Neara") -/mob/living/carbon/human/stok/New(var/new_loc) - ..(new_loc, "Stok") +/mob/living/carbon/human/stok/Initialize(mapload) + ..(mapload, "Stok") /mob/living/carbon/human/Stat() ..() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 64395954672..00de7814170 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/human/Life() +/mob/living/carbon/human/Life(seconds, times_fired) life_tick++ voice = GetVoice() @@ -32,7 +32,7 @@ //Update our name based on whether our face is obscured/disfigured name = get_visible_name() - pulse = handle_pulse() + pulse = handle_pulse(times_fired) if(mind && mind.vampire) mind.vampire.handle_vampire() @@ -902,9 +902,8 @@ hud_used.lingchemdisplay.invisibility = 101 -/mob/living/carbon/human/proc/handle_pulse() - - if(mob_master.current_cycle % 5) +/mob/living/carbon/human/proc/handle_pulse(times_fired) + if(times_fired % 5 == 1) return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load) if(NO_BLOOD in species.species_traits) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index f61c5431fab..3023d6538a8 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/Life() +/mob/living/carbon/Life(seconds, times_fired) set invisibility = 0 set background = BACKGROUND_ENABLED @@ -14,7 +14,7 @@ O.on_life() handle_changeling() - handle_wetness() + handle_wetness(times_fired) // Increase germ_level regularly if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level @@ -26,8 +26,8 @@ /////////////// //Start of a breath chain, calls breathe() -/mob/living/carbon/handle_breathing() - if(mob_master.current_cycle % 4 == 2 || failed_last_breath) +/mob/living/carbon/handle_breathing(times_fired) + if(times_fired % 4 == 2 || failed_last_breath) breathe() //Breathe per 4 ticks, unless suffocating else if(istype(loc, /obj/)) @@ -241,11 +241,11 @@ reagents.metabolize(src) -/mob/living/carbon/proc/handle_wetness() - if(mob_master.current_cycle%20==2) //dry off a bit once every 20 ticks or so +/mob/living/carbon/proc/handle_wetness(times_fired) + if(times_fired % 20==2) //dry off a bit once every 20 ticks or so wetlevel = max(wetlevel - 1,0) -/mob/living/carbon/handle_stomach() +/mob/living/carbon/handle_stomach(times_fired) for(var/mob/living/M in stomach_contents) if(M.loc != src) stomach_contents.Remove(M) @@ -255,7 +255,7 @@ stomach_contents.Remove(M) qdel(M) continue - if(mob_master.current_cycle%3==1) + if(times_fired % 3 == 1) M.adjustBruteLoss(5) nutrition += 10 diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm index ced452ab652..80ed9fdbffd 100644 --- a/code/modules/mob/living/carbon/slime/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -5,7 +5,7 @@ var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while var/SStun = 0 // stun variable -/mob/living/carbon/slime/Life() +/mob/living/carbon/slime/Life(seconds, times_fired) if(..()) handle_nutrition() handle_targets() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 8c414636349..f02065b3a0a 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -1,4 +1,4 @@ -/mob/living/Life() +/mob/living/Life(seconds, times_fired) set invisibility = 0 set background = BACKGROUND_ENABLED @@ -22,7 +22,7 @@ handle_mutations_and_radiation() //Breathing, if applicable - handle_breathing() + handle_breathing(times_fired) //Random events (vomiting etc) handle_random_events() @@ -38,7 +38,7 @@ handle_fire() //stuff in the stomach - handle_stomach() + handle_stomach(times_fired) update_gravity(mob_has_gravity()) @@ -61,7 +61,7 @@ ..() -/mob/living/proc/handle_breathing() +/mob/living/proc/handle_breathing(times_fired) return /mob/living/proc/handle_mutations_and_radiation() @@ -80,7 +80,7 @@ /mob/living/proc/handle_environment(datum/gas_mixture/environment) return -/mob/living/proc/handle_stomach() +/mob/living/proc/handle_stomach(times_fired) return /mob/living/proc/update_pulling() diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 13b5308bc86..5b3eeb92eef 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -3,7 +3,7 @@ #define POWER_RESTORATION_SEARCH_APC 2 #define POWER_RESTORATION_APC_FOUND 3 -/mob/living/silicon/ai/Life() +/mob/living/silicon/ai/Life(seconds, times_fired) //doesn't call parent because it's a horrible mess if(stat == DEAD) return diff --git a/code/modules/mob/living/silicon/decoy/life.dm b/code/modules/mob/living/silicon/decoy/life.dm index ade3c535506..353bf4259ff 100644 --- a/code/modules/mob/living/silicon/decoy/life.dm +++ b/code/modules/mob/living/silicon/decoy/life.dm @@ -1,4 +1,4 @@ -/mob/living/silicon/decoy/Life() +/mob/living/silicon/decoy/Life(seconds, times_fired) if(src.stat == 2) return else diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index ec40dff7739..abcfc6bd643 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -1,4 +1,4 @@ -/mob/living/silicon/pai/Life() +/mob/living/silicon/pai/Life(seconds, times_fired) . = ..() if(.) //if(secHUD == 1) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index f42f19b67fa..afa10c1772b 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -1,4 +1,4 @@ -/mob/living/silicon/robot/Life() +/mob/living/silicon/robot/Life(seconds, times_fired) set invisibility = 0 set background = BACKGROUND_ENABLED diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index c292d33f39a..ef5de1908a8 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -267,7 +267,7 @@ Auto Patrol: []"}, C.visible_message("[src] has [harmbaton ? "beaten" : "stunned"] [C]!",\ "[src] has [harmbaton ? "beaten" : "stunned"] you!") -/mob/living/simple_animal/bot/secbot/Life() +/mob/living/simple_animal/bot/secbot/Life(seconds, times_fired) . = ..() if(flashing_lights) switch(light_color) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index b942ce4107b..a6fcf4b5a20 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -285,7 +285,7 @@ AIStatus = AI_ON environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP -/mob/living/simple_animal/hostile/construct/behemoth/Life() +/mob/living/simple_animal/hostile/construct/behemoth/Life(seconds, times_fired) weakened = 0 return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 7afa9debe25..ea7db302c43 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -46,7 +46,7 @@ Read_Memory() ..() -/mob/living/simple_animal/pet/cat/Runtime/Life() +/mob/living/simple_animal/pet/cat/Runtime/Life(seconds, times_fired) if(!cats_deployed && ticker.current_state >= GAME_STATE_SETTING_UP) Deploy_The_Cats() if(!stat && ticker.current_state == GAME_STATE_FINISHED && !memory_saved) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 24772ff473c..613f91e024c 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -37,7 +37,7 @@ if(gender == NEUTER) gender = pick(MALE, FEMALE) -/mob/living/simple_animal/pet/corgi/Life() +/mob/living/simple_animal/pet/corgi/Life(seconds, times_fired) . = ..() regenerate_icons() @@ -612,7 +612,7 @@ A.fire() return -/mob/living/simple_animal/pet/corgi/Ian/borgi/Life() +/mob/living/simple_animal/pet/corgi/Ian/borgi/Life(seconds, times_fired) ..() if(emagged && prob(25)) var/mob/living/carbon/target = locate() in view(10,src) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 99db2236612..665afa16cb2 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -34,7 +34,7 @@ Move(get_step(src, east_vs_west), east_vs_west) turns_since_move = 0 -/mob/living/simple_animal/crab/Life() +/mob/living/simple_animal/crab/Life(seconds, times_fired) . = ..() regenerate_icons() diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index ab1a94cbcc6..a8784a6d150 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -52,7 +52,7 @@ if(SV) SV.eat(src) -/mob/living/simple_animal/hostile/retaliate/goat/Life() +/mob/living/simple_animal/hostile/retaliate/goat/Life(seconds, times_fired) . = ..() if(stat == CONSCIOUS && prob(5)) milk_content = min(50, milk_content+rand(5, 10)) @@ -132,7 +132,7 @@ else ..() -/mob/living/simple_animal/cow/Life() +/mob/living/simple_animal/cow/Life(seconds, times_fired) . = ..() if(stat == CONSCIOUS && prob(5)) milk_content = min(50, milk_content+rand(5, 10)) @@ -188,7 +188,7 @@ pixel_x = rand(-6, 6) pixel_y = rand(0, 10) -/mob/living/simple_animal/chick/Life() +/mob/living/simple_animal/chick/Life(seconds, times_fired) . =..() if(.) amount_grown += rand(1,2) @@ -267,7 +267,7 @@ var/global/chicken_count = 0 else ..() -/mob/living/simple_animal/chicken/Life() +/mob/living/simple_animal/chicken/Life(seconds, times_fired) . = ..() if((. && prob(3) && eggsleft > 0) && egg_type) visible_message("[src] [pick(layMessage)]") diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 5972d0f6e4b..a7a62c74c0b 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -39,7 +39,7 @@ for(var/mob/M in view()) M << 'sound/effects/mousesqueek.ogg' -/mob/living/simple_animal/mouse/Life() +/mob/living/simple_animal/mouse/Life(seconds, times_fired) . = ..() if(stat == UNCONSCIOUS) if(ckey || prob(1)) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index a06ea9bd80d..283936acb44 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -57,7 +57,7 @@ target = null return ..() -/mob/living/simple_animal/hostile/Life() +/mob/living/simple_animal/hostile/Life(seconds, times_fired) . = ..() if(!.) walk(src, 0) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 50c24f0ac0b..971adc431cc 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -75,7 +75,7 @@ Difficulty: Hard /obj/effect/decal/cleanable/blood/gibs/bubblegum/can_bloodcrawl_in() return TRUE -/mob/living/simple_animal/hostile/megafauna/bubblegum/Life() +/mob/living/simple_animal/hostile/megafauna/bubblegum/Life(seconds, times_fired) ..() move_to_delay = Clamp((health/maxHealth) * 10, 5, 10) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 8d249c7f9e2..fe80846935d 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -76,7 +76,7 @@ Difficulty: Hard internal_gps = new/obj/item/gps/internal/hierophant(src) spawned_rune = new(loc) -/mob/living/simple_animal/hostile/megafauna/hierophant/Life() +/mob/living/simple_animal/hostile/megafauna/hierophant/Life(seconds, times_fired) . = ..() if(. && spawned_rune && !client) if(target || loc == spawned_rune.loc) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 9dab58daa4a..5832f7bdd60 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -51,7 +51,7 @@ var/attempt_open = 0 // Pickup loot -/mob/living/simple_animal/hostile/mimic/crate/initialize() +/mob/living/simple_animal/hostile/mimic/crate/Initialize() ..() for(var/obj/item/I in loc) I.loc = src diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm index e38ed7624ba..3f39ce233bf 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm @@ -269,7 +269,7 @@ stat_attack = 1 robust_searching = 1 -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life() +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life(seconds, times_fired) if(isturf(loc)) for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile if(H.stat == UNCONSCIOUS) diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 7346473de94..2c775074253 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -42,7 +42,7 @@ else to_chat(user, "It looks like it's been roughed up.") -/mob/living/simple_animal/hostile/mushroom/Life() +/mob/living/simple_animal/hostile/mushroom/Life(seconds, times_fired) ..() if(!stat)//Mushrooms slowly regenerate if conscious, for people who want to save them from being eaten adjustBruteLoss(-2) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 0e1d5eddd71..90586bb43c6 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -62,7 +62,7 @@ return ..() //self repair systems have a chance to bring the drone back to life -/mob/living/simple_animal/hostile/retaliate/malf_drone/Life() +/mob/living/simple_animal/hostile/retaliate/malf_drone/Life(seconds, times_fired) //emps and lots of damage can temporarily shut us down if(disabled > 0) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm index 14b1af87b0a..f9516739e6f 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm @@ -56,7 +56,7 @@ if(.) custom_emote(1, "wails at [.]") -/mob/living/simple_animal/hostile/retaliate/ghost/Life() +/mob/living/simple_animal/hostile/retaliate/ghost/Life(seconds, times_fired) if(target) invisibility = pick(0,0,60,invisibility) else diff --git a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm index 27bd2f3ee1c..d63d43b4919 100644 --- a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm +++ b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm @@ -190,7 +190,7 @@ SW.death() -/mob/living/simple_animal/hostile/spaceWorm/Life() +/mob/living/simple_animal/hostile/spaceWorm/Life(seconds, times_fired) if(nextWorm && !(Adjacent(nextWorm))) Detach(0) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm index c9309715443..5c483b4e3e9 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/purple.dm @@ -48,7 +48,7 @@ visible_message("[src] chitters in the direction of [Q]!") . = ..() -/mob/living/simple_animal/hostile/poison/terror_spider/purple/Life() +/mob/living/simple_animal/hostile/poison/terror_spider/purple/Life(seconds, times_fired) . = ..() if(.) // if mob is NOT dead if(!degenerate && spider_myqueen) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm index 5edcbe919c2..9133b8cc14c 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm @@ -61,7 +61,7 @@ spider_growinstantly = 1 spider_spawnfrequency = 150 -/mob/living/simple_animal/hostile/poison/terror_spider/queen/Life() +/mob/living/simple_animal/hostile/poison/terror_spider/queen/Life(seconds, times_fired) . = ..() if(.) // if mob is NOT dead if(ckey && canlay < 12 && hasnested) // max 12 eggs worth stored at any one time, realistically that's tons. diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 2a1e0f17ef4..0b174ed5fee 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -292,7 +292,7 @@ var/global/list/ts_spiderling_list = list() handle_dying() return ..() -/mob/living/simple_animal/hostile/poison/terror_spider/Life() +/mob/living/simple_animal/hostile/poison/terror_spider/Life(seconds, times_fired) . = ..() if(!.) // if mob is dead if(prob(2)) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index c206f1499d9..dba62b4744c 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -276,7 +276,7 @@ /* * AI - Not really intelligent, but I'm calling it AI anyway. */ -/mob/living/simple_animal/parrot/Life() +/mob/living/simple_animal/parrot/Life(seconds, times_fired) ..() //Sprite and AI update for when a parrot gets pulled diff --git a/code/modules/mob/living/simple_animal/posessed_object.dm b/code/modules/mob/living/simple_animal/posessed_object.dm index 2e9d1b94bf2..9ba666ce96a 100644 --- a/code/modules/mob/living/simple_animal/posessed_object.dm +++ b/code/modules/mob/living/simple_animal/posessed_object.dm @@ -60,7 +60,7 @@ qdel(src) -/mob/living/simple_animal/possessed_object/Life() +/mob/living/simple_animal/possessed_object/Life(seconds, times_fired) ..() if(!possessed_item) // If we're a donut and someone's eaten us, for instance. diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm index 5a38929b88d..3e7f1722a41 100644 --- a/code/modules/mob/living/simple_animal/tribbles.dm +++ b/code/modules/mob/living/simple_animal/tribbles.dm @@ -68,7 +68,7 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles, gestation = 0 -/mob/living/simple_animal/tribble/Life() +/mob/living/simple_animal/tribble/Life(seconds, times_fired) ..() if(src.health > 0) //no mostly dead procreation if(gestation != null) //neuter check diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index bb590e730f5..897f092a517 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -169,7 +169,7 @@ /mob/proc/movement_delay() return 0 -/mob/proc/Life() +/mob/proc/Life(seconds, times_fired) // handle_typing_indicator() return diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index e3c625593c5..30841f94c69 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -30,7 +30,8 @@ icon_state = "tallcabinet" -/obj/structure/filingcabinet/initialize() +/obj/structure/filingcabinet/Initialize() + ..() for(var/obj/item/I in loc) if(istype(I, /obj/item/paper) || istype(I, /obj/item/folder) || istype(I, /obj/item/photo)) I.loc = src diff --git a/code/modules/pda/cart.dm b/code/modules/pda/cart.dm index c50ae0758f4..53c61f4e27f 100644 --- a/code/modules/pda/cart.dm +++ b/code/modules/pda/cart.dm @@ -14,15 +14,6 @@ var/list/programs = list() var/list/messenger_plugins = list() -/obj/item/cartridge/New() - if(ticker && ticker.current_state >= GAME_STATE_SETTING_UP) - initialize() - -/obj/item/cartridge/initialize() - if(radio) - radio.initialize() - ..() - /obj/item/cartridge/Destroy() QDEL_NULL(radio) QDEL_LIST(programs) @@ -68,7 +59,7 @@ new/datum/data/pda/app/crew_records/security, new/datum/data/pda/app/secbot_control) -/obj/item/cartridge/security/initialize() +/obj/item/cartridge/security/Initialize() radio = new /obj/item/integrated_radio/beepsky(src) ..() @@ -118,7 +109,7 @@ desc = "A data cartridge with an integrated radio signaler module." programs = list(new/datum/data/pda/app/signaller) -/obj/item/cartridge/signal/initialize() +/obj/item/cartridge/signal/Initialize() radio = new /obj/item/integrated_radio/signal(src) ..() @@ -141,7 +132,7 @@ new/datum/data/pda/app/supply, new/datum/data/pda/app/mule_control) -/obj/item/cartridge/quartermaster/initialize() +/obj/item/cartridge/quartermaster/Initialize() radio = new /obj/item/integrated_radio/mule(src) ..() @@ -163,7 +154,7 @@ new/datum/data/pda/app/status_display) -/obj/item/cartridge/hop/initialize() +/obj/item/cartridge/hop/Initialize() radio = new /obj/item/integrated_radio/mule(src) ..() @@ -176,7 +167,7 @@ new/datum/data/pda/app/status_display) -/obj/item/cartridge/hos/initialize() +/obj/item/cartridge/hos/Initialize() radio = new /obj/item/integrated_radio/beepsky(src) ..() @@ -214,7 +205,7 @@ new/datum/data/pda/app/status_display) -/obj/item/cartridge/rd/initialize() +/obj/item/cartridge/rd/Initialize() radio = new /obj/item/integrated_radio/signal(src) ..() @@ -242,7 +233,7 @@ new/datum/data/pda/app/status_display) -/obj/item/cartridge/captain/initialize() +/obj/item/cartridge/captain/Initialize() radio = new /obj/item/integrated_radio/beepsky(src) ..() @@ -279,7 +270,7 @@ new/datum/data/pda/app/status_display) -/obj/item/cartridge/centcom/initialize() +/obj/item/cartridge/centcom/Initialize() radio = new /obj/item/integrated_radio/beepsky(src) ..() diff --git a/code/modules/pda/radio.dm b/code/modules/pda/radio.dm index 3c89c291300..b9dfe8ff7e4 100644 --- a/code/modules/pda/radio.dm +++ b/code/modules/pda/radio.dm @@ -173,7 +173,7 @@ radio_connection = null return ..() -/obj/item/integrated_radio/signal/initialize() +/obj/item/integrated_radio/signal/Initialize() if(!radio_controller) return if(src.frequency < PUBLIC_LOW_FREQ || src.frequency > PUBLIC_HIGH_FREQ) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index c5b014576fc..7580621834f 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -72,19 +72,13 @@ By design, d1 is the smallest direction and d2 is the highest var/turf/T = src.loc // hide if turf is not intact if(level==1) hide(T.intact) - cable_list += src //add it to the global cable list - - // Catches the interim-zone of worldstart and roundstart - // I want both the ticker to exist (so mapped-in cables don't trip this) - // but also not have started yet (since the zlevel system would handle this on its own otherwise) - if((ticker && ticker.current_state < GAME_STATE_PLAYING)) - attempt_init() + LAZYADD(GLOB.cable_list, src) //add it to the global cable list /obj/structure/cable/Destroy() // called when a cable is deleted if(powernet) cut_cable_from_powernet() // update the powernets - cable_list -= src //remove it from global cable list + LAZYREMOVE(GLOB.cable_list, src) //remove it from global cable list return ..() // then go ahead and delete the cable /////////////////////////////////// @@ -462,7 +456,7 @@ obj/structure/cable/proc/cable_color(var/colorC) powernet.remove_cable(src) //remove the cut cable from its powernet // queue it to rebuild - deferred_powernet_rebuilds += O + SSmachines.deferred_powernet_rebuilds += O // Disconnect machines connected to nodes if(d1 == 0) // if we cut a node (O-X) cable diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 4def1c3b067..8c9ee3eda0d 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -35,7 +35,7 @@ if(powernet) disconnect_from_network() -/obj/machinery/power/generator/initialize() +/obj/machinery/power/generator/Initialize() ..() connect() diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index ad73a6ff0ad..42f7cbde657 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -85,20 +85,12 @@ var/const/GRAV_NEEDS_WRENCH = 3 // Generator which spawns with the station. // -/obj/machinery/gravity_generator/main/station/initialize() +/obj/machinery/gravity_generator/main/station/Initialize() ..() setup_parts() middle.overlays += "activated" update_list() -// -// Generator an admin can spawn -// - -/obj/machinery/gravity_generator/main/station/admin/New() - ..() - initialize() - // // Main Generator with the main code // diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 72e30b9d29a..2892d0245b2 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -112,7 +112,7 @@ var/temperature = 0 //The current temperature var/overheating = 0 //if this gets high enough the generator explodes -/obj/machinery/power/port_gen/pacman/initialize() +/obj/machinery/power/port_gen/pacman/Initialize() ..() if(anchored) connect_to_network() diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index fd5946b7dc4..15b47a47635 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -232,26 +232,6 @@ . += C return . -/hook/startup/proc/buildPowernets() - return makepowernets() - -// rebuild all power networks from scratch - only called at world creation or by the admin verb -/proc/makepowernets() - for(var/datum/powernet/PN in powernets) - qdel(PN) - powernets.Cut() - - for(var/obj/structure/cable/PC in cable_list) - makepowernet_for(PC) - - return 1 - -/proc/makepowernet_for(var/obj/structure/cable/PC) - if(!PC.powernet) - var/datum/powernet/NewPN = new() - NewPN.add_cable(PC) - propagate_network(PC,PC.powernet) - //remove the old powernet and replace it with a new one throughout the network. /proc/propagate_network(var/obj/O, var/datum/powernet/PN) //log_world("propagating new network") diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index 416de55f6c3..a07d854380d 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -16,7 +16,7 @@ /datum/powernet/New() - powernets += src + SSmachines.powernets += src ..() /datum/powernet/Destroy() @@ -28,7 +28,7 @@ nodes -= M M.powernet = null - powernets -= src + SSmachines.powernets -= src return ..() //Returns the amount of excess power (before refunding to SMESs) from last tick. diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 58cecbc8ecc..70cd75bf85d 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -76,12 +76,13 @@ return rotate() -/obj/machinery/power/emitter/initialize() +/obj/machinery/power/emitter/Initialize() ..() if(state == 2 && anchored) connect_to_network() if(frequency) set_frequency(frequency) + /obj/machinery/power/emitter/multitool_menu(var/mob/user,var/obj/item/multitool/P) return {"
    diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index c55a206ebfa..a2025376e9d 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -300,7 +300,7 @@ track = 2 // Auto tracking mode autostart = 1 // Automatically start -/obj/machinery/power/solar_control/initialize() +/obj/machinery/power/solar_control/Initialize() ..() if(!powernet) return diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm index 5f8f8c1b8e4..762d442a2a9 100644 --- a/code/modules/power/treadmill.dm +++ b/code/modules/power/treadmill.dm @@ -18,7 +18,7 @@ var/list/mobs_running[0] var/id = null // for linking to monitor -/obj/machinery/power/treadmill/initialize() +/obj/machinery/power/treadmill/Initialize() ..() if(anchored) connect_to_network() @@ -137,7 +137,7 @@ var/frame = 0 // on 0, show labels, on 1 show numbers var/redeem_immediately = 0 // redeem immediately for holding cell -/obj/machinery/treadmill_monitor/initialize() +/obj/machinery/treadmill_monitor/Initialize() ..() if(id) for(var/obj/machinery/power/treadmill/T in machines) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index a385f51863e..641682490d4 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -82,7 +82,7 @@ inturf = get_step(src, dir) -/obj/machinery/power/compressor/initialize() +/obj/machinery/power/compressor/Initialize() ..() locate_machinery() if(!turbine) @@ -202,7 +202,7 @@ outturf = get_step(src, dir) -/obj/machinery/power/turbine/initialize() +/obj/machinery/power/turbine/Initialize() ..() locate_machinery() if(!compressor) @@ -341,7 +341,7 @@ -/obj/machinery/computer/turbine_computer/initialize() +/obj/machinery/computer/turbine_computer/Initialize() ..() spawn(10) locate_machinery() diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 56bb7478327..3907ed052a6 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -51,7 +51,7 @@ trunk.linked = null return ..() -/obj/machinery/disposal/initialize() +/obj/machinery/disposal/Initialize() // this will get a copy of the air turf and take a SEND PRESSURE amount of air from it ..() var/atom/L = loc diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 05038017aec..b39229ebc29 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -149,10 +149,10 @@ won't update every console in existence) but it's more of a hassle to do. Also, matching_designs = list() if(!id) for(var/obj/machinery/r_n_d/server/centcom/S in world) - S.initialize() + S.initialize_serv() break -/obj/machinery/computer/rdconsole/initialize() +/obj/machinery/computer/rdconsole/Initialize() ..() SyncRDevices() diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 014b2f80e6b..a2f9f185853 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -23,7 +23,7 @@ component_parts += new /obj/item/stack/cable_coil(null,1) component_parts += new /obj/item/stack/cable_coil(null,1) RefreshParts() - initialize(); //Agouri + initialize_serv(); //Agouri // fuck you agouri /obj/machinery/r_n_d/server/upgraded/New() ..() @@ -44,8 +44,7 @@ tot_rating += SP.rating heat_gen /= max(1, tot_rating) -/obj/machinery/r_n_d/server/initialize() - ..() +/obj/machinery/r_n_d/server/proc/initialize_serv() if(!files) files = new /datum/research(src) var/list/temp_list if(!id_with_upload.len) @@ -162,7 +161,7 @@ name = "CentComm. Central R&D Database" server_id = -1 -/obj/machinery/r_n_d/server/centcom/initialize() +/obj/machinery/r_n_d/server/centcom/Initialize() ..() var/list/no_id_servers = list() var/list/server_ids = list() diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index cea1f502d91..09978047027 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -351,7 +351,7 @@ height = 4 var/target_area = /area/mine/dangerous/unexplored -/obj/docking_port/stationary/random/initialize() +/obj/docking_port/stationary/random/Initialize() ..() var/list/turfs = get_area_turfs(target_area) var/turf/T = pick(turfs) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 6e712e74914..c8f36cfa37e 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -229,7 +229,7 @@ -/obj/docking_port/mobile/initialize() +/obj/docking_port/mobile/Initialize() if(!timid) register() ..() diff --git a/code/modules/space_management/space_level.dm b/code/modules/space_management/space_level.dm index dc598ccab42..38ec849179a 100644 --- a/code/modules/space_management/space_level.dm +++ b/code/modules/space_management/space_level.dm @@ -152,7 +152,7 @@ if(istype(AM, /obj/effect/landmark/map_loader)) late_maps.Add(AM) continue - AM.initialize() + AM.Initialize(TRUE) if(istype(AM, /obj/machinery/atmospherics)) pipes.Add(AM) else if(istype(AM, /obj/structure/cable)) @@ -179,10 +179,7 @@ /datum/space_level/proc/do_cables(list/cables) var/watch = start_watch() log_debug("Building powernets on z-level '[zpos]'!") - for(var/schmoo in cables) - var/obj/structure/cable/C = schmoo - if(C) - makepowernet_for(C) + SSmachines.setup_template_powernets(cables) cables.Cut() log_debug("Took [stop_watch(watch)]s") @@ -193,7 +190,7 @@ for(var/schmoo in late_maps) var/obj/effect/landmark/map_loader/ML = schmoo if(ML) - ML.initialize() + ML.Initialize() late_maps.Cut() space_manager.remove_dirt(zpos) log_debug("Took [stop_watch(watch)]s") diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 0c0ab2b1259..57142365cc4 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -273,7 +273,7 @@ area_aim = TRUE target_all_areas = TRUE -/obj/machinery/computer/bsa_control/admin/initialize() +/obj/machinery/computer/bsa_control/admin/Initialize() ..() if(!cannon) cannon = deploy() diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 9336de72515..b7cf78e5ed2 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -46,7 +46,7 @@ ..(user) to_chat(user, "There are [crystals.len ? crystals.len : "no"] bluespace crystal\s in the crystal slots.") -/obj/machinery/computer/telescience/initialize() +/obj/machinery/computer/telescience/Initialize() ..() for(var/i = 1; i <= starting_crystals; i++) crystals += new /obj/item/ore/bluespace_crystal/artificial(null) // starting crystals diff --git a/paradise.dme b/paradise.dme index 438cb2acaae..430730a17de 100644 --- a/paradise.dme +++ b/paradise.dme @@ -192,8 +192,6 @@ #include "code\controllers\Processes\event.dm" #include "code\controllers\Processes\fast_process.dm" #include "code\controllers\Processes\lighting.dm" -#include "code\controllers\Processes\machinery.dm" -#include "code\controllers\Processes\mob.dm" #include "code\controllers\Processes\nano_mob_hunter.dm" #include "code\controllers\Processes\npcai.dm" #include "code\controllers\Processes\npcpool.dm" @@ -205,13 +203,17 @@ #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" #include "code\controllers\subsystem\air.dm" +#include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\fires.dm" #include "code\controllers\subsystem\garbage.dm" +#include "code\controllers\subsystem\machinery.dm" +#include "code\controllers\subsystem\mobs.dm" #include "code\controllers\subsystem\nanoui.dm" #include "code\controllers\subsystem\nightshift.dm" #include "code\controllers\subsystem\spacedrift.dm" #include "code\controllers\subsystem\sun.dm" #include "code\controllers\subsystem\throwing.dm" +#include "code\controllers\subsystem\processing\processing.dm" #include "code\datums\action.dm" #include "code\datums\ai_law_sets.dm" #include "code\datums\ai_laws.dm" From 695d7b7c23414e601f812c9393efba6319c15af4 Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Sat, 28 Apr 2018 18:04:38 -0700 Subject: [PATCH 09/47] Remove debugging stuff --- code/ATMOSPHERICS/components/omni_devices/omni_base.dm | 3 --- code/ATMOSPHERICS/components/unary_devices/unary_base.dm | 3 --- code/ATMOSPHERICS/datum_pipeline.dm | 2 -- 3 files changed, 8 deletions(-) diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 57a416b4dfd..0eed9729f87 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -241,7 +241,6 @@ for(var/datum/omni_port/P in ports) if(!P.parent) P.parent = new /datum/pipeline() - log_debug("[P.type] \[\ref[P]] added to parent (omni_base, 244)") P.parent.build_pipeline(src) ..() @@ -283,7 +282,6 @@ for(var/datum/omni_port/PO in ports) if(A == PO.node) PO.parent = P - log_debug("[PO.type] \[\ref[PO]] added to parent (omni_base, 286)") /obj/machinery/atmospherics/omni/returnPipenet(obj/machinery/atmospherics/A) for(var/datum/omni_port/P in ports) @@ -294,7 +292,6 @@ for(var/datum/omni_port/P in ports) if(Old == P.parent) P.parent = New - log_debug("[P.type] \[\ref[P]] added to parent (omni_base, 297)") /obj/machinery/atmospherics/omni/process_atmos() diff --git a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm index 4a9d0e35edb..4ef7743fc8c 100644 --- a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm @@ -54,7 +54,6 @@ if(!parent) parent = new /datum/pipeline() parent.build_pipeline(src) - log_debug("[type] \[\ref[src]] added to parent (unary_base, 57)") ..() /obj/machinery/atmospherics/unary/disconnect(obj/machinery/atmospherics/reference) @@ -80,7 +79,6 @@ /obj/machinery/atmospherics/unary/setPipenet(datum/pipeline/P) parent = P - log_debug("[type] \[\ref[src]] added to parent (unary_base, 83)") /obj/machinery/atmospherics/unary/returnPipenet() return parent @@ -88,7 +86,6 @@ /obj/machinery/atmospherics/unary/replacePipenet(datum/pipeline/Old, datum/pipeline/New) if(Old == parent) parent = New - log_debug("[type] \[\ref[src]] added to parent (unary_base, 91)") /obj/machinery/atmospherics/unary/unsafe_pressure_release(var/mob/user,var/pressures) ..() diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index cd9b49fef82..b4a0cd9ba7b 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -86,7 +86,6 @@ var/pipenetwarnings = 10 if(istype(A, /obj/machinery/atmospherics/pipe)) var/obj/machinery/atmospherics/pipe/P = A P.parent = src - log_debug("[P.type] \[\ref[P]] added to parent (datum_pipeline, 89)") var/list/adjacent = P.pipeline_expansion() for(var/obj/machinery/atmospherics/pipe/I in adjacent) if(I.parent == src) @@ -105,7 +104,6 @@ var/pipenetwarnings = 10 members.Add(E.members) for(var/obj/machinery/atmospherics/pipe/S in E.members) S.parent = src - log_debug("[S.type] \[\ref[S]] added to parent (datum_pipeline, 108)") air.merge(E.air) for(var/obj/machinery/atmospherics/A in E.other_atmosmch) A.replacePipenet(E, src) From da2122626a21dafce9d27b6239b4a1cff0bf7677 Mon Sep 17 00:00:00 2001 From: Kyep Date: Sun, 29 Apr 2018 01:45:13 -0700 Subject: [PATCH 10/47] TSF marine update --- code/datums/outfits/outfit_admin.dm | 36 ++++++++++++++++++-------- code/modules/projectiles/ammunition.dm | 2 +- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 525880ee314..41a7a730db4 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -613,15 +613,16 @@ uniform = /obj/item/clothing/under/solgov/rep back = /obj/item/storage/backpack/satchel + glasses = /obj/item/clothing/glasses/hud/security/night gloves = /obj/item/clothing/gloves/color/white shoes = /obj/item/clothing/shoes/centcom - l_ear = /obj/item/radio/headset + l_ear = /obj/item/radio/headset/ert id = /obj/item/card/id/silver r_pocket = /obj/item/lighter/zippo/blue l_pocket = /obj/item/storage/fancy/cigarettes/cigpack_robustgold pda = /obj/item/pda backpack_contents = list( - /obj/item/storage/box/survival = 1, + /obj/item/storage/box/responseteam = 1, /obj/item/implanter/dust = 1, /obj/item/implanter/death_alarm = 1, ) @@ -633,25 +634,33 @@ var/obj/item/card/id/I = H.wear_id if(istype(I)) - apply_to_card(I, H, get_centcom_access("VIP Guest"), "Solar Federation Representative") + apply_to_card(I, H, get_all_accesses(), name, "lifetimeid") /datum/outfit/admin/solgov name = "Solar Federation Marine" uniform = /obj/item/clothing/under/solgov + suit = /obj/item/clothing/suit/armor/bulletproof back = /obj/item/storage/backpack/security + belt = /obj/item/storage/belt/military/assault head = /obj/item/clothing/head/soft/solgov + glasses = /obj/item/clothing/glasses/hud/security/night gloves = /obj/item/clothing/gloves/combat shoes = /obj/item/clothing/shoes/combat + l_ear = /obj/item/radio/headset/ert id = /obj/item/card/id l_hand = /obj/item/gun/projectile/automatic/ar + r_pocket = /obj/item/flashlight/seclite + pda = /obj/item/pda backpack_contents = list( - /obj/item/storage/box/survival = 1, - /obj/item/kitchen/knife/combat = 1, + /obj/item/storage/box/responseteam = 1, /obj/item/ammo_box/magazine/m556 = 3, - /obj/item/clothing/shoes/magboots = 1 + /obj/item/clothing/shoes/magboots = 1, + /obj/item/gun/projectile/automatic/pistol/deagle = 1, + /obj/item/ammo_box/magazine/m50 = 2 ) + var/is_tsf_lieutenant = FALSE /datum/outfit/admin/solgov/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -659,9 +668,14 @@ if(visualsOnly) return + if(is_tsf_lieutenant) + H.real_name = "Lieutenant [pick(last_names)]" + else + H.real_name = "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]" + H.name = H.real_name var/obj/item/card/id/I = H.wear_id if(istype(I)) - apply_to_card(I, H, get_centcom_access("VIP Guest"), name) + apply_to_card(I, H, get_all_accesses(), name, "lifetimeid") /datum/outfit/admin/solgov/lieutenant name = "Solar Federation Lieutenant" @@ -670,14 +684,14 @@ head = /obj/item/clothing/head/soft/solgov/command back = /obj/item/storage/backpack/satchel l_hand = null - belt = /obj/item/gun/projectile/automatic/pistol/deagle + l_pocket = /obj/item/pinpointer/advpinpointer backpack_contents = list( - /obj/item/storage/box/survival = 1, - /obj/item/kitchen/knife/combat = 1, + /obj/item/storage/box/responseteam = 1, /obj/item/melee/classic_baton/telescopic = 1, - /obj/item/ammo_box/magazine/m50 = 2, /obj/item/clothing/shoes/magboots/advance = 1 ) + is_tsf_lieutenant = TRUE + /datum/outfit/admin/chrono name = "Chrono Legionnaire" diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 63f533d91ec..130fda822fd 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -29,7 +29,7 @@ /obj/item/ammo_casing/update_icon() ..() icon_state = "[initial(icon_state)][BB ? "-live" : ""]" - desc = "[initial(desc)][BB ? "" : " This one is spent"]" + desc = "[initial(desc)][BB ? "" : " This one is spent."]" /obj/item/ammo_casing/proc/newshot(params) //For energy weapons, shotgun shells and wands (!). if(!BB) From 9f556d4ce60116b3414e72e9f77efbbc7fc360bd Mon Sep 17 00:00:00 2001 From: Kyep Date: Sun, 29 Apr 2018 02:25:56 -0700 Subject: [PATCH 11/47] pistols --- code/datums/outfits/outfit_admin.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 41a7a730db4..ba993142ff9 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -657,8 +657,8 @@ /obj/item/storage/box/responseteam = 1, /obj/item/ammo_box/magazine/m556 = 3, /obj/item/clothing/shoes/magboots = 1, - /obj/item/gun/projectile/automatic/pistol/deagle = 1, - /obj/item/ammo_box/magazine/m50 = 2 + /obj/item/gun/projectile/automatic/pistol/m1911 = 1, + /obj/item/ammo_box/magazine/m45 = 2 ) var/is_tsf_lieutenant = FALSE @@ -688,7 +688,9 @@ backpack_contents = list( /obj/item/storage/box/responseteam = 1, /obj/item/melee/classic_baton/telescopic = 1, - /obj/item/clothing/shoes/magboots/advance = 1 + /obj/item/clothing/shoes/magboots/advance = 1, + /obj/item/gun/projectile/automatic/pistol/deagle = 1, + /obj/item/ammo_box/magazine/m50 = 2 ) is_tsf_lieutenant = TRUE From 1cc34cac4a4c95b481ead3965ef9d9e363b11a16 Mon Sep 17 00:00:00 2001 From: Tayyyyyyy Date: Sun, 29 Apr 2018 20:01:57 -0500 Subject: [PATCH 12/47] Make extract organ and insert gland always succeed --- .../gamemodes/miniantags/abduction/abduction_surgery.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm index 328981b2ab5..235d5203ae0 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm @@ -49,6 +49,9 @@ to_chat(user, "You don't find anything in [target]'s [target_zone]!") return 1 +/datum/surgery_step/internal/extract_organ/fail_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + return end_step(user, target, target_zone, tool, surgery) + /datum/surgery_step/internal/gland_insert name = "insert gland" allowed_tools = list(/obj/item/organ/internal/heart/gland = 100) @@ -65,6 +68,9 @@ gland.insert(target, 2) return 1 +/datum/surgery_step/internal/gland_insert/fail_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + return end_step(user, target, target_zone, tool, surgery) + //IPC Gland Surgery// /datum/surgery/organ_extraction/synth From ee6a156ca205b9d0dccc126a46053a3870ac439b Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Mon, 30 Apr 2018 00:41:26 -0400 Subject: [PATCH 13/47] Removes Programmable Unloaders and a Few Unused Files --- code/datums/cargoprofile.dm | 788 ------------------ code/datums/mind.dm | 31 - code/game/machinery/programmable_unloader.dm | 734 ---------------- .../objects/items/weapons/syndie_uplink.dm | 38 - code/game/objects/items/weapons/wires.dm | 36 - .../research/designs/machine_designs.dm | 10 - paradise.dme | 4 - 7 files changed, 1641 deletions(-) delete mode 100644 code/datums/cargoprofile.dm delete mode 100644 code/game/machinery/programmable_unloader.dm delete mode 100644 code/game/objects/items/weapons/syndie_uplink.dm delete mode 100644 code/game/objects/items/weapons/wires.dm diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm deleted file mode 100644 index 2f8e27d834e..00000000000 --- a/code/datums/cargoprofile.dm +++ /dev/null @@ -1,788 +0,0 @@ -/datum/cargoprofile - var/name = "All Items" - var/id = "all" // unique ID for the UI - var/enabled = 1 - var/eject_speed = 1 // will change when emagged - var/const/BIG_OBJECT_WORK = 10 - var/const/MOB_WORK = 10 - var/obj/machinery/programmable/master = null - var/universal = 0 // set when both unary and binary machines work - var/mobcheck = 0 - - var/list/whitelist = list(/obj/item,/obj/structure/closet,/obj/structure/bigDelivery,/obj/machinery/portable_atmospherics) - var/list/blacklist = null - var/dedicated_path = null // When constructing a new machine with this as default program, create a machine of the specified type instead. - - - //contains: called to determine if an object/mob will be sorted by this profile - //return 1 for any sortable item - proc/contains(var/atom/A) - if(!istype(A,/obj)) - if(!mobcheck || !istype(A,/mob)) - return 0 - else - var/obj/O = A - if(O.anchored) - return 0 - //If you are using both white and blacklists, blacklists are absoulte, no matter what is whitelisted. - //I understand this has some limitations. You cannot whitelist all items, blacklist weapons, - // and then whitelist a specific weapon. Them's the breaks, kid. - if(blacklist) - for(var/T in blacklist) - if(istype(A,T)) - return 0 - if(whitelist) - for(var/T in whitelist) - if(istype(A,T)) - return 1 - return 0 - return 1 - - - //inlet_reaction: called when a filtered item is chosen by this profile. - //W: Item chosen - //S: input turf location - //remaining: counts down how much more work the unloader wants to do this turn. - //return the amount of work done. - proc/inlet_reaction(var/atom/W,var/turf/S,var/remaining) - if(!W || !S || !master) - return 0 - - if(istype(W,/obj/item)) - var/obj/item/I = W - if(I.w_class > remaining) - return 0 - I.loc = master - master.types[W.type] = src - return I.w_class - - - if(istype(W,/obj/structure) || istype(W,/obj/machinery)) // closets, big deliveries, portable atmospherics, unconnected stuff - if(remaining < BIG_OBJECT_WORK) - return 0 - var/obj/O = W - O.loc = master - master.types[O.type] = src - return BIG_OBJECT_WORK - - //Not item, structure, machinery, or mob - return 0 - - //outlet_reaction: called when a stored object is ejected - //W: the item in question - //D: the destination turf - proc/outlet_reaction(var/atom/W,var/turf/D) - if(!W || !D || !master) - return - - if(master.emagged) - // emagging is not an industry-approved practice. - // some malfunctions may occur. - eject_speed = rand(0,4) - D = get_step(D,master.outdir) - while(prob(20)) - if(master.outdir == NORTH || master.outdir == SOUTH) - D = get_step(D,pick(EAST,WEST,master.outdir)) - else - D = get_step(D,pick(NORTH,SOUTH,master.outdir)) - - if(istype(W,/obj)) - var/obj/O = W - O.loc = master.loc - O.dir = master.outdir - O.throw_at(D,eject_speed,eject_speed) - return - -//---------------------------------------------------------------------------- -// Profiles -//---------------------------------------------------------------------------- - -/datum/cargoprofile/boxes - name = "Move Small Containers" - id = "boxes" - blacklist = null - whitelist = list(/obj/item/storage, /obj/item/storage/bag/money, /obj/item/evidencebag, - /obj/item/storage/bag/tray, /obj/item/pizzabox, /obj/item/clipboard, - /obj/item/smallDelivery, /obj/structure/bigDelivery) - -/datum/cargoprofile/cargo - name = "Move Large Containers" - id = "cargo" - blacklist = null - whitelist = list(/obj/structure/closet,/obj/structure/ore_box) - - // Make an honest attempt to move other things out of the way - outlet_reaction(var/atom/W,var/turf/D) - for(var/obj/O in D) - if(O.density && !O.anchored) - step_away(O,src) // move forward first - if(O.loc == D) - step_away(O,D) // move anywhere - ..(W,D) - -/datum/cargoprofile/cargo/empty - name = "Move Empty Large Containers" - id = "cargo-empty" - contains(var/atom/A) - return (..(A) && (A.contents.len == 0)) -/datum/cargoprofile/cargo/full - name = "Move Full Large Containers" - id = "cargo-full" - contains(var/atom/A) - return (..(A) && (A.contents.len > 0)) - -/datum/cargoprofile/supplies - name = "Building Supplies" - id = "supplies" - blacklist = null - whitelist = list(/obj/item/stack/cable_coil,/obj/item/stack/rods, - /obj/item/stack/sheet/metal,/obj/item/stack/sheet/plasteel, - /obj/item/stack/sheet/glass,/obj/item/stack/sheet/rglass, - /obj/item/stack/tile,/obj/item/light) - //todo: maybe stack things while we're here? - -/datum/cargoprofile/exotics - name = "Exotic materials" - id = "exotics" - blacklist = null - whitelist = list(/obj/item/coin, /obj/item/stack/spacecash, /obj/item/seeds, - /obj/item/stack/sheet/mineral,/obj/item/stack/sheet/wood,/obj/item/stack/sheet/leather) - -/datum/cargoprofile/organics - name = "Organics, chemicals, and Paraphernalia" - id = "organics" - blacklist = null - whitelist = list(/obj/item/tank,/obj/item/reagent_containers, - /obj/item/stack/medical,/obj/item/storage/pill_bottle,/obj/item/gun/syringe, - /obj/item/grenade/plastic/c4,/obj/item/grenade,/obj/item/ammo_box, - /obj/item/gun/grenadelauncher,/obj/item/flamethrower, /obj/item/lighter, - /obj/item/match,/obj/item/weldingtool) - -/datum/cargoprofile/food - name = "Food" - id = "food" - blacklist = null // something should probably go here - whitelist = list(/obj/item/reagent_containers/food) - -/datum/cargoprofile/chemical - name = "Chemicals and Paraphernalia" - id = "chemical" - blacklist = list(/obj/item/reagent_containers/food) - whitelist = list(/obj/item/reagent_containers,/obj/item/stack/medical,/obj/item/storage/pill_bottle, - /obj/item/gun/syringe,/obj/item/grenade/chem_grenade,/obj/item/dnainjector, - /obj/item/storage/belt/medical,/obj/item/storage/firstaid,/obj/item/implanter) - -/datum/cargoprofile/pressure - name = "air tanks" - id = "pressure" - blacklist = null - whitelist = list(/obj/item/tank,/obj/machinery/portable_atmospherics, - /obj/item/flamethrower) - //Am I missing any? -/datum/cargoprofile/pressure/empty - name = "empty air tanks" - id = "pressure-low" - var/lowpressure = ONE_ATMOSPHERE - - contains(var/atom/A) - if(..()) - var/pressure = ONE_ATMOSPHERE * 10 // In case of fallthrough, fail test - if(istype(A,/obj/item/tank)) - var/obj/item/tank/T = A - pressure = T.air_contents.return_pressure() - if(istype(A,/obj/item/flamethrower)) - var/obj/item/flamethrower/T = A - if(!T.ptank) - return 0 - pressure = T.ptank.air_contents.return_pressure() - if(istype(A,/obj/machinery/portable_atmospherics)) - var/obj/machinery/portable_atmospherics/P = A - pressure = P.air_contents.return_pressure() - - if(pressure < lowpressure) - return 1 - - return 0// Not container or failed low pressure check - -/datum/cargoprofile/pressure/full - name = "full air tanks" - id = "pressure-high" - var/highpressure = ONE_ATMOSPHERE * 15 // stolen from canister.dm; Is this right? - - contains(var/atom/A) - if(..()) - var/pressure = 0 // In case of fallthrough, fail test - if(istype(A,/obj/item/tank)) - var/obj/item/tank/T = A - pressure = T.air_contents.return_pressure() - if(istype(A,/obj/item/flamethrower)) - var/obj/item/flamethrower/T = A - if(!T.ptank) - return 0 - pressure = T.ptank.air_contents.return_pressure() - if(istype(A,/obj/machinery/portable_atmospherics)) - var/obj/machinery/portable_atmospherics/P = A - pressure = P.air_contents.return_pressure() - - if(pressure > highpressure) - return 1 - - return 0// Not container or failed high pressure check - -/datum/cargoprofile/clothing - name = "Crew Kit" - id = "clothing" - blacklist = list(/obj/item/tank/plasma,/obj/item/tank/anesthetic, // the rest are air tanks - /obj/item/clothing/mask/facehugger) // NOT CLOTHING AT ALLLLL - whitelist = list(/obj/item/clothing,/obj/item/storage/belt,/obj/item/storage/backpack, - /obj/item/radio/headset,/obj/item/pda,/obj/item/card/id,/obj/item/tank, - /obj/item/restraints/handcuffs, /obj/item/restraints/legcuffs) - -/datum/cargoprofile/trash - name = "Trash" - id = "trash" - //Note that this filters out blueprints because they are a paper item. Do NOT throw out the station blueprints unless you be trollin'. - blacklist = null - whitelist = list(/obj/item/trash,/obj/item/toy,/obj/item/reagent_containers/food/snacks/ectoplasm,/obj/item/grown/bananapeel,/obj/item/broken_bottle,/obj/item/bikehorn, - /obj/item/cigbutt,/obj/item/poster/random_contraband,/obj/item/grown/corncob,/obj/item/paper,/obj/item/shard, - /obj/item/sord,/obj/item/photo,/obj/item/folder, - /obj/item/areaeditor/blueprints,/obj/item/poster/random_contraband,/obj/item/kitchen,/obj/item/book,/obj/item/clothing/mask/facehugger) - -/datum/cargoprofile/weapons - name = "Weapons & Illegals" - id = "weapons" - blacklist = null - //This one is hard since 'weapon contains a lot of things better categorized as devices - whitelist = list(/obj/item/banhammer,/obj/item/sord,/obj/item/claymore,/obj/item/holo/esword, - /obj/item/flamethrower,/obj/item/grenade,/obj/item/gun,/obj/item/hatchet,/obj/item/katana, - /obj/item/kitchen/knife,/obj/item/melee,/obj/item/nullrod,/obj/item/pickaxe,/obj/item/twohanded, - /obj/item/grenade/plastic/c4,/obj/item/scalpel,/obj/item/shield,/obj/item/grown/nettle/death) - -/datum/cargoprofile/tools - name = "Devices & Tools" - id = "tools" - blacklist = null - whitelist = list(/obj/item,/obj/item/card,/obj/item/cartridge,/obj/item/cautery,/obj/item/stock_parts/cell,/obj/item/circuitboard, - /obj/item/aiModule,/obj/item/airalarm_electronics,/obj/item/airlock_electronics,/obj/item/circular_saw, - /obj/item/crowbar,/obj/item/disk,/obj/item/firealarm_electronics,/obj/item/hand_tele, - /obj/item/hand_labeler,/obj/item/hemostat,/obj/item/mop,/obj/item/locator,/obj/item/cultivator, - /obj/item/stack/packageWrap,/obj/item/pen,/obj/item/pickaxe,/obj/item/pinpointer, - /obj/item/rcd,/obj/item/rcd_ammo,/obj/item/retractor,/obj/item/rsf,/obj/item/scalpel, - /obj/item/screwdriver,/obj/item/shovel,/obj/item/soap,/obj/item/stamp,/obj/item/storage/bag/tray,/obj/item/weldingtool, - /obj/item/wirecutters,/obj/item/wrench,/obj/item/extinguisher) - -/datum/cargoprofile/finished - name = "Completed Robots" - id = "finished" - blacklist = null - whitelist = list(/obj/mecha,/mob/living/simple_animal/bot,/mob/living/silicon/robot) - mobcheck = 1 - //todo: detect and allow finished cyborg endoskeletons with no brain - contains(var/atom/A) - if(..()) - return 1 - if(istype(A,/mob)) - if(blacklist) - for(var/T in blacklist) - if(istype(A,T)) - return 0 - if(whitelist) - for(var/T in whitelist) - if(istype(A,T)) - return 1 - return 0 - return 1 - return 0 - -/datum/cargoprofile/stripping - name = "Auto-Frisker" - id = "frisk" - blacklist = null - whitelist = list(/mob/living/carbon/human) - mobcheck = 1 - - - -//---------------------------------------------------------------------------- -// Overrides (Special Functions) -//---------------------------------------------------------------------------- - -/datum/cargoprofile/cargo/unload - name = "Unload Cargo Boxes" - id = "cargounload" - enabled = 0 - dedicated_path = /obj/machinery/programmable/unloader - - //override the detection to only accept crates with something in it. - //if it doesn't, this object may be handled by another handler. - contains(var/atom/A) - if(..(A)) - if(istype(A,/obj/structure/closet)) - var/obj/structure/closet/C = A - if(!C.can_open() && !C.opened && !master.emagged) // must be able to access the contents - return 0 - if(A.contents.len) - return 1 - return 0 - - //instead of moving the box, strip it of its contents - inlet_reaction(var/obj/W,var/turf/S, var/remaining) - //W should only be crate or ore box, although this will work on anything with contents... - var/I = 0 - if(istype(W,/obj/structure/closet)) - var/obj/structure/closet/C = W - if(!C.can_open() && !C.opened) // must be able to access the contents - if(master.emagged && remaining >= BIG_OBJECT_WORK) - if(prob(10)) - C.welded = 0 - if("broken" in C.vars) - C:broken = 1 - C.open() - C.update_icon() - master.visible_message("[master] breaks open [C]!") - else - master.visible_message("[master] is trying to force [C] open!") - - master.sleep += 1 // mechanical strain - return BIG_OBJECT_WORK - master.visible_message("[master] is trying to open [C], but can't!") - master.sleep = 5 - return 0 - - for(var/obj/item/O in W.contents) - if(I > remaining) - return - if(O.w_class > (remaining - I)) - continue - O.loc = master - master.types[O.type] = src - if(O.w_class > 0) - I += O.w_class - else - I++ - if(!W.contents.len && istype(W,/obj/structure/closet)) - var/obj/structure/closet/C = W - C.open() - return I - - -//Inlet stacker: used when the output is a volatile space (conveyor or another unit's input). -//Does not output a stack until it is full. -/datum/cargoprofile/in_stacker - name = "Hold and Stack" - id = "instacker" - universal = 1 - - blacklist = null - whitelist = list(/obj/item/stack,/obj/item/stack/cable_coil) - - dedicated_path = /obj/machinery/programmable/stacker - - inlet_reaction(var/atom/W,var/turf/S,var/remaining) - if(istype(W,/obj/item/stack)) - var/obj/item/stack/I = W - if(!I.amount) // todo: am I making a bad assumption here? - qdel(I) - return - for(var/obj/item/stack/O in master.contents) - if(O.type == I.type && O.amount < O.max_amount) - if(I.amount + O.amount <= O.max_amount) - O.amount += I.amount - qdel(I) - return O.w_class - var/leftover = I.amount + O.amount - O.max_amount - O.amount = O.max_amount - I.amount = leftover - continue - //end for - I.loc = master - master.types[I.type] = src - return I.w_class - if(istype(W,/obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/I = W - if(!I.amount) // todo: am I making a bad assumption here? - qdel(I) - return - for(var/obj/item/stack/cable_coil/O in master.contents) - if(O.type == I.type && O.amount < MAXCOIL) - if(I.amount + O.amount <= MAXCOIL) - O.amount += I.amount - qdel(I) - return O.w_class - var/leftover = I.amount + O.amount - MAXCOIL - O.amount = MAXCOIL - I.amount = leftover - continue - //end for - I.loc = master - master.types[I.type] = src - return I.w_class - - //If the stack isn't finished yet, don't eject it - //unless this profile has been disabled. - outlet_reaction(var/atom/W,var/turf/D) - if(istype(W,/obj/item/stack)) - var/obj/item/stack/I = W - if(src.enabled && (I.amount < I.max_amount)) - return // Still needs to be stacked - ..(W,D) - if(istype(W,/obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/I = W - if(src.enabled && (I.amount < MAXCOIL)) - return // Still needs to be stacked - ..(W,D) - -//Outlet stacker: used when the output square can be trusted. -//Outputs immediately, adding to stacks in the outlet. -/datum/cargoprofile/unary/stacker - name = "Stack Items" - id = "ustacker" - blacklist = null - whitelist = list(/obj/item/stack,/obj/item/stack/cable_coil) - - dedicated_path = /obj/machinery/programmable/unary/stacker - - inlet_reaction(var/atom/W,var/turf/S,var/remaining) - - //Only pick it up if you are going to stack it - - if(istype(W,/obj/item/stack)) - var/obj/item/stack/I = W - if(I.amount >= I.max_amount) - return 0 - for(var/obj/item/stack/other in S.contents) - if(other.type == I.type && other != I && other.amount < other.max_amount) - return ..(W,S,remaining) - return 0 - - if(istype(W,/obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/I = W - if(I.amount >= MAXCOIL) - return 0 - for(var/obj/item/stack/cable_coil/other in S.contents) - if(other != I && other.amount < MAXCOIL) - return ..(W,S,remaining) - return 0 - - outlet_reaction(var/atom/W,var/turf/D) - if(istype(W,/obj/item/stack)) - var/obj/item/stack/I = W - for(var/obj/item/stack/O in D.contents) - if(O.type == I.type && O.amount < O.max_amount) - if(I.amount + O.amount <= O.max_amount) - O.amount += I.amount - qdel(I) - return - var/leftover = I.amount + O.amount - O.max_amount - O.amount = O.max_amount - I.amount = leftover - continue - //end for - I.loc = D - return - if(istype(W,/obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/I = W - for(var/obj/item/stack/cable_coil/O in D.contents) - if(O.type == I.type && O.amount < MAXCOIL) - if(I.amount + O.amount <= MAXCOIL) // Why did they make it a #define. - O.amount += I.amount - O.update_icon() - qdel(I) - return - var/leftover = I.amount + O.amount - MAXCOIL // That wasn't a question - O.amount = MAXCOIL // It was a complaint - I.amount = leftover - continue - //end for - I.loc = D - return - - - -//---------------------------------------------------------------------------- -// Dubious Overrides (For emag use) -//---------------------------------------------------------------------------- - - -//Clogs up the unloader. And, there may be devious uses for it... -/datum/cargoprofile/slow - name = "Slow unloader" - id = "slow" - whitelist = list(/obj/item,/obj/structure/closet,/obj/structure/bigDelivery,/obj/machinery/portable_atmospherics) - blacklist = list() - - inlet_reaction(var/atom/W,var/turf/S,var/remaining) - if(..()) - return remaining - -/datum/cargoprofile/unary/shredder - name = "Paper Shredder" - id = "shredder" - blacklist = null - whitelist = list(/obj/item/paper,/obj/item/book,/obj/item/clipboard,/obj/item/folder,/obj/item/photo) - universal = 1 - - dedicated_path = /obj/machinery/programmable/unary/shredder - - - - proc/cliptags(var/Text) - //Removes all html tags - var/index - var/index2 - index = findtextEx(Text,"<") - while(index) - index2 = findtextEx(Text,">",index) - if(!index2) - return copytext(Text,1,index) - Text = "[copytext(Text,1,index)][copytext(Text,index2+1,0)]" - index = findtextEx(Text,"<") - //should have trimmed that text there pretty good - return Text - - - //Recurses through the text, removing large chunks - proc/garbletext(var/Text) - var/l = length(Text) - if(l <= 3) - if(prob(20)) - return pick("#","|","/","*",".","."," ","."," "," ") - return Text - if(prob(50)) - return "[garbletext(copytext(Text,1,l/2))][garbletext(copytext(Text,l/2,0))]" - if(prob(50)) - return "[pick("#","|","/","*",".","."," ","."," "," ")][garbletext(copytext(Text,1,l/2))]" - return "[garbletext(copytext(Text,l/2,0))][pick("#","|","/","*",".","."," ","."," "," ")]" - - proc/garble_keeptags(var/Text) - var/list/L = splittext(Text,">") - var/result = "" - for(var/string in L) - var/index = findtextEx(string,"<") - if(index!=1) - result += "[garbletext(copytext(string,1,index))][copytext(string,index)]>" - else - result += "[string]>" - return copytext(result,1,lentext(result)) - - - - - outlet_reaction(var/atom/W,var/turf/D) - if(istype(W,/obj/item/paper/crumpled)) - qdel(W) - return - if(istype(W,/obj/item/clipboard) || istype(W,/obj/item/folder)) - // destroy folder, various effects on contents - for(var/obj/item/I in W.contents) - if(prob(25))//JUNK IT - qdel(I) - else if(prob(50)) //We've been over this. I can't just take it apart with a crowbar. - var/obj/item/paper/crumpled/P = new(master.loc) - if(I.name) - P.name = garbletext(I.name) - if(prob(66)) - P.fingerprints = I.fingerprints - P.fingerprintshidden = I.fingerprintshidden - if(istype(I,/obj/item/paper)) - var/obj/item/paper/O = I - P.info = garble_keeptags(O.info) - qdel(I) - ..(P,D) - else - ..(I,D) // Eject - qdel(W) //destroy container - return - if(prob(50)) //JUNK IT NOW! - var/obj/item/paper/crumpled/P = new(master.loc) - P.name = W.name - var/obj/item/I = W - if(prob(66)) - P.fingerprints = I.fingerprints - P.fingerprintshidden = I.fingerprintshidden - if(istype(I,/obj/item/paper)) - var/obj/item/paper/O = I - if(O.info) - P.info = garble_keeptags(O.info) - if(istype(I,/obj/item/book)) - var/obj/item/book/B = I - if(B.dat) - P.info = garble_keeptags(B.dat) - if(B.carved && B.store) - ..(B.store,D) - qdel(W) - ..(P,D) - else //I want it junked - qdel(W) - return - -/datum/cargoprofile/unary/gibber - name = "human shredding" - id = "flesh" - whitelist = list(/mob/living/carbon,/mob/living/simple_animal) - blacklist = null - mobcheck = 1 - contains(var/atom/A) - if(!istype(A,/mob)) - return - if(blacklist) - for(var/T in blacklist) - if(istype(A,T)) - return 0 - if(whitelist) - for(var/T in whitelist) - if(istype(A,T)) - return 1 - return 0 - return 1 - inlet_reaction(var/atom/W,var/turf/S,var/remaining) - var/mob/living/M = W - if(istype(M) && (remaining > MOB_WORK)) - //this is necessarily damaging - var/damage = rand(1,5) - to_chat(M, "The unloading machine grabs you with a hard metallic claw!") - M.reset_perspective(master) - M.loc = master - master.types[M.type] = src - M.apply_damage(damage) // todo: ugly - M.visible_message("[M.name] gets pulled into the machine!") - return MOB_WORK - outlet_reaction(var/atom/W,var/turf/D) - var/mob/living/M = W - var/bruteloss = M.bruteloss - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/C = M - for(var/obj/item/organ/external/L in C.bodyparts) - bruteloss += L.brute_dam - if(bruteloss < 100) // requires tenderization - M.apply_damage(rand(5,15),BRUTE) - to_chat(M, "The machine is tearing you apart!") - master.visible_message("[master] makes a squishy grinding noise.") - return - M.loc = master.loc - M.gib() - return - - -/datum/cargoprofile/people - name = "Manhandling" - id = "people" - - whitelist = null - blacklist = list(/mob/camera,/mob/new_player,/mob/living/simple_animal/hostile/blob/blobspore,/mob/living/simple_animal/hostile/creature, - /mob/living/simple_animal/hostile/spaceWorm,/mob/living/simple_animal/shade,/mob/living/simple_animal/hostile/faithless,/mob/dead) - universal = 1 - mobcheck = 1 - - - contains(var/atom/A) - if(!istype(A,/mob)) - return - if(blacklist) - for(var/T in blacklist) - if(istype(A,T)) - return 0 - if(whitelist) - for(var/T in whitelist) - if(istype(A,T)) - return 1 - return 0 - return 1 - - inlet_reaction(var/atom/W,var/turf/S,var/remaining) - var/mob/living/M = W - if(remaining > MOB_WORK) - //this is necessarily damaging - var/damage = rand(1,5) - to_chat(M, "The unloading machine grabs you with a hard metallic claw!") - M.forceMove(master) - master.types[M.type] = src - M.apply_damage(damage) // todo: ugly - M.visible_message("[M.name] gets pulled into the machine!") - return MOB_WORK - - outlet_reaction(var/atom/W,var/turf/D) - var/mob/living/M = W - M.forceMove(master.loc) - M.dir = master.outdir - - D = get_step(D,master.outdir) // throw attempt - eject_speed = rand(0,4) - - M.visible_message("[M.name] is ejected from the unloader.") - M.throw_at(D,eject_speed,eject_speed) - return - -/datum/cargoprofile/unary/trainer - name = "Boxing Trainer" - id = "trainer" - blacklist = list() - whitelist = list(/mob/living/carbon/human) - mobcheck = 1 - - var/const/PUNCH_WORK = 6 - - dedicated_path = /obj/machinery/programmable/unary/trainer - - contains(var/atom/A) - if(!istype(A,/mob)) - return 0 - if(blacklist) - for(var/T in blacklist) - if(istype(A,T)) - return 0 - if(whitelist) - for(var/T in whitelist) - if(istype(A,T)) - return 1 - return 0 - return 1 - - proc/punch(var/mob/living/carbon/human/M,var/maxpunches) - //stolen from holographic boxing gloves code - //This should probably be done BY the mob, however, the attack code will be expecting a source mob. - - var/damage - if(prob(75)) - damage = rand(0, 6) // pap - else - damage = rand(0, 12) // thwack - - if(!damage) - playsound(master.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - master.visible_message("\The [src] punched at [M], but whiffed!") - - if(maxpunches > 1 && prob(50)) // Follow through on a miss, 50% chance - return punch(M,maxpunches - 1) + 1 - return 1 - var/obj/item/organ/external/affecting = M.get_organ(ran_zone("chest",50)) - var/armor_block = M.run_armor_check(affecting, "melee") - - playsound(master.loc, "punch", 25, 1, -1) - master.visible_message("\The [src] has punched [M]!") - if(!master.emagged) - M.apply_damage(damage, STAMINA, affecting, armor_block) // Clean fight - else - M.apply_damage(damage, BRUTE, affecting, armor_block) // Foul! Foooul! - - if(damage >= 9) - master.visible_message("\The [src] has weakened [M]!") - M.apply_effect(4, WEAKEN, armor_block) - if(!master.emagged) - master.sleep = 1 - return maxpunches // The machine is not so sophisticated as to not gloat - else - if(prob(25)) // Follow through on a hit, 25% chance. Pause after. - return punch(M,maxpunches-1) + 1 - return 1 - - inlet_reaction(var/atom/W,var/turf/S,var/remaining) - //stolen from boxing gloves code - var/mob/living/carbon/human/M = W - if((M.lying || (M.health - M.staminaloss < 25))&& !master.emagged) - to_chat(M, "\The [src] gives you a break.") - master.sleep+=5 - return 0 // Be polite - var/punches = punch(M,remaining / PUNCH_WORK) - if(punches>1)master.sleep++ - return punches * PUNCH_WORK diff --git a/code/datums/mind.dm b/code/datums/mind.dm index be35cf8cca8..edf9792a3d4 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1211,37 +1211,6 @@ message_admins("[key_name_admin(usr)] has announced [key_name_admin(current)]'s objectives") edit_memory() -/* -/datum/mind/proc/clear_memory(var/silent = 1) - var/datum/game_mode/current_mode = ticker.mode - - // remove traitor uplinks - var/list/L = current.get_contents() - for(var/t in L) - if(istype(t, /obj/item/pda)) - if(t:uplink) qdel(t:uplink) - t:uplink = null - else if(istype(t, /obj/item/radio)) - if(t:traitorradio) qdel(t:traitorradio) - t:traitorradio = null - t:traitor_frequency = 0.0 - else if(istype(t, /obj/item/SWF_uplink) || istype(t, /obj/item/syndicate_uplink)) - if(t:origradio) - var/obj/item/radio/R = t:origradio - R.loc = current.loc - R.traitorradio = null - R.traitor_frequency = 0.0 - qdel(t) - - // remove wizards spells - //If there are more special powers that need removal, they can be procced into here./N - current.spellremove(current) - - // clear memory - memory = "" - special_role = null - -*/ /datum/mind/proc/find_syndicate_uplink() var/list/L = current.get_contents() diff --git a/code/game/machinery/programmable_unloader.dm b/code/game/machinery/programmable_unloader.dm deleted file mode 100644 index 310d1798a09..00000000000 --- a/code/game/machinery/programmable_unloader.dm +++ /dev/null @@ -1,734 +0,0 @@ - -// TODO: Check access -// TODO: Renameable circuit boards -// TODO: Disks? Disassembly? - -/obj/machinery/programmable - name = "Programmable Unloader" - icon = 'icons/obj/machines/mining_machines.dmi' - icon_state = "unloader" - density = 1 - anchored = 1.0 - - var/debug = 0 // When set, this WILL spam people around the machine. - // Identifies profile used and on which item. - - var/on = 1 - var/indir = 8 - var/outdir = 4 - var/turf/input = null - var/turf/output = null - var/typename = "Unloader" - var/ident = "#1" - - var/const/workmax = 20 - var/datum/cargoprofile/default = new() - var/list/profiles = list(new/datum/cargoprofile/cargo(),new/datum/cargoprofile/boxes(),new/datum/cargoprofile/supplies(), - new/datum/cargoprofile/exotics(),new/datum/cargoprofile/tools(),new/datum/cargoprofile/weapons(), - new/datum/cargoprofile/pressure(),new/datum/cargoprofile/chemical(), - new/datum/cargoprofile/food(),new/datum/cargoprofile/clothing(),new/datum/cargoprofile/trash()) - var/list/overrides = list(new/datum/cargoprofile/cargo/unload(),new/datum/cargoprofile/in_stacker()) - var/list/emag_overrides = list(new/datum/cargoprofile/people(),new/datum/cargoprofile/unary/shredder(),new/datum/cargoprofile/unary/trainer()) - var/list/types = list() - - anchored = 1 - var/unwrenched = 0 - use_power = 1 - var/sleep = 0 // When set, the machine will skip the next however-many updates (to avoid spam) - var/open = 0 - var/circuit_removed = 0 - - - -/obj/machinery/programmable/New() - ..() - if(default) - default.master = src - if(!default.enabled) - default.enabled = 1 - for(var/datum/cargoprofile/p in emag_overrides + overrides + profiles) - p.master = src - input = get_step(src.loc,indir) - output = get_step(src.loc,outdir) - var/count = 0 - for(var/obj/machinery/programmable/other in world) - if(other.typename == typename) - count++ - ident = "#[count]" - name = "[typename] [ident]" - -/obj/machinery/programmable/RefreshParts() - //This is called when the machine was constructed. - //Unfortunately, it puts machine parts in our contents list, which we're using. - //Fortunately, we aren't likely to ever need the components list, circuitboard excepted. - - for(var/obj/O in contents) - if(istype(O,/obj/item/circuitboard/programmable))//retrieve settings here - - var/obj/item/circuitboard/programmable/C = O - - default = C.default - emagged = C.emagged - profiles = C.profiles - overrides = C.overrides - emag_overrides = C.emag_overrides - - //unary and binary methods (one vs two locales) don't mix - - if(istype(src,/obj/machinery/programmable/unary)) - for(var/datum/cargoprofile/P in profiles) - if(!istype(P,/datum/cargoprofile/unary) && !P.universal) - profiles -= P - for(var/datum/cargoprofile/P in overrides) - if(!istype(P,/datum/cargoprofile/unary) && !P.universal) - overrides -= P - for(var/datum/cargoprofile/P in emag_overrides) - if(!istype(P,/datum/cargoprofile/unary) && !P.universal) - emag_overrides -= P - else - for(var/datum/cargoprofile/P in profiles) - if(istype(P,/datum/cargoprofile/unary) && !P.universal) - profiles -= P - for(var/datum/cargoprofile/P in overrides) - if(istype(P,/datum/cargoprofile/unary) && !P.universal) - overrides -= P - for(var/datum/cargoprofile/P in emag_overrides) - if(istype(P,/datum/cargoprofile/unary) && !P.universal) - emag_overrides -= P - if(default) - default.master = src - for(var/datum/cargoprofile/p in emag_overrides + overrides + profiles) - p.master = src - - qdel(C) - else - qdel(O) - -/obj/machinery/programmable/attack_hand(mob/user as mob) - if(stat) // moved, or something else - return - usr.set_machine(src) - interact(user) - -/obj/machinery/programmable/proc/printlist(var/list/L) - var/dat - for(var/datum/cargoprofile/p in L) - dat += "[p.name]: [p.enabled?"YES":"NO"]
    " - return dat - -/obj/machinery/programmable/proc/buildMenu() - var/dat - dat += "PROGRAMMABLE UNLOADER
    " - dat += "POWER: [on ? "ON" : "OFF"]
    " - dat += "INLET: [capitalize(dir2text(indir))] " - dat += "OUTLET: [capitalize(dir2text(outdir))]" - dat += " (SWAP)

    " - if(default) - dat += "MAIN PROGRAM: " - dat += "[default.name]: [default.enabled ? "YES" : "NO"]
    " - if(profiles.len) - if(!default || !default.enabled) - dat += printlist(profiles) - dat += "
    " - if(overrides.len) - dat += "
    OVERRIDES:
    " - dat += printlist(overrides) - dat += "" - return dat - -/obj/machinery/programmable/interact(mob/user as mob) - var/dat = buildMenu() - user << browse("Unloader[dat]", "window=progreload") - onclose(user, "progreload") - return - -/obj/machinery/programmable/Topic(href, href_list) - if(..()) - return 1 - usr.set_machine(src) - add_fingerprint(usr) - switch(href_list["operation"]) - if("start") - on = (on ? 0 : 1) - if(on) use_power = 1 - else use_power = 0 - updateUsrDialog() - return - if("inlet") - indir *= 2 // N S E W - if(indir > 8) - indir = 1 // W N - if(indir == src.outdir) - indir *= 2 - if(indir > 8) - indir = 1 - input = get_step(src,indir) // todo: check for glasswalls / no path to target? - updateUsrDialog() - return - if("outlet") - outdir *= 2 - if(outdir > 8) - outdir = 1 - if(outdir == indir) - outdir *= 2 - if(outdir > 8) - outdir = 1 - output = get_step(src,outdir) // todo: check for walls / glasswalls / invalid output locations - updateUsrDialog() - return - if("swapdir") - var/temp = outdir - outdir = indir - indir = temp - input = get_step(src,indir) - output = get_step(src,outdir) - updateUsrDialog() - return - if("default") - default.enabled = (default.enabled ? 0 : 1) - updateUsrDialog() - return - var/which = href_list["operation"] - for(var/datum/cargoprofile/p in overrides + profiles) - if(which == p.id) - p.enabled = (p.enabled? 0 : 1) - updateUsrDialog() - return - -/obj/machinery/programmable/attackby(obj/item/I as obj, mob/user as mob, params) - if(istype(I,/obj/item/wrench)) // code borrowed from pipe dispenser - if(unwrenched==0) - playsound(src.loc, I.usesound, 50, 1) - to_chat(user, "You begin to unfasten \the [src] from the floor...") - if(do_after(user, 40 * I.toolspeed, target = src)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "You have unfastened \the [src]. Now it can be pulled somewhere else.", \ - "You hear ratchet.") - src.anchored = 0 - src.stat |= MAINT - src.unwrenched = 1 - if(usr.machine==src) - usr << browse(null, "window=pipedispenser") - else /* unwrenched */ - playsound(src.loc, I.usesound, 50, 1) - to_chat(user, "You begin to fasten \the [src] to the floor...") - if(do_after(user, 20 * I.toolspeed, target = src)) - user.visible_message( \ - "[user] fastens \the [src].", \ - "You fastened \the [src] into place.", \ - "You hear ratchet.") - src.anchored = 1 - src.input = get_step(src.loc,src.indir) - src.output = get_step(src.loc,src.outdir) - if(!open && !circuit_removed) - src.stat &= ~MAINT - src.unwrenched = 0 - power_change() - if(istype(I,/obj/item/screwdriver)) - if(open) - open = 0 - if(!unwrenched && !circuit_removed) - src.stat &= ~MAINT - to_chat(user, "You close \the [src]'s maintenance panel.") - else - open = 1 - src.stat |= MAINT - to_chat(user, "You open \the [src]'s maintenance panel.") - if(istype(I,/obj/item/crowbar)) - if(open) - to_chat(user, "You begin to pry out the [src]'s circuits.") - if(do_after(user, 40 * I.toolspeed, target = src)) - to_chat(user, "You remove the circuitboard.") - playsound(loc, I.usesound, 50, 1) - circuit_removed = 1 - use_power = 0 - on = 0 - - var/obj/item/circuitboard/programmable/P = new(src.loc) - P.emagged = src.emagged - P.default = src.default - src.default = null - P.profiles = src.profiles - src.profiles = null - P.overrides = src.overrides - src.overrides = null - P.emag_overrides = src.emag_overrides - src.emag_overrides = null - default_deconstruction_crowbar(I, 1) - return - else - ..(I,user) - - if(istype(I,/obj/item/circuitboard/programmable)) - if(!open) - to_chat(user, "You have to open the machine first!") - return - if(!circuit_removed) - to_chat(user, "There is already a circuitboard present!") - return - circuit_removed = 0 - I.loc = src - RefreshParts() - -/obj/machinery/programmable/emag_act(user as mob) - if(emagged) - return - to_chat(user, "You swipe the unloader with your card. After a moment's grinding, it beeps in a sinister fashion.") - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) - emagged = 1 - overrides += emag_overrides - - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(2, 1, src) - s.start() - return - -/obj/machinery/programmable/process() - if(!output || !input) - return - - if(!on || stat || sleep) - if(sleep > 0) // prevent input or output errors from happening every tick - sleep-- - use_power = 0 - - //Do not let things get stuck inside. That's broken behavior. - for(var/obj/O in contents) - O.loc = loc - for(var/mob/M in contents) - M.loc = loc - M.reset_perspective(null) - to_chat(M, "The machine turns off, and you fall out.") - - return - - //Normal output reaction - if(contents.len) - for(var/atom/movable/A in contents) - var/datum/cargoprofile/p = types[A.type] - if(p) - p.outlet_reaction(A,output) - else - A.loc = output // may have been dropped by a mob, etc - - if(types.len > 50) - types = list() // good luck mr. garbage collector - - - var/work = 0 - for(var/mob/M in input.contents) - for(var/datum/cargoprofile/p in overrides + default) - if(p.enabled && p.mobcheck && p.contains(M)) - var/done = p.inlet_reaction(M,input,workmax - work) - if(done) - work += done - if(src.debug) - visible_message("[p.name]:[M.name] ([done])") - break - - if(sleep) - return // something stopped the machine - - for(var/obj/A in input.contents)// I fully expect this to cause unreasonable lag - if(!A) - break - if(work > workmax) - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) // Beep if the machine is full - testing only probably - break - - var/done = 0 // work done - testing only - var/aname // target item name - testing only - - for(var/datum/cargoprofile/p in overrides) - if(p.enabled && p.contains(A)) - aname = A.name // in case of deletion - done = p.inlet_reaction(A,input,workmax - work) - if(done) - work += done - if(src.debug) - visible_message("[p.name]:[aname] ([done])") - - else - break - if(sleep) - break // Something stopped the machine - if(!A || A.loc != input || done) - continue // next item - - if(default && default.enabled) - if(default.contains(A)) - aname = A.name - done = default.inlet_reaction(A,input,workmax - work) - if(done) - work += done - if(src.debug) - visible_message("[default.name]: [aname] ([done])") - continue - for(var/datum/cargoprofile/p in profiles) - if(p.enabled && p.contains(A)) - aname = A.name - done = p.inlet_reaction(A,input,workmax - work) - if(done) - work += done - if(src.debug) - visible_message("[p.name]:[aname] ([done])") - else - break - if(work) - use_power = 2 - else - use_power = 1 -//---------------------------------------------------------------------------- -// Specialty machines -//---------------------------------------------------------------------------- - -//Uses the inlet stacking profile. Ejects only full stacks. -/obj/machinery/programmable/stacker - name = "Stacking & Spooling Machine" - default = new/datum/cargoprofile/in_stacker() - profiles = list() - overrides = list() - emag_overrides = list() - typename = "Stacking and Spooling Machine" - - -/obj/machinery/programmable/unloader - name = "Cargo Unloader" - default = new/datum/cargoprofile/cargo/unload() - profiles = list() - overrides = list() - emag_overrides = list() - typename = "Cargo Unloader" - -/obj/machinery/programmable/delivery - name = "Finished robot delivery" - default = new/datum/cargoprofile/finished() - profiles = list() - overrides = list() - emag_overrides = list() - typename = "Robot Delivery" - -/obj/machinery/programmable/crate_handler - name = "Crate Handler" - default = null - profiles = list(new/datum/cargoprofile/cargo/unload(),new/datum/cargoprofile/cargo(),new/datum/cargoprofile/cargo/empty(),new/datum/cargoprofile/cargo/full()) - overrides = list() - emag_overrides = list() - typename = "Crate Handler" - -//---------------------------------------------------------------------------- -// Unary machine: Input and output in the same location -// Be careful with this, it could easily be running the same -// computations every round needlessly -//---------------------------------------------------------------------------- -/obj/machinery/programmable/unary - name = "Programmable Processor" - default = null - profiles = list() - overrides = list(new/datum/cargoprofile/unary/stacker(),new/datum/cargoprofile/unary/trainer()) - emag_overrides = list(new/datum/cargoprofile/unary/shredder()) - indir = 1 - outdir = 1 - typename = "Processor" - - New() - ..() - outdir = indir - output = input - buildMenu() - var/dat - dat += "PROGRAMMABLE PROCESSOR
    " - dat += "POWER: [on ? "ON" : "OFF"]
    " - dat += "INLET: [capitalize(dir2text(indir))]
    " - if(default) - dat += "MAIN PROGRAM: " - dat += "[default.name]: [default.enabled ? "YES" : "NO"]
    " - if(profiles.len) - if(!default || !default.enabled) - dat += printlist(profiles) - dat += "
    " - if(overrides.len) - dat += "
    OVERRIDES:
    " - dat += printlist(overrides) - dat += "" - return dat - Topic(href, href_list) - switch(href_list["operation"]) - if("inlet") - indir *= 2 // N S E W - if(indir > 8) - indir = 1 // W N - outdir = indir - input = get_step(src,indir) // todo: check for glasswalls / no path to target? - output = input - updateUsrDialog() - return - return ..() - -/obj/machinery/programmable/unary/stacker - name = "Stacking Machine" - default = new/datum/cargoprofile/unary/stacker() - profiles = list() - overrides = list() - emag_overrides = list() - typename = "Stacking Machine" - -/obj/machinery/programmable/unary/shredder - name = "Paper Shredder" - default = new/datum/cargoprofile/unary/shredder() - profiles = list() - overrides = list() - emag_overrides = list(new/datum/cargoprofile/unary/gibber()) - typename = "Paper Shredder" - -/obj/machinery/programmable/unary/trainer - name = "\improper Boxing Trainer" - default = new/datum/cargoprofile/unary/trainer() - profiles = list() - overrides = list() - emag_overrides = list() - typename = "Boxing Trainer" - - attack_hand(mob/user as mob) //How did I type this with boxing gloves on? - if(!istype(user,/mob/living/carbon/human)) - return ..() - - var/mob/living/carbon/human/H = user - if(H.gloves && istype(H.gloves, /obj/item/clothing/gloves/boxing)) - var/newsleep = 0 - if(H.loc != input) - to_chat(H, "The boxing machine refuses to acknowledge you unless you face it head on!") - return - var/damage = 0 - if(H.a_intent != INTENT_HARM) - damage += rand(0,5) - else - damage += rand(0,10) - if(!damage) - playsound(H.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[H] tries to punch \the [src], but whiffs") - return - - playsound(loc, "punch", 25, 1, -1) - if(HULK in H.mutations) damage += 5 - - if(damage < 5) - visible_message("[H] gives \the [src] a weak punch.") - if(prob(10)) - visible_message("\The [src] feints at [H], as though mocking \him.") - else if(damage < 10) - visible_message("[H] hits \the [src] with a solid [pick("punch","jab","smack")].") - else if(damage < 15) - visible_message("[pick("Whoa!","Nice!","Gasp!")] [H] hits [src] with a powerful [pick("punch","jab","uppercut","left hook", "right hook")].") - else if(damage < 20) - visible_message("[pick("WHOA!","ACK!","Jeez!")] [H] hits [src] so hard, the whole machine rocks band and forth for a moment.") - else - visible_message("Holy moly! [H] hits \the [src] so hard it stops working.") - stat |= BROKEN - return - while(damage >= 5) - if(prob(50)) - newsleep++ - damage -= 5 - if(newsleep) - if(emagged) - visible_message("\The [src]'s lights glow a bloodthirsty red. It refuses to stop!") - sleep = 0 - else - sleep += newsleep - visible_message("\The [src]'s lights dim for a moment and it beeps, signifying a valid hit.") - playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) - return - - else - return ..() - -//---------------------------------------------------------------------------- -// For construction -//---------------------------------------------------------------------------- -/obj/item/circuitboard/programmable - name = "Circuit board (Programmable Unloader)" - build_path = "/obj/machinery/programmable" - board_type = "machine" - origin_tech = "engineering=1;programming=2" - frame_desc = "Requires 2 Manipulators, 1 Scanning Module, 1 Cable." - req_components = list( - /obj/item/stock_parts/scanning_module = 1, - /obj/item/stock_parts/manipulator = 2, - /obj/item/stack/cable_coil = 1) - - //Customization of the machine - var/datum/cargoprofile/default = new/datum/cargoprofile() - var/list/profiles = list() - var/list/overrides = list() - var/list/emag_overrides = list() - - var/emagged = 0 - var/hacking = 0 - - proc/resetlists() - profiles = list(new/datum/cargoprofile/cargo(),new/datum/cargoprofile/boxes(),new/datum/cargoprofile/supplies(), - new/datum/cargoprofile/exotics(),new/datum/cargoprofile/tools(),new/datum/cargoprofile/weapons(),new/datum/cargoprofile/finished(), - new/datum/cargoprofile/pressure(),new/datum/cargoprofile/pressure/full(),new/datum/cargoprofile/pressure/empty(), - new/datum/cargoprofile/chemical(),new/datum/cargoprofile/organics(),new/datum/cargoprofile/food(), - new/datum/cargoprofile/clothing(),new/datum/cargoprofile/trash()) - overrides = list(new/datum/cargoprofile/cargo/unload(),new/datum/cargoprofile/in_stacker(), - new/datum/cargoprofile/unary/stacker(),new/datum/cargoprofile/unary/trainer()) - emag_overrides = list(new/datum/cargoprofile/people(),new/datum/cargoprofile/unary/shredder()) - - New() - ..() - resetlists() - - attackby(obj/item/I as obj, mob/user as mob, params) - if(istype(I,/obj/item/multitool)) - hacking = (hacking?0:1) - if(hacking) - to_chat(user, "You unlock the data port on the board. You can now use a PDA to alter its data.") - else - to_chat(user, "You relock the data port.") - if(istype(I,/obj/item/pda)) - if(!hacking) - to_chat(user, "It looks like you can't access the board's data port. You'll have to open it with a multitool.") - else - user.set_machine(src) - interact(user) - if(istype(I,/obj/item/card/emag) && !emagged) - if(!hacking) - to_chat(user, "There seems to be a data port on the card, but it's locked. A multitool could open it.") - else - emagged = 1 - overrides += emag_overrides - to_chat(user, "You swipe the card in the card's data port. The lights flicker, then flash once.") - - proc/format(var/datum/cargoprofile/P,var/level) - // PROFILE=0 OVERRIDE=1 MAIN=2 - if(P == null) - return "NONE
    " - var/dat = "[P.name]" - if(level == 0 || (level == 1 && !default)) - dat += " PROMOTE" - if(level > 0) - dat += " DEMOTE" - dat += " REMOVE" - dat += "
    " - return dat - - interact(mob/user as mob) - var/dat - dat = "MAIN FUNCTION
    " - dat += format(default,2) - dat += "- CAUTION -
    \[DELETE NON-MAIN ALGORITHMS\]
    " - dat += "\[MASTER RESET\]
    " - - dat += "OVERRIDES:
    " - for(var/datum/cargoprofile/P in overrides) - dat += format(P,1) - dat += "
    " - dat += "- CAUTION -
    \[DELETE ALL OVERRIDES\]
    " - - dat += "
    TERTIARY PROFILES:
    " - for(var/datum/cargoprofile/P in profiles) - dat += format(P,0) - dat += "
    " - dat += "- CAUTION -
    \[DELETE TERTIARY PROFILES\]" - - user << browse("Circuit Reprogramming[dat]", "window=progcircuit") - onclose(user, "progcircuit") - - Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - var/id = href_list["id"] - var/level = text2num(href_list["level"]) - switch(href_list["operation"]) - if("promote") - if(level == 0) - for(var/datum/cargoprofile/T in profiles) - if(T.id == id) - overrides += T - profiles -= T - //updateUsrDialog() - interact(usr) - return - - if(level == 1) - if(default) return - for(var/datum/cargoprofile/T in overrides) - if(T.id == id) - default = T - overrides -= T - - if(default.dedicated_path) - build_path = "[default.dedicated_path]" - else - if(istype(default,/datum/cargoprofile/unary)) - build_path = "/obj/machinery/programmable/unary" - else - build_path = "/obj/machinery/programmable" - - //updateUsrDialog() - interact(usr) - return - - if("demote") - if(level == 2) - overrides += default - default = null - //updateUsrDialog() - interact(usr) - return - if(level == 1) - for(var/datum/cargoprofile/T in overrides) - if(T.id == id) - profiles += T - overrides -= T - //updateUsrDialog() - interact(usr) - return - if("delete") - if(level == 2) - default = null - //updateUsrDialog() - interact(usr) - return - if(level == 1) - for(var/datum/cargoprofile/T in overrides) - if(T.id == id) - overrides -= T - //updateUsrDialog() - interact(usr) - return - if(level == 0) - for(var/datum/cargoprofile/T in profiles) - if(T.id == id) - profiles -= T - //updateUsrDialog() - interact(usr) - return - if("deleteall") - for(var/datum/cargoprofile/T in profiles) - profiles -= T - for(var/datum/cargoprofile/T in overrides) - overrides -= T - //updateUsrDialog() - interact(usr) - return - if("deleteoverrides") - for(var/datum/cargoprofile/T in overrides) - overrides -= T - interact(usr) - return - if("deleteprofiles") - for(var/datum/cargoprofile/T in profiles) - profiles -= T - interact(usr) - return - if("reset") - resetlists() - interact(usr) - return - - //End switch diff --git a/code/game/objects/items/weapons/syndie_uplink.dm b/code/game/objects/items/weapons/syndie_uplink.dm deleted file mode 100644 index a09ab0b69a2..00000000000 --- a/code/game/objects/items/weapons/syndie_uplink.dm +++ /dev/null @@ -1,38 +0,0 @@ -/*/obj/item/syndicate_uplink - name = "station bounced radio" - desc = "Remain silent about this..." - icon = 'icons/obj/radio.dmi' - icon_state = "radio" - var/temp = null - var/uses = 10.0 - var/selfdestruct = 0.0 - var/traitor_frequency = 0.0 - var/mob/currentUser = null - var/obj/item/radio/origradio = null - flags = CONDUCT | ONBELT - w_class = WEIGHT_CLASS_SMALL - item_state = "radio" - throw_speed = 4 - throw_range = 20 - materials = list(MAT_METAL=100) - origin_tech = "magnets=2;syndicate=3"*/ - -/obj/item/SWF_uplink - name = "station-bounced radio" - desc = "used to comunicate it appears." - icon = 'icons/obj/radio.dmi' - icon_state = "radio" - var/temp = null - var/uses = 4.0 - var/selfdestruct = 0.0 - var/traitor_frequency = 0.0 - var/obj/item/radio/origradio = null - flags = CONDUCT - slot_flags = SLOT_BELT - item_state = "radio" - throwforce = 5 - w_class = WEIGHT_CLASS_SMALL - throw_speed = 4 - throw_range = 20 - materials = list(MAT_METAL=100) - origin_tech = "magnets=1" diff --git a/code/game/objects/items/weapons/wires.dm b/code/game/objects/items/weapons/wires.dm deleted file mode 100644 index 44097096ae0..00000000000 --- a/code/game/objects/items/weapons/wires.dm +++ /dev/null @@ -1,36 +0,0 @@ -// WIRES - -/obj/item/wire - desc = "This is just a simple piece of regular insulated wire." - name = "wire" - icon = 'icons/obj/power.dmi' - icon_state = "item_wire" - var/amount = 1.0 - var/laying = 0.0 - var/old_lay = null - materials = list(MAT_METAL=40) - attack_verb = list("whipped", "lashed", "disciplined", "tickled") - - suicide_act(mob/user) - to_chat(viewers(user), "[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.") - return (OXYLOSS) - - -/obj/item/wire/proc/update() - if(src.amount > 1) - src.icon_state = "spool_wire" - src.desc = text("This is just spool of regular insulated wire. It consists of about [] unit\s of wire.", src.amount) - else - src.icon_state = "item_wire" - src.desc = "This is just a simple piece of regular insulated wire." - return - -/obj/item/wire/attack_self(mob/user as mob) - if(src.laying) - src.laying = 0 - to_chat(user, "You're done laying wire!") - else - to_chat(user, "You are not using this to lay wire...") - return - - diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index fb5ff5cabd5..57886d2972c 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -452,16 +452,6 @@ build_path = /obj/item/circuitboard/arcade/orion_trail category = list("Misc. Machinery") -/datum/design/programmable - name = "Machine Board (Programmable Unloader)" - desc = "The circuit board for a Programmable Unloader." - id = "selunload" - req_tech = list("engineering" = 1, "programming" = 2) - build_type = IMPRINTER - materials = list(MAT_GLASS = 1000) - build_path = /obj/item/circuitboard/programmable - category = list("Misc. Machinery") - /datum/design/pod name = "Machine Board (Mass Driver and Pod Doors Control)" desc = "Allows for the construction of circuit boards used to build a Mass Driver and Pod Doors Control." diff --git a/paradise.dme b/paradise.dme index 3e22149c595..fd478a69e07 100644 --- a/paradise.dme +++ b/paradise.dme @@ -218,7 +218,6 @@ #include "code\datums\beam.dm" #include "code\datums\browser.dm" #include "code\datums\callback.dm" -#include "code\datums\cargoprofile.dm" #include "code\datums\computerfiles.dm" #include "code\datums\datacore.dm" #include "code\datums\datum.dm" @@ -582,7 +581,6 @@ #include "code\game\machinery\poolcontroller.dm" #include "code\game\machinery\portable_tag_turret.dm" #include "code\game\machinery\portable_turret.dm" -#include "code\game\machinery\programmable_unloader.dm" #include "code\game\machinery\quantum_pad.dm" #include "code\game\machinery\recharger.dm" #include "code\game\machinery\rechargestation.dm" @@ -883,7 +881,6 @@ #include "code\game\objects\items\weapons\stock_parts.dm" #include "code\game\objects\items\weapons\stunbaton.dm" #include "code\game\objects\items\weapons\swords_axes_etc.dm" -#include "code\game\objects\items\weapons\syndie_uplink.dm" #include "code\game\objects\items\weapons\tape.dm" #include "code\game\objects\items\weapons\teleportation.dm" #include "code\game\objects\items\weapons\teleprod.dm" @@ -892,7 +889,6 @@ #include "code\game\objects\items\weapons\vending_items.dm" #include "code\game\objects\items\weapons\weaponry.dm" #include "code\game\objects\items\weapons\whetstone.dm" -#include "code\game\objects\items\weapons\wires.dm" #include "code\game\objects\items\weapons\grenades\atmosgrenade.dm" #include "code\game\objects\items\weapons\grenades\bananade.dm" #include "code\game\objects\items\weapons\grenades\chem_grenade.dm" From e649a72923501c3c2777ff7ef28d4e6906b0417d Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Mon, 30 Apr 2018 03:53:49 -0400 Subject: [PATCH 14/47] Emptying Stop-gap --- code/game/objects/items/weapons/storage/storage.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 882852a3632..93f230a07e8 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -421,6 +421,7 @@ hide_from(usr) for(var/obj/item/I in contents) remove_from_storage(I, T) + CHECK_TICK /obj/item/storage/New() can_hold = typecacheof(can_hold) From f28285e16fae1fa95b4bf3d2f3713b96a2bfc7df Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Mon, 30 Apr 2018 04:42:57 -0400 Subject: [PATCH 15/47] further checks --- code/modules/mining/satchel_ore_boxdm.dm | 32 +++++++++++------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index a844e7ff551..33334d49382 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -6,26 +6,26 @@ icon_state = "orebox0" name = "ore box" desc = "A heavy wooden box, which can be filled with a lot of ores." - density = 1 - pressure_resistance = 5*ONE_ATMOSPHERE + density = TRUE + pressure_resistance = 5 * ONE_ATMOSPHERE -/obj/structure/ore_box/attackby(obj/item/W as obj, mob/user as mob, params) +/obj/structure/ore_box/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/t_scanner/adv_mining_scanner)) attack_hand(user) return if(istype(W, /obj/item/ore)) if(!user.drop_item()) return - W.loc = src + W.forceMove(src) if(istype(W, /obj/item/storage)) var/obj/item/storage/S = W S.hide_from(usr) for(var/obj/item/ore/O in S.contents) S.remove_from_storage(O, src) //This will move the item to this item's contents + CHECK_TICK to_chat(user, "You empty the satchel into the box.") - return -/obj/structure/ore_box/attack_hand(mob/user as mob) +/obj/structure/ore_box/attack_hand(mob/user) var/amt_gold = 0 var/amt_silver = 0 var/amt_diamond = 0 @@ -90,20 +90,19 @@ var/datum/browser/popup = new(user, "orebox", name, 400, 400) popup.set_content(dat) popup.open(0) - return /obj/structure/ore_box/Topic(href, href_list) if(..()) return usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) if(href_list["removeall"]) for(var/obj/item/ore/O in contents) contents -= O - O.loc = src.loc + O.forceMove(loc) + CHECK_TICK to_chat(usr, "You empty the box.") - src.updateUsrDialog() - return + updateUsrDialog() obj/structure/ore_box/ex_act(severity, target) if(prob(100 / severity) && severity < 3) @@ -115,11 +114,11 @@ obj/structure/ore_box/ex_act(severity, target) set category = "Object" set src in view(1) - if(!istype(usr, /mob/living/carbon/human)) //Only living, intelligent creatures with hands can empty ore boxes. + if(!ishuman(usr)) //Only living, intelligent creatures with hands can empty ore boxes. to_chat(usr, "You are physically incapable of emptying the ore box.") return - if( usr.stat || usr.restrained() ) + if(usr.incapacitated()) return if(!Adjacent(usr)) //You can only empty the box if you can physically reach it @@ -134,7 +133,6 @@ obj/structure/ore_box/ex_act(severity, target) for(var/obj/item/ore/O in contents) contents -= O - O.loc = src.loc - to_chat(usr, "You empty the ore box.") - - return + O.forceMove(loc) + CHECK_TICK + to_chat(usr, "You empty the ore box.") \ No newline at end of file From cacde22a27b5a62bfe766bf54e6a2593df2cefd3 Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Mon, 30 Apr 2018 09:36:22 -0700 Subject: [PATCH 16/47] Readd human/New warning about excessive arguments --- code/modules/mob/living/carbon/human/human.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ee92382391c..e0f90aacdd0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -10,6 +10,11 @@ var/datum/species/species //Contains icon generation and language information, set during New(). var/obj/item/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. +/mob/living/carbon/human/New(loc) + if(length(args) > 1) + log_runtime(EXCEPTION("human/New called with more than 1 argument (REPORT THIS ENTIRE RUNTIME TO A CODER)")) + . = ..() + /mob/living/carbon/human/Initialize(mapload, new_species = null) if(!dna) dna = new /datum/dna(null) From bd14d5862788e7154d3fcf3b14bccae92de6d91e Mon Sep 17 00:00:00 2001 From: Alffd Date: Mon, 30 Apr 2018 23:41:03 -0400 Subject: [PATCH 17/47] Graceful shutdown --- code/game/world.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/game/world.dm b/code/game/world.dm index 4ebeadedc6f..dc4b830704e 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -324,6 +324,10 @@ var/world_topic_spam_protect_time = world.timeofday processScheduler.stop() shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss. + for(var/client/C in clients) + if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite + C << link("byond://[config.server]") + if(config && config.shutdown_on_reboot) sleep(0) if(shutdown_shell_command) @@ -331,9 +335,6 @@ var/world_topic_spam_protect_time = world.timeofday del(world) return else - for(var/client/C in clients) - if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite - C << link("byond://[config.server]") ..(0) From d53f3c3e26c04c41a78dfb1f3084eef47ff097e1 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 1 May 2018 16:19:20 -0400 Subject: [PATCH 18/47] Automatic changelog generation for PR #8965 [ci skip] --- html/changelogs/AutoChangeLog-pr-8965.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8965.yml diff --git a/html/changelogs/AutoChangeLog-pr-8965.yml b/html/changelogs/AutoChangeLog-pr-8965.yml new file mode 100644 index 00000000000..a11ef7e4f53 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8965.yml @@ -0,0 +1,4 @@ +author: "Alffd" +delete-after: True +changes: + - bugfix: "Tell clients to rejoin after shutdown, before killing the server." From 4fc8a93a3739f0875db7cdf7a2d614a6b12ee75d Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 1 May 2018 16:46:33 -0400 Subject: [PATCH 19/47] Makes Bomb Range Multi-Use --- _maps/map_files/cyberiad/cyberiad.dmm | 2 +- code/game/turfs/simulated/floor/plasteel_floor.dm | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 1108d55aa5d..91ff38abb2c 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -6505,7 +6505,7 @@ "cve" = (/obj/item/assembly/timer,/obj/item/assembly/timer{pixel_x = 6},/obj/item/assembly/timer{pixel_x = -5; pixel_y = 6},/obj/structure/table,/obj/item/assembly/timer{pixel_x = -3; pixel_y = -4},/obj/item/assembly/timer{pixel_x = 8; pixel_y = 8},/obj/item/assembly/timer,/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/light,/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cvf" = (/obj/machinery/atmospherics/trinary/mixer{density = 0; dir = 8; req_access = null},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cvg" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 4},/obj/item/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) -"cvh" = (/obj/item/radio/beacon,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel/airless,/area/toxins/test_area) +"cvh" = (/obj/item/radio/beacon,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel/airless/indestructible,/area/toxins/test_area) "cvi" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing) "cvj" = (/obj/machinery/mass_driver{dir = 4; id_tag = "toxinsdriver"},/turf/simulated/floor/plating,/area/toxins/launch{name = "Toxins Launch Room"}) "cvk" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/apmaint) diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm index cbb5647f283..cba841ce823 100644 --- a/code/game/turfs/simulated/floor/plasteel_floor.dm +++ b/code/game/turfs/simulated/floor/plasteel_floor.dm @@ -18,8 +18,13 @@ /turf/simulated/floor/plasteel/airless/New() ..() - name = "floor" - + name = "floor" + +/turf/simulated/floor/plasteel/airless/indestructible // For bomb testing range + +/turf/simulated/floor/plasteel/airless/indestructible/ex_act(severity) + return + /turf/simulated/floor/plasteel/goonplaque icon_state = "plaque" name = "Commemorative Plaque" From 6653955fc8cdce4bf92a87497c579858a9c3e84c Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 1 May 2018 20:53:13 +0000 Subject: [PATCH 20/47] Automatic changelog compile, [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-8965.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-8965.yml diff --git a/html/changelog.html b/html/changelog.html index 7f3af71489e..dd7c791b908 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,12 @@ -->
    +

    01 May 2018

    +

    Alffd updated:

    +
      +
    • Tell clients to rejoin after shutdown, before killing the server.
    • +
    +

    30 April 2018

    Fox McCloud updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index c1ed06b54a7..a50f478c5e7 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6365,3 +6365,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Medbay treatment center now has a wider entrance - tweak: Virology hallway is now publically accessible from Surgery waiting room, entrance is now double-doors. +2018-05-01: + Alffd: + - bugfix: Tell clients to rejoin after shutdown, before killing the server. diff --git a/html/changelogs/AutoChangeLog-pr-8965.yml b/html/changelogs/AutoChangeLog-pr-8965.yml deleted file mode 100644 index a11ef7e4f53..00000000000 --- a/html/changelogs/AutoChangeLog-pr-8965.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Alffd" -delete-after: True -changes: - - bugfix: "Tell clients to rejoin after shutdown, before killing the server." From 9c0444f36f367ad1cbf4de4671e30f3d78724b09 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 1 May 2018 17:07:13 -0400 Subject: [PATCH 21/47] Automatic changelog generation for PR #8959 [ci skip] --- html/changelogs/AutoChangeLog-pr-8959.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8959.yml diff --git a/html/changelogs/AutoChangeLog-pr-8959.yml b/html/changelogs/AutoChangeLog-pr-8959.yml new file mode 100644 index 00000000000..b5c3347cde5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8959.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - rscdel: "Removed programmable unloader circuit" From dfb2bf7b1f45f5594f6ae6a87372083fbea427bb Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 1 May 2018 21:45:37 +0000 Subject: [PATCH 22/47] Automatic changelog compile, [ci skip] --- html/changelog.html | 4 ++++ html/changelogs/.all_changelog.yml | 2 ++ html/changelogs/AutoChangeLog-pr-8959.yml | 4 ---- 3 files changed, 6 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-8959.yml diff --git a/html/changelog.html b/html/changelog.html index dd7c791b908..ee5f80506b8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -61,6 +61,10 @@
      • Tell clients to rejoin after shutdown, before killing the server.
      +

      Fox McCloud updated:

      +
        +
      • Removed programmable unloader circuit
      • +

      30 April 2018

      Fox McCloud updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index a50f478c5e7..b3fa9596568 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6368,3 +6368,5 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2018-05-01: Alffd: - bugfix: Tell clients to rejoin after shutdown, before killing the server. + Fox McCloud: + - rscdel: Removed programmable unloader circuit diff --git a/html/changelogs/AutoChangeLog-pr-8959.yml b/html/changelogs/AutoChangeLog-pr-8959.yml deleted file mode 100644 index b5c3347cde5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-8959.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscdel: "Removed programmable unloader circuit" From ffb0a9cb205f2bce96ae4584a371760b4b039326 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 1 May 2018 18:14:04 -0400 Subject: [PATCH 23/47] Automatic changelog generation for PR #8966 [ci skip] --- html/changelogs/AutoChangeLog-pr-8966.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8966.yml diff --git a/html/changelogs/AutoChangeLog-pr-8966.yml b/html/changelogs/AutoChangeLog-pr-8966.yml new file mode 100644 index 00000000000..78d6466e900 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8966.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Bomb testing range can now be utilized multiple times without worry of the bomb bouncing off and returning back to you" From e23f084b0bb1e0670800883466f3125cc313e055 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 1 May 2018 22:42:57 +0000 Subject: [PATCH 24/47] Automatic changelog compile, [ci skip] --- html/changelog.html | 1 + html/changelogs/.all_changelog.yml | 2 ++ html/changelogs/AutoChangeLog-pr-8966.yml | 4 ---- 3 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-8966.yml diff --git a/html/changelog.html b/html/changelog.html index ee5f80506b8..5a1c74d6fd8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -64,6 +64,7 @@

      Fox McCloud updated:

      • Removed programmable unloader circuit
      • +
      • Bomb testing range can now be utilized multiple times without worry of the bomb bouncing off and returning back to you

      30 April 2018

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index b3fa9596568..9f1edb566a0 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6370,3 +6370,5 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Tell clients to rejoin after shutdown, before killing the server. Fox McCloud: - rscdel: Removed programmable unloader circuit + - bugfix: Bomb testing range can now be utilized multiple times without worry of + the bomb bouncing off and returning back to you diff --git a/html/changelogs/AutoChangeLog-pr-8966.yml b/html/changelogs/AutoChangeLog-pr-8966.yml deleted file mode 100644 index 78d6466e900..00000000000 --- a/html/changelogs/AutoChangeLog-pr-8966.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Bomb testing range can now be utilized multiple times without worry of the bomb bouncing off and returning back to you" From 6d0ca94ce9247ed0347f3e60316bd19573b2f26c Mon Sep 17 00:00:00 2001 From: Tayyyyyyy Date: Tue, 1 May 2018 20:38:04 -0500 Subject: [PATCH 25/47] Make extract organ and gland insert failable --- .../gamemodes/miniantags/abduction/abduction_surgery.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm index 235d5203ae0..1b5b6bde156 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm @@ -50,7 +50,8 @@ return 1 /datum/surgery_step/internal/extract_organ/fail_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - return end_step(user, target, target_zone, tool, surgery) + user.visible_message("[user]'s hand slips, failing to extract anything!", "Your hand slips, failing to extract anything!") + return 0 /datum/surgery_step/internal/gland_insert name = "insert gland" @@ -69,7 +70,8 @@ return 1 /datum/surgery_step/internal/gland_insert/fail_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - return end_step(user, target, target_zone, tool, surgery) + user.visible_message("[user]'s hand slips, failing to insert the gland!", "Your hand slips, failing to insert the gland!") + return 0 //IPC Gland Surgery// From 1a00cbdcf92f7674d4f30f989fe918b45ce22301 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Wed, 2 May 2018 00:14:32 -0400 Subject: [PATCH 26/47] Actually Fixes Chem Smoke --- .../chemistry/recipes/pyrotechnics.dm | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 74a9b740c62..c7acc705150 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -214,19 +214,18 @@ datum/chemical_reaction/flash_powder var/datum/effect_system/smoke_spread/chem/S = new S.attach(location) playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - if(S) - S.set_up(holder, 10, 0, location) - if(created_volume < 5) - S.start(1) - if(created_volume >=5 && created_volume < 10) - S.start(2) - if(created_volume >= 10 && created_volume < 15) - S.start(3) - if(created_volume >=15) - S.start(4) - if(holder && holder.my_atom) - holder.clear_reagents() + if(S) + S.set_up(holder, 10, 0, location) + if(created_volume < 5) + S.start(1) + if(created_volume >=5 && created_volume < 10) + S.start(2) + if(created_volume >= 10 && created_volume < 15) + S.start(3) + if(created_volume >=15) + S.start(4) + if(holder && holder.my_atom) + holder.clear_reagents() /datum/chemical_reaction/smoke/smoke_powder name = "smoke_powder_smoke" From 326fa1fc6377b0894b2abc5770c72340c31c40e9 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 2 May 2018 00:44:10 -0400 Subject: [PATCH 27/47] Automatic changelog generation for PR #8968 [ci skip] --- html/changelogs/AutoChangeLog-pr-8968.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8968.yml diff --git a/html/changelogs/AutoChangeLog-pr-8968.yml b/html/changelogs/AutoChangeLog-pr-8968.yml new file mode 100644 index 00000000000..b760338cbc5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8968.yml @@ -0,0 +1,4 @@ +author: "CrazyLemon and Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes reagent smoke" From 6a66e0d01db9b9617912cacb7996aa42d6f83cd0 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 2 May 2018 06:02:49 +0000 Subject: [PATCH 28/47] Automatic changelog compile, [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-8968.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-8968.yml diff --git a/html/changelog.html b/html/changelog.html index 5a1c74d6fd8..0938ed45f8e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,12 @@ -->
      +

      02 May 2018

      +

      CrazyLemon and Fox McCloud updated:

      +
        +
      • Fixes reagent smoke
      • +
      +

      01 May 2018

      Alffd updated:

        diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 9f1edb566a0..a99a2c4b64c 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6372,3 +6372,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscdel: Removed programmable unloader circuit - bugfix: Bomb testing range can now be utilized multiple times without worry of the bomb bouncing off and returning back to you +2018-05-02: + CrazyLemon and Fox McCloud: + - bugfix: Fixes reagent smoke diff --git a/html/changelogs/AutoChangeLog-pr-8968.yml b/html/changelogs/AutoChangeLog-pr-8968.yml deleted file mode 100644 index b760338cbc5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-8968.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CrazyLemon and Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes reagent smoke" From 7d40da6a0e85297cd4e0e71b979891a6c9663070 Mon Sep 17 00:00:00 2001 From: Tayyyyyyy Date: Wed, 2 May 2018 02:26:15 -0500 Subject: [PATCH 29/47] Fix TRUE/FALSE --- .../miniantags/abduction/abduction_surgery.dm | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm index 1b5b6bde156..2d3bed1e0cf 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm @@ -5,19 +5,19 @@ /datum/surgery/organ_extraction/can_start(mob/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) if(!ishuman(user)) - return 0 + return FALSE if(ishuman(target)) var/mob/living/carbon/human/H = target var/obj/item/organ/external/affected = H.get_organ(target_zone) if(!affected) - return 0 + return FALSE if(affected.status & ORGAN_ROBOT) - return 0 + return FALSE var/mob/living/carbon/human/H = user // You must either: Be of the abductor species, or contain an abductor implant if((H.get_species() == "Abductor" || (locate(/obj/item/implant/abductor) in H))) - return 1 - return 0 + return TRUE + return FALSE /datum/surgery_step/internal/extract_organ @@ -39,19 +39,19 @@ var/mob/living/carbon/human/AB = target if(NO_INTORGANS in AB.species.species_traits) user.visible_message("[user] prepares [target]'s [target_zone] for further dissection!", "You prepare [target]'s [target_zone] for further dissection.") - return 1 + return TRUE if(IC) user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].") user.put_in_hands(IC) IC.remove(target, special = 1) - return 1 + return TRUE else to_chat(user, "You don't find anything in [target]'s [target_zone]!") - return 1 + return TRUE /datum/surgery_step/internal/extract_organ/fail_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user]'s hand slips, failing to extract anything!", "Your hand slips, failing to extract anything!") - return 0 + return FALSE /datum/surgery_step/internal/gland_insert name = "insert gland" @@ -67,11 +67,11 @@ user.drop_item() var/obj/item/organ/internal/heart/gland/gland = tool gland.insert(target, 2) - return 1 + return TRUE /datum/surgery_step/internal/gland_insert/fail_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user]'s hand slips, failing to insert the gland!", "Your hand slips, failing to insert the gland!") - return 0 + return FALSE //IPC Gland Surgery// @@ -99,4 +99,4 @@ /datum/surgery_step/internal/extract_organ/synth name = "remove cell" - organ_types = list(/obj/item/organ/internal/cell) \ No newline at end of file + organ_types = list(/obj/item/organ/internal/cell) From ee538b25d5ce88f684997658e6bbfafb8cdeb021 Mon Sep 17 00:00:00 2001 From: Kyep Date: Wed, 2 May 2018 17:02:24 -0700 Subject: [PATCH 30/47] Monkey business logging --- code/modules/food_and_drinks/food/snacks.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 1b8c0b5b989..0176049b59a 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -1250,7 +1250,13 @@ /obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand() if(!QDELETED(src)) visible_message("[src] expands!") - new/mob/living/carbon/human(get_turf(src), monkey_type) + if(fingerprintslast) + log_game("Cube ([monkey_type]) inflated, last touched by: " + fingerprintslast) + else + log_game("Cube ([monkey_type]) inflated, last touched by: NO_DATA") + var/mob/living/carbon/human/creature = new /mob/living/carbon/human(get_turf(src), monkey_type) + if(fingerprintshidden.len) + creature.fingerprintshidden = fingerprintshidden.Copy() qdel(src) /obj/item/reagent_containers/food/snacks/monkeycube/farwacube From 5243c254acf7dc11da7f3daabe8703067d4d8b26 Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Thu, 3 May 2018 19:28:35 -0700 Subject: [PATCH 31/47] Update monkey cubes --- code/modules/food_and_drinks/food/snacks.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 1b8c0b5b989..478098ff13d 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -1250,7 +1250,8 @@ /obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand() if(!QDELETED(src)) visible_message("[src] expands!") - new/mob/living/carbon/human(get_turf(src), monkey_type) + var/mob/living/carbon/human/H = new /mob/living/carbon/human(get_turf(src)) + H.set_species(monkey_type) qdel(src) /obj/item/reagent_containers/food/snacks/monkeycube/farwacube From c28311790c488731c9c60d5915491024b6635d02 Mon Sep 17 00:00:00 2001 From: Isaac Date: Fri, 4 May 2018 07:48:20 -0500 Subject: [PATCH 32/47] individualize the window title from other servers --- interface/skin.dmf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/skin.dmf b/interface/skin.dmf index 54ed0c40d6a..813abc66b98 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1499,7 +1499,7 @@ window "mainwindow" size = 640x440 is-default = true is-maximized = true - title = "Space Station 13" + title = "Paradise Station 13" icon = 'icons\\ss13_64.png' menu = "menu" macro = "macro" From f6ff7e5223a2a260135b9dce9a5514da5d61590e Mon Sep 17 00:00:00 2001 From: TravellingMerchant Date: Fri, 4 May 2018 16:31:29 +0100 Subject: [PATCH 33/47] Updates Merchant Fluff Icon --- icons/mob/head.dmi | Bin 238523 -> 239379 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 16eeff1107f89a13fa9b057ef5222596640d13c3..49679ae2256f2ff342f9e4497ebf092caa0cfb13 100644 GIT binary patch delta 27482 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 delta 26655 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 From 7296f7d754aa8c33d140b228e4b971533bb369e8 Mon Sep 17 00:00:00 2001 From: TravellingMerchant Date: Fri, 4 May 2018 16:32:28 +0100 Subject: [PATCH 34/47] Adds missing Merchant fluff icons. --- icons/obj/custom_items.dmi | Bin 93254 -> 95738 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index 8c3b77c337d91a0cb614a538eb88cf6eb044e5ca..d11043875fceab2b96f38bdafa2d9fb4a815aed4 100644 GIT binary patch delta 16550 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 G;Qs>vtwaF; delta 14047 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 Date: Fri, 4 May 2018 16:33:00 +0100 Subject: [PATCH 35/47] Updates Merchants Fluff item. --- code/modules/customitems/item_defines.dm | 48 ++++++++++++------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index a075dbdfba3..6a5d5dd0519 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -497,8 +497,8 @@ #undef USED_MOD_SUIT /obj/item/fluff/merchant_sallet_modkit //Travelling Merchant: Trav Noble. This is what they spawn in with - name = "sallet modkit" - desc = "A modkit that can make most helmets look like a steel sallet." + name = "SG Helmet modkit" + desc = "A modkit that can make most helmets look like a Shellguard Helmet." icon_state = "modkit" w_class = WEIGHT_CLASS_SMALL force = 0 @@ -649,49 +649,49 @@ icon_state = "kakicharakiti" /obj/item/clothing/head/helmet/fluff/merchant_sallet //Travelling Merchant: Trav Noble. This >>IS NOT<< what they spawn in with - name = "Steel Sallet" - desc = "A heavy steel sallet with the word Noble scratched into the side. Comes with a Bevor attached." + name = "Shellguard Helmet" + desc = "A Shellguard Helmet with the name Noble written on the inside." icon = 'icons/obj/custom_items.dmi' icon_state = "merchant_sallet_visor_bevor" item_state = "merchant_sallet_visor_bevor" actions_types = list(/datum/action/item_action/toggle_helmet_mode) toggle_cooldown = 20 - toggle_sound = 'sound/items/ZippoClose.ogg' + toggle_sound = 'sound/items/change_jaws.ogg' flags = BLOCKHAIR flags_inv = HIDEEYES|HIDEMASK|HIDEFACE|HIDEEARS - var/state = "Visor & Bevor" + var/state = "Soldier Up" /obj/item/clothing/head/helmet/fluff/merchant_sallet/attack_self(mob/user) if(!user.incapacitated() && (world.time > cooldown + toggle_cooldown) && Adjacent(user)) var/list/options = list() - options["Visor & Bevor"] = list( + options["Soldier Up"] = list( "icon_state" = "merchant_sallet_visor_bevor", - "visor_flags" = HIDEEYES, - "mask_flags" = HIDEMASK|HIDEFACE - ) - options["Visor Only"] = list( - "icon_state" = "merchant_sallet_visor", - "visor_flags" = HIDEEYES, - "mask_flags" = HIDEFACE - ) - options["Bevor Only"] = list( - "icon_state" = "merchant_sallet_bevor", - "visor_flags" = null, - "mask_flags" = HIDEMASK|HIDEFACE - ) - options["Neither Visor nor Bevor"] = list( - "icon_state" = "merchant_sallet", "visor_flags" = null, "mask_flags" = null ) + options["Soldier Down"] = list( + "icon_state" = "merchant_sallet_visor", + "visor_flags" = HIDEEYES, + "mask_flags" = HIDEMASK|HIDEFACE + ) + options["Technician Up"] = list( + "icon_state" = "merchant_sallet_bevor", + "visor_flags" = null, + "mask_flags" = null + ) + options["Technician Down"] = list( + "icon_state" = "merchant_sallet", + "visor_flags" = HIDEEYES, + "mask_flags" = HIDEMASK|HIDEFACE + ) - var/choice = input(user, "How would you like to adjust the sallet?", "Adjust Sallet") as null|anything in options + var/choice = input(user, "How would you like to adjust the helmet?", "Adjust Helmet") as null|anything in options if(choice && choice != state && !user.incapacitated() && Adjacent(user)) var/list/new_state = options[choice] icon_state = new_state["icon_state"] state = choice - to_chat(user, "You adjust the sallet.") + to_chat(user, "You adjust the helmet.") playsound(src.loc, "[toggle_sound]", 100, 0, 4) user.update_inv_head() return 1 From 6e846018cdc0a6a47c6a516dae91ea12f3c6c523 Mon Sep 17 00:00:00 2001 From: ryansmake Date: Fri, 4 May 2018 18:28:13 +0200 Subject: [PATCH 36/47] Performs inquisition on ATMs --- code/modules/economy/ATM.dm | 36 ++++-------------------------------- 1 file changed, 4 insertions(+), 32 deletions(-) diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 014f87ac310..83bcf61ec5d 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -122,6 +122,8 @@ log transactions if(issilicon(user)) to_chat(user, "Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.") return + if(!linked_db) + reconnect_database() ui_interact(user) /obj/machinery/atm/attack_ghost(mob/user) @@ -199,12 +201,9 @@ log transactions authenticated_account.security_level = new_sec_level if("attempt_auth") if(linked_db) - // check if they have low security enabled - scan_user(usr) - - if(!ticks_left_locked_down && held_card) + if(!ticks_left_locked_down) var/tried_account_num = text2num(href_list["account_num"]) - if(!tried_account_num) + if(!tried_account_num && held_card) tried_account_num = held_card.associated_account_number var/tried_pin = text2num(href_list["account_pin"]) @@ -323,30 +322,3 @@ log transactions //create the most effective combination of notes to make up the requested amount /obj/machinery/atm/proc/withdraw_arbitrary_sum(arbitrary_sum) new /obj/item/stack/spacecash(get_step(get_turf(src), turn(dir, 180)), arbitrary_sum) - -//stolen wholesale and then edited a bit from newscasters, which are awesome and by Agouri -/obj/machinery/atm/proc/scan_user(mob/living/carbon/human/H) - if(!authenticated_account && linked_db) - if(H.wear_id) - var/obj/item/card/id/I - if(istype(H.wear_id, /obj/item/card/id) ) - I = H.wear_id - else if(istype(H.wear_id, /obj/item/pda) ) - var/obj/item/pda/P = H.wear_id - I = P.id - if(I) - authenticated_account = attempt_account_access(I.associated_account_number) - if(authenticated_account) - to_chat(H, "[bicon(src)]Access granted. Welcome user '[authenticated_account.owner_name].'") - - //create a transaction log entry - var/datum/transaction/T = new() - T.target_name = authenticated_account.owner_name - T.purpose = "Remote terminal access" - T.source_terminal = machine_id - T.date = current_date_string - T.time = station_time_timestamp() - authenticated_account.transaction_log.Add(T) - - view_screen = NO_SCREEN - SSnanoui.update_uis(src) From afc28eaefb1b364705566ccbf7f22296c87b38f6 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 4 May 2018 15:30:26 -0400 Subject: [PATCH 37/47] Automatic changelog generation for PR #8979 [ci skip] --- html/changelogs/AutoChangeLog-pr-8979.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8979.yml diff --git a/html/changelogs/AutoChangeLog-pr-8979.yml b/html/changelogs/AutoChangeLog-pr-8979.yml new file mode 100644 index 00000000000..f3e7e44e1e0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8979.yml @@ -0,0 +1,5 @@ +author: "RyanSmake" +delete-after: True +changes: + - bugfix: "You will now log in to the proper account you input to the ATM instead of the one associated with you." + - bugfix: "Now ATMs will reconnect after a power outage." From 15384c7f3dea89821aa455fd86eab9efee437f03 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 4 May 2018 20:20:43 +0000 Subject: [PATCH 38/47] Automatic changelog compile, [ci skip] --- html/changelog.html | 7 +++++++ html/changelogs/.all_changelog.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-8979.yml | 5 ----- 3 files changed, 12 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-8979.yml diff --git a/html/changelog.html b/html/changelog.html index 0938ed45f8e..062a05bd975 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,13 @@ -->
        +

        04 May 2018

        +

        RyanSmake updated:

        +
          +
        • You will now log in to the proper account you input to the ATM instead of the one associated with you.
        • +
        • Now ATMs will reconnect after a power outage.
        • +
        +

        02 May 2018

        CrazyLemon and Fox McCloud updated:

          diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index a99a2c4b64c..cb60736309b 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6375,3 +6375,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2018-05-02: CrazyLemon and Fox McCloud: - bugfix: Fixes reagent smoke +2018-05-04: + RyanSmake: + - bugfix: You will now log in to the proper account you input to the ATM instead + of the one associated with you. + - bugfix: Now ATMs will reconnect after a power outage. diff --git a/html/changelogs/AutoChangeLog-pr-8979.yml b/html/changelogs/AutoChangeLog-pr-8979.yml deleted file mode 100644 index f3e7e44e1e0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-8979.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "RyanSmake" -delete-after: True -changes: - - bugfix: "You will now log in to the proper account you input to the ATM instead of the one associated with you." - - bugfix: "Now ATMs will reconnect after a power outage." From 917c4cb4d436570abafe0d79d1586816fe9fc537 Mon Sep 17 00:00:00 2001 From: Tayyyyyyy Date: Fri, 4 May 2018 15:47:22 -0500 Subject: [PATCH 39/47] Fix ERT cloning incorrectly --- code/game/response_team.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 9fdf3121b59..0f90f074b32 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -157,11 +157,11 @@ var/ert_request_answered = 0 head_organ.h_style = random_hair_style(M.gender, head_organ.species.name) head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name) - M.real_name = "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]" - M.name = M.real_name + M.rename_character(null, "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]") M.age = rand(23,35) M.regenerate_icons() M.update_body() + M.update_dna() //Creates mind stuff. M.mind = new @@ -280,8 +280,7 @@ var/ert_request_answered = 0 command_slots = 0 // Override name and age for the commander - M.real_name = "[pick("Lieutenant", "Captain", "Major")] [pick(last_names)]" - M.name = M.real_name + M.rename_character(null, "[pick("Lieutenant", "Captain", "Major")] [pick(last_names)]") M.age = rand(35,45) M.equipOutfit(command_outfit) From c98b0404fcaa6826b75be261923dffc0c2a175ac Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 4 May 2018 20:21:22 -0400 Subject: [PATCH 40/47] Automatic changelog generation for PR #8981 [ci skip] --- html/changelogs/AutoChangeLog-pr-8981.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8981.yml diff --git a/html/changelogs/AutoChangeLog-pr-8981.yml b/html/changelogs/AutoChangeLog-pr-8981.yml new file mode 100644 index 00000000000..e6e1f6d9c01 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8981.yml @@ -0,0 +1,4 @@ +author: "Tayyyyyyy" +delete-after: True +changes: + - bugfix: "ERT members will have their proper name and appearance when cloned" From 24aec30594ef0869156f88dce4b69958dabf51c4 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 5 May 2018 00:37:32 +0000 Subject: [PATCH 41/47] Automatic changelog compile, [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-8981.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-8981.yml diff --git a/html/changelog.html b/html/changelog.html index 062a05bd975..393f6feea1e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,12 @@ -->
          +

          05 May 2018

          +

          Tayyyyyyy updated:

          +
            +
          • ERT members will have their proper name and appearance when cloned
          • +
          +

          04 May 2018

          RyanSmake updated:

            diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index cb60736309b..c9ab10060ca 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6380,3 +6380,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: You will now log in to the proper account you input to the ATM instead of the one associated with you. - bugfix: Now ATMs will reconnect after a power outage. +2018-05-05: + Tayyyyyyy: + - bugfix: ERT members will have their proper name and appearance when cloned diff --git a/html/changelogs/AutoChangeLog-pr-8981.yml b/html/changelogs/AutoChangeLog-pr-8981.yml deleted file mode 100644 index e6e1f6d9c01..00000000000 --- a/html/changelogs/AutoChangeLog-pr-8981.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Tayyyyyyy" -delete-after: True -changes: - - bugfix: "ERT members will have their proper name and appearance when cloned" From 05e0901967950ba7fe814edf8b6b3c25e5d6e571 Mon Sep 17 00:00:00 2001 From: Kyep Date: Fri, 4 May 2018 18:36:56 -0700 Subject: [PATCH 42/47] removes anti-drop implants --- code/modules/admin/verbs/striketeam.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index 5578242fe7a..d3c9ae98511 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -179,9 +179,6 @@ var/global/sent_strike_team = 0 equip_to_slot_or_del(new /obj/item/gun/projectile/revolver/mateba(src), slot_belt) equip_to_slot_or_del(new /obj/item/gun/energy/pulse(src), slot_r_hand) - var/obj/item/organ/internal/cyberimp/brain/anti_drop/O = new /obj/item/organ/internal/cyberimp/brain/anti_drop() - O.insert(src) - var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(src) L.implant(src) From 3fa7b82a4decf40993bb680e77f4f63a1ce8d865 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 4 May 2018 22:03:55 -0400 Subject: [PATCH 43/47] Automatic changelog generation for PR #8488 [ci skip] --- html/changelogs/AutoChangeLog-pr-8488.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8488.yml diff --git a/html/changelogs/AutoChangeLog-pr-8488.yml b/html/changelogs/AutoChangeLog-pr-8488.yml new file mode 100644 index 00000000000..9735a4f0200 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8488.yml @@ -0,0 +1,5 @@ +author: "Kyep" +delete-after: True +changes: + - tweak: "DeathSquad is now better equipped, and prompts eligible ghosts with a \"Do you want to play as DeathSquad?\" when called." + - rscadd: "DeathSquad members (except team leaders) can now choose to spawn as either an organic DS member, or a DS borg." From 2c3f11f54c52fac4fdb51a333ffc69951dfb53a6 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 6 May 2018 01:13:45 +0000 Subject: [PATCH 44/47] Automatic changelog compile, [ci skip] --- html/changelog.html | 7 +++++++ html/changelogs/.all_changelog.yml | 6 ++++++ html/changelogs/AutoChangeLog-pr-8488.yml | 5 ----- 3 files changed, 13 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-8488.yml diff --git a/html/changelog.html b/html/changelog.html index 393f6feea1e..8bc5b5e0903 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,13 @@ -->
            +

            06 May 2018

            +

            Kyep updated:

            +
              +
            • DeathSquad is now better equipped, and prompts eligible ghosts with a "Do you want to play as DeathSquad?" when called.
            • +
            • DeathSquad members (except team leaders) can now choose to spawn as either an organic DS member, or a DS borg.
            • +
            +

            05 May 2018

            Tayyyyyyy updated:

              diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index c9ab10060ca..431ca238f15 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6383,3 +6383,9 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2018-05-05: Tayyyyyyy: - bugfix: ERT members will have their proper name and appearance when cloned +2018-05-06: + Kyep: + - tweak: DeathSquad is now better equipped, and prompts eligible ghosts with a "Do + you want to play as DeathSquad?" when called. + - rscadd: DeathSquad members (except team leaders) can now choose to spawn as either + an organic DS member, or a DS borg. diff --git a/html/changelogs/AutoChangeLog-pr-8488.yml b/html/changelogs/AutoChangeLog-pr-8488.yml deleted file mode 100644 index 9735a4f0200..00000000000 --- a/html/changelogs/AutoChangeLog-pr-8488.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - tweak: "DeathSquad is now better equipped, and prompts eligible ghosts with a \"Do you want to play as DeathSquad?\" when called." - - rscadd: "DeathSquad members (except team leaders) can now choose to spawn as either an organic DS member, or a DS borg." From 0a18ffde2067adb0ac331c5bd8e802aa331ad9d1 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sun, 6 May 2018 23:00:14 -0400 Subject: [PATCH 45/47] Automatic changelog generation for PR #8976 [ci skip] --- html/changelogs/AutoChangeLog-pr-8976.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-8976.yml diff --git a/html/changelogs/AutoChangeLog-pr-8976.yml b/html/changelogs/AutoChangeLog-pr-8976.yml new file mode 100644 index 00000000000..1f428300b18 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8976.yml @@ -0,0 +1,4 @@ +author: "qwertyquerty" +delete-after: True +changes: + - rscadd: "The window title is custom now!" From 41199045d0e588fac309c6668d9457f325c0a527 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 7 May 2018 03:55:59 +0000 Subject: [PATCH 46/47] Automatic changelog compile, [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-8976.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-8976.yml diff --git a/html/changelog.html b/html/changelog.html index 8bc5b5e0903..3857178b750 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,12 @@ -->
              +

              07 May 2018

              +

              qwertyquerty updated:

              +
                +
              • The window title is custom now!
              • +
              +

              06 May 2018

              Kyep updated:

                diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 431ca238f15..4af2bbd98ef 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6389,3 +6389,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. you want to play as DeathSquad?" when called. - rscadd: DeathSquad members (except team leaders) can now choose to spawn as either an organic DS member, or a DS borg. +2018-05-07: + qwertyquerty: + - rscadd: The window title is custom now! diff --git a/html/changelogs/AutoChangeLog-pr-8976.yml b/html/changelogs/AutoChangeLog-pr-8976.yml deleted file mode 100644 index 1f428300b18..00000000000 --- a/html/changelogs/AutoChangeLog-pr-8976.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "qwertyquerty" -delete-after: True -changes: - - rscadd: "The window title is custom now!" From 0aa1174c991d5675d859b371182787de9574b322 Mon Sep 17 00:00:00 2001 From: Kyep Date: Sun, 6 May 2018 21:48:09 -0700 Subject: [PATCH 47/47] ERT runtimes --- code/game/response_team.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 0f90f074b32..6120ae042bf 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -104,8 +104,12 @@ var/ert_request_answered = 0 if(index > emergencyresponseteamspawn.len) index = 1 + if(!M || !M.client) + continue var/client/C = M.client var/mob/living/new_commando = C.create_response_team(emergencyresponseteamspawn[index]) + if(!M || !new_commando) + continue new_commando.mind.key = M.key new_commando.key = M.key new_commando.update_icons()