From 49abaf72f4892e2a5ccc09a9563919665ee2a8b2 Mon Sep 17 00:00:00 2001 From: JJRcop Date: Fri, 22 Sep 2017 02:54:34 -0400 Subject: [PATCH 001/136] Suiciding with a gun blows your brain out --- code/modules/projectiles/guns/ballistic.dm | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index d65364c062..2f1c018400 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -144,6 +144,19 @@ if(user.is_holding(src)) process_fire(user, user, 0, zone_override = "head") user.visible_message("[user] blows [user.p_their()] brain[user.p_s()] out with [src]!") +<<<<<<< HEAD +======= + var/turf/target = get_ranged_target_turf(user, turn(user.dir, 180), BRAINS_BLOWN_THROW_RANGE) + B.Remove(user) + B.forceMove(T) + var/datum/dna/user_dna + if(iscarbon(user)) + var/mob/living/carbon/C = user + user_dna = C.dna + B.add_blood(user_dna) + var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, /proc/spawn_atom_to_turf, /obj/effect/gibspawner/generic, B, 1, FALSE, list(user_dna)) + B.throw_at(target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback=gibspawner) +>>>>>>> 69669be... Possibly fixes runtimes with gun suicide return(BRUTELOSS) else user.visible_message("[user] panics and starts choking to death!") From 67c3dc63e19bff13412ea25a5d3a91b62b4308d1 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sat, 23 Sep 2017 13:52:55 -0500 Subject: [PATCH 002/136] Update ballistic.dm --- code/modules/projectiles/guns/ballistic.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 2f1c018400..e607ec0571 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -144,8 +144,6 @@ if(user.is_holding(src)) process_fire(user, user, 0, zone_override = "head") user.visible_message("[user] blows [user.p_their()] brain[user.p_s()] out with [src]!") -<<<<<<< HEAD -======= var/turf/target = get_ranged_target_turf(user, turn(user.dir, 180), BRAINS_BLOWN_THROW_RANGE) B.Remove(user) B.forceMove(T) @@ -156,7 +154,6 @@ B.add_blood(user_dna) var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, /proc/spawn_atom_to_turf, /obj/effect/gibspawner/generic, B, 1, FALSE, list(user_dna)) B.throw_at(target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback=gibspawner) ->>>>>>> 69669be... Possibly fixes runtimes with gun suicide return(BRUTELOSS) else user.visible_message("[user] panics and starts choking to death!") From 4670aeb42b2ddcc63cff002dbb84cb2dd0a07f14 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 22 Sep 2017 13:57:48 -0400 Subject: [PATCH 003/136] Makes a flags var use NONE instead of 0 --- code/modules/clothing/ears/ears.dm | 51 +++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/ears/ears.dm b/code/modules/clothing/ears/ears.dm index 1ab0586af4..412aa0f940 100644 --- a/code/modules/clothing/ears/ears.dm +++ b/code/modules/clothing/ears/ears.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD //Ears: currently only used for headsets and earmuffs /obj/item/clothing/ears @@ -43,4 +44,52 @@ H.update_inv_ears() H.update_inv_neck() H.update_inv_head() - to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") \ No newline at end of file + to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") +======= + +//Ears: currently only used for headsets and earmuffs +/obj/item/clothing/ears + name = "ears" + w_class = WEIGHT_CLASS_TINY + throwforce = 0 + slot_flags = SLOT_EARS + resistance_flags = NONE + +/obj/item/clothing/ears/earmuffs + name = "earmuffs" + desc = "Protects your hearing from loud noises, and quiet ones as well." + icon_state = "earmuffs" + item_state = "earmuffs" + strip_delay = 15 + equip_delay_other = 25 + resistance_flags = FLAMMABLE + flags_2 = BANG_PROTECT_2|HEALS_EARS_2 + +/obj/item/clothing/ears/headphones + name = "headphones" + desc = "Unce unce unce unce. Boop!" + icon = 'icons/obj/clothing/accessories.dmi' + icon_state = "headphones" + item_state = "headphones" + slot_flags = SLOT_EARS | SLOT_HEAD | SLOT_NECK //Fluff item, put it whereever you want! + actions_types = list(/datum/action/item_action/toggle_headphones) + var/headphones_on = FALSE + +/obj/item/clothing/ears/headphones/Initialize() + . = ..() + update_icon() + +/obj/item/clothing/ears/headphones/update_icon() + icon_state = "[initial(icon_state)]_[headphones_on? "on" : "off"]" + item_state = "[initial(item_state)]_[headphones_on? "on" : "off"]" + +/obj/item/clothing/ears/headphones/proc/toggle(owner) + headphones_on = !headphones_on + update_icon() + var/mob/living/carbon/human/H = owner + if(istype(H)) + H.update_inv_ears() + H.update_inv_neck() + H.update_inv_head() + to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") +>>>>>>> 5fbc6c2... Makes a flags var use NONE instead of 0 From 34e186dadb2676b425ee1c917bde310c0c40eb12 Mon Sep 17 00:00:00 2001 From: pubby Date: Sun, 24 Sep 2017 18:00:08 -0500 Subject: [PATCH 004/136] Datum abductors refactor --- .../LavaRuins/lavaland_surface_ufo_crash.dmm | 4 +- _maps/map_files/generic/CentCom.dmm | 44 ++-- code/__DEFINES/antagonists.dm | 3 + code/datums/antagonists/datum_abductor.dm | 60 +++++ code/datums/mind.dm | 12 +- .../miniantags/abduction/abduction.dm | 235 ++++++------------ .../miniantags/abduction/abduction_outfits.dm | 14 +- .../miniantags/abduction/machinery/camera.dm | 2 +- .../miniantags/abduction/machinery/console.dm | 15 +- .../items/implants/implant_abductor.dm | 22 +- code/modules/events/abductor.dm | 37 +-- .../carbon/human/species_types/abductors.dm | 6 +- code/modules/surgery/organs/tongue.dm | 7 +- tgstation.dme | 1 + 14 files changed, 198 insertions(+), 264 deletions(-) create mode 100644 code/datums/antagonists/datum_abductor.dm diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm index 588000378b..14ef2b80cd 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm @@ -48,7 +48,7 @@ /area/ruin/unpowered) "j" = ( /obj/machinery/abductor/experiment{ - team = 100 + team_number = 100 }, /turf/open/floor/plating/abductor{ initial_gas_mix = "o2=16;n2=23;TEMP=300" @@ -61,7 +61,7 @@ /area/ruin/unpowered) "l" = ( /obj/machinery/abductor/pad{ - team = 100 + team_number = 100 }, /turf/open/floor/plating/abductor{ initial_gas_mix = "o2=16;n2=23;TEMP=300" diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index f0476df53d..05f0897465 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -12318,19 +12318,19 @@ /area/abductor_ship) "Gh" = ( /obj/machinery/abductor/experiment{ - team = 1 + team_number = 1 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Gi" = ( /obj/machinery/abductor/console{ - team = 1 + team_number = 1 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Gj" = ( /obj/machinery/abductor/pad{ - team = 1 + team_number = 1 }, /turf/open/floor/plating/abductor, /area/abductor_ship) @@ -12346,19 +12346,19 @@ /area/abductor_ship) "Gm" = ( /obj/machinery/abductor/experiment{ - team = 4 + team_number = 4 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Gn" = ( /obj/machinery/abductor/console{ - team = 4 + team_number = 4 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Go" = ( /obj/machinery/abductor/pad{ - team = 4 + team_number = 4 }, /turf/open/floor/plating/abductor, /area/abductor_ship) @@ -12400,7 +12400,7 @@ /area/abductor_ship) "Gw" = ( /obj/machinery/computer/camera_advanced/abductor{ - team = 1 + team_number = 1 }, /turf/open/floor/plating/abductor, /area/abductor_ship) @@ -12418,7 +12418,7 @@ /area/abductor_ship) "GA" = ( /obj/machinery/computer/camera_advanced/abductor{ - team = 4 + team_number = 4 }, /turf/open/floor/plating/abductor, /area/abductor_ship) @@ -12479,13 +12479,13 @@ /area/abductor_ship) "GM" = ( /obj/effect/landmark/abductor/scientist{ - team = 4 + team_number = 4 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "GN" = ( /obj/effect/landmark/abductor/agent{ - team = 4 + team_number = 4 }, /turf/open/floor/plating/abductor, /area/abductor_ship) @@ -12629,49 +12629,49 @@ /area/space) "Hn" = ( /obj/machinery/abductor/experiment{ - team = 2 + team_number = 2 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Ho" = ( /obj/machinery/abductor/console{ - team = 2 + team_number = 2 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Hp" = ( /obj/machinery/abductor/pad{ - team = 2 + team_number = 2 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Hq" = ( /obj/machinery/abductor/experiment{ - team = 3 + team_number = 3 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Hr" = ( /obj/machinery/abductor/console{ - team = 3 + team_number = 3 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Hs" = ( /obj/machinery/abductor/pad{ - team = 3 + team_number = 3 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Ht" = ( /obj/machinery/computer/camera_advanced/abductor{ - team = 2 + team_number = 2 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Hu" = ( /obj/machinery/computer/camera_advanced/abductor{ - team = 3 + team_number = 3 }, /turf/open/floor/plating/abductor, /area/abductor_ship) @@ -12693,25 +12693,25 @@ /area/centcom/evac) "Hy" = ( /obj/effect/landmark/abductor/scientist{ - team = 2 + team_number = 2 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "Hz" = ( /obj/effect/landmark/abductor/agent{ - team = 2 + team_number = 2 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "HA" = ( /obj/effect/landmark/abductor/scientist{ - team = 3 + team_number = 3 }, /turf/open/floor/plating/abductor, /area/abductor_ship) "HB" = ( /obj/effect/landmark/abductor/agent{ - team = 3 + team_number = 3 }, /turf/open/floor/plating/abductor, /area/abductor_ship) diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index e6d0ff4732..8ac155f20b 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -19,3 +19,6 @@ #define ANTAG_DATUM_IAA_AI_CUSTOM /datum/antagonist/traitor/AI/internal_affairs/custom #define ANTAG_DATUM_IAA_AI /datum/antagonist/traitor/AI/internal_affairs #define ANTAG_DATUM_BROTHER /datum/antagonist/brother +#define ANTAG_DATUM_ABDUCTOR /datum/antagonist/abductor +#define ANTAG_DATUM_ABDUCTOR_SCIENTIST /datum/antagonist/abductor/scientist +#define ANTAG_DATUM_ABDUCTOR_AGENT /datum/antagonist/abductor/agent diff --git a/code/datums/antagonists/datum_abductor.dm b/code/datums/antagonists/datum_abductor.dm new file mode 100644 index 0000000000..6d08d61b8a --- /dev/null +++ b/code/datums/antagonists/datum_abductor.dm @@ -0,0 +1,60 @@ +/datum/antagonist/abductor + name = "Abductor" + var/datum/objective_team/abductor_team/team + var/sub_role + var/outfit + var/landmark_type + var/greet_text + +/datum/antagonist/abductor/agent + sub_role = "Agent" + outfit = /datum/outfit/abductor/agent + landmark_type = /obj/effect/landmark/abductor/agent + greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve." + +/datum/antagonist/abductor/scientist + sub_role = "Scientist" + outfit = /datum/outfit/abductor/scientist + landmark_type = /obj/effect/landmark/abductor/scientist + greet_text = "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve." + +/datum/antagonist/abductor/New(datum/mind/new_owner, datum/objective_team/abductor_team/T) + team = T + return ..() + +/datum/antagonist/abductor/on_gain() + SSticker.mode.abductors += owner + owner.special_role = "[name] [sub_role]" + owner.objectives += team.objectives + finalize_abductor() + return ..() + +/datum/antagonist/abductor/on_removal() + SSticker.mode.abductors -= owner + team.members -= owner + owner.objectives -= team.objectives + if(owner.current) + to_chat(owner.current,"You are no longer the [owner.special_role]!") + owner.special_role = null + return ..() + +/datum/antagonist/abductor/greet() + to_chat(owner.current, "You are the [owner.special_role]!") + to_chat(owner.current, "With the help of your teammate, kidnap and experiment on station crew members!") + to_chat(owner.current, "[greet_text]") + owner.announce_objectives() + +/datum/antagonist/abductor/proc/finalize_abductor() + //Equip + var/mob/living/carbon/human/H = owner.current + H.set_species(/datum/species/abductor) + H.real_name = "[team.name] [sub_role]" + H.equipOutfit(outfit) + + //Teleport to ship + for(var/obj/effect/landmark/abductor/LM in GLOB.landmarks_list) + if(istype(LM, landmark_type) && LM.team_number == team.team_number) + H.forceMove(LM.loc) + break + + SSticker.mode.update_abductor_icons_added(owner) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 79bacd3883..76c0b1ba0d 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -590,8 +590,6 @@ if(src in SSticker.mode.abductors) text += "Abductor | human" text += " | undress | equip" - else - text += "abductor | human" if(current && current.client && (ROLE_ABDUCTOR in current.client.prefs.be_special)) text += " | Enabled in Prefs" @@ -1244,13 +1242,6 @@ if("clear") to_chat(usr, "Not implemented yet. Sorry!") //SSticker.mode.update_abductor_icons_removed(src) - if("abductor") - if(!ishuman(current)) - to_chat(usr, "This only works on humans!") - return - make_Abductor() - log_admin("[key_name(usr)] turned [current] into abductor.") - SSticker.mode.update_abductor_icons_added(src) if("equip") if(!ishuman(current)) to_chat(usr, "This only works on humans!") @@ -1497,6 +1488,7 @@ var/fail = 0 fail |= !SSticker.mode.equip_revolutionary(current) +<<<<<<< HEAD /datum/mind/proc/make_Abductor() var/role = alert("Abductor Role ?","Role","Agent","Scientist") var/team = input("Abductor Team ?","Team ?") in list(1,2,3,4) @@ -1542,6 +1534,8 @@ L = scientist_landmarks[team] H.forceMove(L.loc) +======= +>>>>>>> 18f329a... Datum abductors refactor (#30893) /datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S) spell_list += S S.action.Grant(current) diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 7ff5a9742d..ed5c2e9d76 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -1,5 +1,17 @@ +/datum/objective_team/abductor_team + member_name = "abductor" + var/list/objectives = list() + var/team_number + +/datum/objective_team/abductor_team/is_solo() + return FALSE + +/datum/objective_team/abductor_team/proc/add_objective(datum/objective/O) + O.team = src + O.update_explanation_text() + objectives += O + /datum/game_mode - var/abductor_teams = 0 var/list/datum/mind/abductors = list() var/list/datum/mind/abductees = list() @@ -12,12 +24,8 @@ required_players = 15 maximum_players = 50 var/max_teams = 4 - abductor_teams = 1 - var/list/datum/mind/scientists = list() - var/list/datum/mind/agents = list() - var/list/datum/objective/team_objectives = list() - var/list/team_names = list() - var/finished = 0 + var/list/datum/objective_team/abductor_team/abductor_teams = list() + var/finished = FALSE /datum/game_mode/abduction/announce() to_chat(world, "The current game mode is - Abduction!") @@ -26,163 +34,78 @@ to_chat(world, "Crew - don't get abducted and stop the abductors.") /datum/game_mode/abduction/pre_setup() - abductor_teams = max(1, min(max_teams,round(num_players()/config.abductor_scaling_coeff))) - var/possible_teams = max(1,round(antag_candidates.len / 2)) - abductor_teams = min(abductor_teams,possible_teams) + var/num_teams = max(1, min(max_teams, round(num_players() / config.abductor_scaling_coeff))) + var/possible_teams = max(1, round(antag_candidates.len / 2)) + num_teams = min(num_teams, possible_teams) - abductors.len = 2*abductor_teams - scientists.len = abductor_teams - agents.len = abductor_teams - team_objectives.len = abductor_teams - team_names.len = abductor_teams + for(var/i = 1 to num_teams) + if(!make_abductor_team()) + return FALSE + return TRUE - for(var/i=1,i<=abductor_teams,i++) - if(!make_abductor_team(i)) - return 0 +/datum/game_mode/abduction/proc/make_abductor_team(datum/mind/agent, datum/mind/scientist) + var/team_number = abductor_teams.len+1 - return 1 + var/datum/objective_team/abductor_team/team = new + team.team_number = team_number + team.name = "Mothership [pick(GLOB.possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names + team.add_objective(new/datum/objective/experiment) -/datum/game_mode/abduction/proc/make_abductor_team(team_number,preset_agent=null,preset_scientist=null) - //Team Name - team_names[team_number] = "Mothership [pick(GLOB.possible_changeling_IDs)]" //TODO Ensure unique and actual alieny names - //Team Objective - var/datum/objective/experiment/team_objective = new - team_objective.team_number = team_number - team_objectives[team_number] = team_objective - //Team Members + if(antag_candidates.len < (!agent + !scientist)) + return - if(!preset_agent || !preset_scientist) - if(antag_candidates.len <=2) - return 0 - - var/datum/mind/scientist - var/datum/mind/agent - - if(!preset_scientist) + if(!scientist) scientist = pick(antag_candidates) - antag_candidates -= scientist - else - scientist = preset_scientist + antag_candidates -= scientist + team.members |= scientist + scientist.assigned_role = "Abductor Scientist" + log_game("[scientist.key] (ckey) has been selected as [team.name] abductor scientist.") - if(!preset_agent) + if(!agent) agent = pick(antag_candidates) - antag_candidates -= agent - else - agent = preset_agent + antag_candidates -= agent + team.members |= agent + agent.assigned_role = "Abductor Agent" + log_game("[agent.key] (ckey) has been selected as [team.name] abductor agent.") - - scientist.assigned_role = "abductor scientist" - scientist.special_role = "abductor scientist" - log_game("[scientist.key] (ckey) has been selected as an abductor team [team_number] scientist.") - - agent.assigned_role = "abductor agent" - agent.special_role = "abductor agent" - log_game("[agent.key] (ckey) has been selected as an abductor team [team_number] agent.") - - abductors |= agent - abductors |= scientist - scientists[team_number] = scientist - agents[team_number] = agent - return 1 + abductor_teams += team + return team /datum/game_mode/abduction/post_setup() - for(var/team_number=1,team_number<=abductor_teams,team_number++) - post_setup_team(team_number) + for(var/datum/objective_team/abductor_team/team in abductor_teams) + post_setup_team(team) return ..() //Used for create antag buttons -/datum/game_mode/abduction/proc/post_setup_team(team_number) - var/list/obj/effect/landmark/abductor/agent_landmarks = list() - var/list/obj/effect/landmark/abductor/scientist_landmarks = list() - agent_landmarks.len = max_teams - scientist_landmarks.len = max_teams - for(var/obj/effect/landmark/abductor/A in GLOB.landmarks_list) - if(istype(A, /obj/effect/landmark/abductor/agent)) - agent_landmarks[text2num(A.team)] = A - else if(istype(A, /obj/effect/landmark/abductor/scientist)) - scientist_landmarks[text2num(A.team)] = A - - var/team_name = team_names[team_number] - - var/datum/mind/agent - var/obj/effect/landmark/L - var/datum/mind/scientist - var/mob/living/carbon/human/H - var/datum/species/abductor/S - - agent = agents[team_number] - H = agent.current - L = agent_landmarks[team_number] - H.forceMove(L.loc) - H.set_species(/datum/species/abductor) - S = H.dna.species - S.team = team_number - H.real_name = team_name + " Agent" - H.equipOutfit(/datum/outfit/abductor/agent) - greet_agent(agent,team_number) - - - scientist = scientists[team_number] - H = scientist.current - L = scientist_landmarks[team_number] - H.forceMove(L.loc) - H.set_species(/datum/species/abductor) - S = H.dna.species - S.scientist = TRUE - S.team = team_number - H.real_name = team_name + " Scientist" - H.equipOutfit(/datum/outfit/abductor/scientist) - greet_scientist(scientist,team_number) - - - -/datum/game_mode/abduction/proc/greet_agent(datum/mind/abductor,team_number) - abductor.objectives += team_objectives[team_number] - var/team_name = team_names[team_number] - - to_chat(abductor.current, "You are an agent of [team_name]!") - to_chat(abductor.current, "With the help of your teammate, kidnap and experiment on station crew members!") - to_chat(abductor.current, "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve.") - - abductor.announce_objectives() - -/datum/game_mode/abduction/proc/greet_scientist(datum/mind/abductor,team_number) - abductor.objectives += team_objectives[team_number] - var/team_name = team_names[team_number] - - to_chat(abductor.current, "You are a scientist of [team_name]!") - to_chat(abductor.current, "With the help of your teammate, kidnap and experiment on station crew members!") - to_chat(abductor.current, "Use your tool and ship consoles to support the agent and retrieve human specimens.") - - abductor.announce_objectives() - -/datum/game_mode/abduction/proc/get_team_console(team_number) - for(var/obj/machinery/abductor/console/C in GLOB.machines) - if(C.team == team_number) - return C +/datum/game_mode/abduction/proc/post_setup_team(datum/objective_team/abductor_team/team) + for(var/datum/mind/M in team.members) + if(M.assigned_role == "Abductor Scientist") + M.add_antag_datum(ANTAG_DATUM_ABDUCTOR_SCIENTIST, team) + else + M.add_antag_datum(ANTAG_DATUM_ABDUCTOR_AGENT, team) /datum/game_mode/abduction/check_finished() if(!finished) - for(var/team_number=1,team_number<=abductor_teams,team_number++) - var/obj/machinery/abductor/console/con = get_team_console(team_number) - var/datum/objective/objective = team_objectives[team_number] - if (con.experiment.points >= objective.target_amount) - SSshuttle.emergency.request(null, set_coefficient = 0.5) - finished = 1 - return ..() + for(var/datum/objective_team/abductor_team/team in abductor_teams) + for(var/datum/objective/O in team.objectives) + if(O.check_completion()) + SSshuttle.emergency.request(null, set_coefficient = 0.5) + finished = TRUE + return ..() return ..() /datum/game_mode/abduction/declare_completion() - for(var/team_number=1,team_number<=abductor_teams,team_number++) - var/obj/machinery/abductor/console/console = get_team_console(team_number) - var/datum/objective/objective = team_objectives[team_number] - var/team_name = team_names[team_number] - if(console.experiment.points >= objective.target_amount) - to_chat(world, "[team_name] team fulfilled its mission!") + for(var/datum/objective_team/abductor_team/team in abductor_teams) + var/won = TRUE + for(var/datum/objective/O in team.objectives) + if(!O.check_completion()) + won = FALSE + if(won) + to_chat(world, "[team.name] team fulfilled its mission!") else - to_chat(world, "[team_name] team failed its mission.") + to_chat(world, "[team.name] team failed its mission.") ..() - return 1 + return TRUE /datum/game_mode/proc/auto_declare_completion_abduction() var/text = "" @@ -200,40 +123,28 @@ text += "
" to_chat(world, text) -//Landmarks -// TODO: Split into separate landmarks for prettier ships +// LANDMARKS /obj/effect/landmark/abductor - var/team = 1 + var/team_number = 1 /obj/effect/landmark/abductor/agent /obj/effect/landmark/abductor/scientist - // OBJECTIVES /datum/objective/experiment target_amount = 6 - var/team_number /datum/objective/experiment/New() explanation_text = "Experiment on [target_amount] humans." /datum/objective/experiment/check_completion() - var/ab_team = team_number - if(owner) - if(!owner.current || !ishuman(owner.current)) - return 0 - var/mob/living/carbon/human/H = owner.current - if(H.dna.species.id != "abductor") - return 0 - var/datum/species/abductor/S = H.dna.species - ab_team = S.team for(var/obj/machinery/abductor/experiment/E in GLOB.machines) - if(E.team == ab_team) - if(E.points >= target_amount) - return 1 - else - return 0 - return 0 + if(!istype(team, /datum/objective_team/abductor_team)) + return FALSE + var/datum/objective_team/abductor_team/T = team + if(E.team_number == T.team_number) + return E.points >= target_amount + return FALSE /datum/game_mode/proc/update_abductor_icons_added(datum/mind/alien_mind) var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_ABDUCTOR] diff --git a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm index aa97d1e2d8..b24bef0433 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm @@ -5,20 +5,14 @@ back = /obj/item/storage/backpack ears = /obj/item/device/radio/headset/abductor -/datum/outfit/abductor/proc/get_team_console(team_number) - for(var/obj/machinery/abductor/console/C in GLOB.machines) - if(C.team == team_number) - return C - /datum/outfit/abductor/proc/link_to_console(mob/living/carbon/human/H, team_number) - if(!team_number && isabductor(H)) - var/datum/species/abductor/S = H.dna.species - team_number = S.team - + var/datum/antagonist/abductor/A = H.mind.has_antag_datum(ANTAG_DATUM_ABDUCTOR) + if(!team_number && A) + team_number = A.team.team_number if(!team_number) team_number = 1 - var/obj/machinery/abductor/console/console = get_team_console(team_number) + var/obj/machinery/abductor/console/console = get_abductor_console(team_number) if(console) var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H if(V) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm index 97893d6d2e..eb4e4f8211 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm @@ -1,6 +1,6 @@ /obj/machinery/computer/camera_advanced/abductor name = "Human Observation Console" - var/team = 0 + var/team_number = 0 networks = list("SS13","Abductor") var/datum/action/innate/teleport_in/tele_in_action = new var/datum/action/innate/teleport_out/tele_out_action = new diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm index f3deebc6b7..d44ff57c96 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm @@ -1,8 +1,13 @@ +/proc/get_abductor_console(team_number) + for(var/obj/machinery/abductor/console/C in GLOB.machines) + if(C.team_number == team_number) + return C + //Common /obj/machinery/abductor resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - var/team = 0 + var/team_number = 0 //Console @@ -139,21 +144,21 @@ return INITIALIZE_HINT_LATELOAD /obj/machinery/abductor/console/LateInitialize() - if(!team) + if(!team_number) return for(var/obj/machinery/abductor/pad/p in GLOB.machines) - if(p.team == team) + if(p.team_number == team_number) pad = p break for(var/obj/machinery/abductor/experiment/e in GLOB.machines) - if(e.team == team) + if(e.team_number == team_number) experiment = e e.console = src for(var/obj/machinery/computer/camera_advanced/abductor/c in GLOB.machines) - if(c.team == team) + if(c.team_number == team_number) camera = c c.console = src diff --git a/code/game/objects/items/implants/implant_abductor.dm b/code/game/objects/items/implants/implant_abductor.dm index 74642edd66..710e2d738e 100644 --- a/code/game/objects/items/implants/implant_abductor.dm +++ b/code/game/objects/items/implants/implant_abductor.dm @@ -26,21 +26,15 @@ if(..()) var/obj/machinery/abductor/console/console if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(H.dna.species.id == "abductor") - var/datum/species/abductor/S = H.dna.species - console = get_team_console(S.team) + var/datum/antagonist/abductor/A = target.mind.has_antag_datum(ANTAG_DATUM_ABDUCTOR) + if(A) + console = get_abductor_console(A.team.team_number) home = console.pad if(!home) - console = get_team_console(pick(1, 2, 3, 4)) + var/list/consoles = list() + for(var/obj/machinery/abductor/console/C in GLOB.machines) + consoles += C + console = pick(consoles) home = console.pad - return 1 - -/obj/item/implant/abductor/proc/get_team_console(var/team) - var/obj/machinery/abductor/console/console - for(var/obj/machinery/abductor/console/c in GLOB.machines) - if(c.team == team) - console = c - break - return console + return TRUE diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm index bbc73dca66..6fee1e5c1a 100755 --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -3,9 +3,7 @@ typepath = /datum/round_event/ghost_role/abductor weight = 10 max_occurrences = 1 - min_players = 20 - gamemode_blacklist = list("nuclear","wizard","revolution","abduction") /datum/round_event/ghost_role/abductor @@ -17,40 +15,17 @@ if(candidates.len < 2) return NOT_ENOUGH_PLAYERS - //Oh god why we can't have static functions - // I feel your pain, bro - var/number = SSticker.mode.abductor_teams + 1 - var/datum/game_mode/abduction/temp + var/datum/game_mode/abduction/GM if(SSticker.mode.config_tag == "abduction") - temp = SSticker.mode + GM = SSticker.mode else - temp = new + GM = new - var/agent_mind = pick_n_take(candidates) - var/scientist_mind = pick_n_take(candidates) + var/mob/living/carbon/human/agent = makeBody(pick_n_take(candidates)) + var/mob/living/carbon/human/scientist = makeBody(pick_n_take(candidates)) - var/mob/living/carbon/human/agent = makeBody(agent_mind) - var/mob/living/carbon/human/scientist = makeBody(scientist_mind) - - agent_mind = agent.mind - scientist_mind = scientist.mind - - temp.scientists.len = number - temp.agents.len = number - temp.abductors.len = 2*number - temp.team_objectives.len = number - temp.team_names.len = number - temp.scientists[number] = scientist_mind - temp.agents[number] = agent_mind - temp.abductors |= list(agent_mind,scientist_mind) - temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind) - temp.post_setup_team(number) - - SSticker.mode.abductor_teams++ - - if(SSticker.mode.config_tag != "abduction") - SSticker.mode.abductors |= temp.abductors + GM.post_setup_team(GM.make_abductor_team(agent.mind, scientist.mind)) spawned_mobs += list(agent, scientist) return SUCCESSFUL_SPAWN diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 80d64b29d4..160b0b73a1 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -2,12 +2,10 @@ name = "Abductor" id = "abductor" say_mod = "gibbers" - sexes = 0 + sexes = FALSE species_traits = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS,NOHUNGER) mutanttongue = /obj/item/organ/tongue/abductor - var/scientist = 0 // vars to not pollute spieces list with castes - var/team = 1 + var/scientist = FALSE // vars to not pollute spieces list with castes /datum/species/abductor/copy_properties_from(datum/species/abductor/old_species) scientist = old_species.scientist - team = old_species.team diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index b69c1f4c5c..5e67e73a8a 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -85,10 +85,9 @@ var/obj/item/organ/tongue/T = H.getorganslot("tongue") if(!T || T.type != type) continue - else if(H.dna && H.dna.species.id == "abductor" && user.dna && user.dna.species.id == "abductor") - var/datum/species/abductor/Ayy = user.dna.species - var/datum/species/abductor/Byy = H.dna.species - if(Ayy.team != Byy.team) + if(H.dna && H.dna.species.id == "abductor" && user.dna && user.dna.species.id == "abductor") + var/datum/antagonist/abductor/A = user.mind.has_antag_datum(ANTAG_DATUM_ABDUCTOR) + if(!A || !(H.mind in A.team.members)) continue to_chat(H, rendered) for(var/mob/M in GLOB.dead_mob_list) diff --git a/tgstation.dme b/tgstation.dme index eb1bfd6c11..158eb3e6b8 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -276,6 +276,7 @@ #include "code\datums\spawners_menu.dm" #include "code\datums\verbs.dm" #include "code\datums\antagonists\antag_datum.dm" +#include "code\datums\antagonists\datum_abductor.dm" #include "code\datums\antagonists\datum_brother.dm" #include "code\datums\antagonists\datum_clockcult.dm" #include "code\datums\antagonists\datum_cult.dm" From 169aa85d9cc5c2384331ebb173350f4e24b9bba1 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Sun, 24 Sep 2017 19:58:58 -0400 Subject: [PATCH 005/136] DisplayTimeText mk2 --- code/__HELPERS/files.dm | 2 +- code/__HELPERS/game.dm | 2 +- code/__HELPERS/maths.dm | 5 + code/__HELPERS/time.dm | 151 ++++++++++++++++++ code/controllers/subsystem/air.dm | 2 +- code/controllers/subsystem/server_maint.dm | 2 +- code/controllers/subsystem/shuttle.dm | 2 +- code/controllers/subsystem/ticker.dm | 2 +- code/controllers/subsystem/vote.dm | 4 +- code/game/gamemodes/blob/overmind.dm | 2 +- code/game/gamemodes/blob/powers.dm | 2 +- .../clock_effects/spatial_gateway.dm | 2 +- .../clock_cult/clock_items/clockwork_slab.dm | 40 +---- .../clock_structures/tinkerers_cache.dm | 2 +- code/game/gamemodes/cult/cult_comms.dm | 6 +- code/game/gamemodes/cult/cult_structures.dm | 15 +- .../abduction/machinery/experiment.dm | 6 +- .../gamemodes/nuclear/nuclear_challenge.dm | 2 +- code/game/machinery/ai_slipper.dm | 2 +- code/game/machinery/computer/dna_console.dm | 2 +- code/game/machinery/computer/pod.dm | 148 ++++++++++++++++- code/game/machinery/dance_machine.dm | 4 +- code/game/machinery/dna_scanner.dm | 6 +- code/game/machinery/gulag_teleporter.dm | 6 +- code/game/machinery/quantum_pad.dm | 2 +- code/game/machinery/suit_storage_unit.dm | 6 +- code/game/objects/effects/spiders.dm | 6 +- code/game/objects/items/charter.dm | 2 +- code/game/objects/items/devices/scanners.dm | 2 +- .../objects/items/devices/traitordevices.dm | 3 +- .../objects/items/implants/implantchair.dm | 6 +- .../structures/crates_lockers/closets.dm | 6 +- .../crates_lockers/crates/critter.dm | 40 +++++ code/game/objects/structures/morgue.dm | 6 +- code/modules/admin/player_panel.dm | 2 +- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 2 +- code/modules/admin/verbs/adminhelp.dm | 4 +- code/modules/admin/verbs/diagnostics.dm | 4 +- .../components/unary_devices/cryo.dm | 6 +- code/modules/awaymissions/capture_the_flag.dm | 2 +- code/modules/awaymissions/gateway.dm | 2 +- code/modules/error_handler/error_handler.dm | 2 +- .../modules/mob/dead/new_player/new_player.dm | 7 +- code/modules/mob/living/carbon/carbon.dm | 3 +- code/modules/mob/living/carbon/human/human.dm | 2 +- code/modules/mob/living/silicon/ai/say.dm | 2 +- .../living/simple_animal/guardian/guardian.dm | 2 +- .../simple_animal/guardian/types/assassin.dm | 4 +- .../simple_animal/guardian/types/explosive.dm | 2 +- .../simple_animal/guardian/types/support.dm | 2 +- code/modules/shuttle/syndicate.dm | 2 +- code/modules/stock_market/computer.dm | 2 +- code/modules/surgery/organs/augments_chest.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 4 +- 54 files changed, 428 insertions(+), 126 deletions(-) diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index 5001a3541e..f515668dfb 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -43,7 +43,7 @@ /client/proc/file_spam_check() var/time_to_wait = GLOB.fileaccess_timer - world.time if(time_to_wait > 0) - to_chat(src, "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.") + to_chat(src, "Error: file_spam_check(): Spam. Please wait [DisplayTimeText(time_to_wait)].") return 1 GLOB.fileaccess_timer = world.time + FTPDELAY return 0 diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 5bcc66eeda..c040e264e6 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -421,7 +421,7 @@ SEND_SOUND(M, 'sound/misc/notice2.ogg') //Alerting them to their consideration if(flashwindow) window_flash(M.client) - switch(ignore_category ? askuser(M,Question,"Please answer in [poll_time/10] seconds!","Yes","No","Never for this round", StealFocus=0, Timeout=poll_time) : askuser(M,Question,"Please answer in [poll_time/10] seconds!","Yes","No", StealFocus=0, Timeout=poll_time)) + switch(ignore_category ? askuser(M,Question,"Please answer in [DisplayTimeText(poll_time)]!","Yes","No","Never for this round", StealFocus=0, Timeout=poll_time) : askuser(M,Question,"Please answer in [DisplayTimeText(poll_time)]!","Yes","No", StealFocus=0, Timeout=poll_time)) if(1) to_chat(M, "Choice registered: Yes.") if(time_passed + poll_time <= world.time) diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 8374b305ad..61a6866fe2 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -219,3 +219,8 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, new_x = Clamp(new_x, 0, world.maxx) new_y = Clamp(new_y, 0, world.maxy) return locate(new_x, new_y, starting.z) + +/proc/round_down(num) + if(round(num) != num) + return round(num--) + else return num diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 546935e697..630d87a82a 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD //Returns the world time in english /proc/worldtime2text() return gameTimestamp("hh:mm:ss", world.time) @@ -50,3 +51,153 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) return 5 else return 1 +======= +//Returns the world time in english +/proc/worldtime2text() + return gameTimestamp("hh:mm:ss", world.time) + +/proc/time_stamp(format = "hh:mm:ss", show_ds) + var/time_string = time2text(world.timeofday, format) + return show_ds ? "[time_string]:[world.timeofday % 10]" : time_string + +/proc/gameTimestamp(format = "hh:mm:ss", wtime=null) + if(!wtime) + wtime = world.time + return time2text(wtime - GLOB.timezoneOffset + SSticker.gametime_offset - SSticker.round_start_time, format) + +/* Returns 1 if it is the selected month and day */ +/proc/isDay(month, day) + if(isnum(month) && isnum(day)) + var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month + var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day + if(month == MM && day == DD) + return 1 + + // Uncomment this out when debugging! + //else + //return 1 + +//returns timestamp in a sql and ISO 8601 friendly format +/proc/SQLtime(timevar) + if(!timevar) + timevar = world.realtime + return time2text(timevar, "YYYY-MM-DD hh:mm:ss") + + +GLOBAL_VAR_INIT(midnight_rollovers, 0) +GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) +/proc/update_midnight_rollover() + if (world.timeofday < GLOB.rollovercheck_last_timeofday) //TIME IS GOING BACKWARDS! + return GLOB.midnight_rollovers++ + return GLOB.midnight_rollovers + +/proc/weekdayofthemonth() + var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day + switch(DD) + if(8 to 13) + return 2 + if(14 to 20) + return 3 + if(21 to 27) + return 4 + if(28 to INFINITY) + return 5 + else + return 1 + +//Takes a value of time in deciseconds. +//Returns a text value of that number in hours, minutes, or seconds. +/proc/DisplayTimeText(time_value) + var/second = time_value*0.1 + var/second_adjusted = null + var/second_rounded = FALSE + var/minute = null + var/hour = null + var/day = null + + if(!second) + return "0 seconds" + if(second >= 60) + minute = round_down(second/60) + second = round(second - (minute*60), 0.1) + second_rounded = TRUE + if(second) //check if we still have seconds remaining to format, or if everything went into minute. + second_adjusted = round(second) //used to prevent '1 seconds' being shown + if(day || hour || minute) + if(second_adjusted == 1 && second >= 1) + second = " and 1 second" + else if(second > 1) + second = " and [second_adjusted] seconds" + else //shows a fraction if seconds is < 1 + if(second_rounded) //no sense rounding again if it's already done + second = " and [second] seconds" + else + second = " and [round(second, 0.1)] seconds" + else + if(second_adjusted == 1 && second >= 1) + second = "1 second" + else if(second > 1) + second = "[second_adjusted] seconds" + else + if(second_rounded) + second = "[second] seconds" + else + second = "[round(second, 0.1)] seconds" + else + second = null + + if(!minute) + return "[second]" + if(minute >= 60) + hour = round_down(minute/60,1) + minute = (minute - (hour*60)) + if(minute) //alot simpler from here since you don't have to worry about fractions + if(minute != 1) + if((day || hour) && second) + minute = ", [minute] minutes" + else if((day || hour) && !second) + minute = " and [minute] minutes" + else + minute = "[minute] minutes" + else + if((day || hour) && second) + minute = ", 1 minute" + else if((day || hour) && !second) + minute = " and 1 minute" + else + minute = "1 minute" + else + minute = null + + if(!hour) + return "[minute][second]" + if(hour >= 24) + day = round_down(hour/24,1) + hour = (hour - (day*24)) + if(hour) + if(hour != 1) + if(day && (minute || second)) + hour = ", [hour] hours" + else if(day && (!minute || !second)) + hour = " and [hour] hours" + else + hour = "[hour] hours" + else + if(day && (minute || second)) + hour = ", 1 hour" + else if(day && (!minute || !second)) + hour = " and 1 hour" + else + hour = "1 hour" + else + hour = null + + if(!day) + return "[hour][minute][second]" + if(day > 1) + day = "[day] days" + else + day = "1 day" + + return "[day][hour][minute][second]" +>>>>>>> 74f5a8c... DisplayTimeText mk2 (#30969) diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index e018ccad91..b5dbabb934 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -322,7 +322,7 @@ SUBSYSTEM_DEF(air) EG.dismantle() CHECK_TICK - var/msg = "HEY! LISTEN! [(world.timeofday - timer)/10] Seconds were wasted processing [starting_ats] turf(s) (connected to [ending_ats] other turfs) with atmos differences at round start." + var/msg = "HEY! LISTEN! [DisplayTimeText(world.timeofday - timer)] were wasted processing [starting_ats] turf(s) (connected to [ending_ats] other turfs) with atmos differences at round start." to_chat(world, "[msg]") warning(msg) diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index ec34cfb8ed..87b06cd587 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -29,7 +29,7 @@ SUBSYSTEM_DEF(server_maint) var/cmob = C.mob if(!(isobserver(cmob) || (isdead(cmob) && C.holder))) log_access("AFK: [key_name(C)]") - to_chat(C, "You have been inactive for more than [config.afk_period / 600] minutes and have been disconnected.") + to_chat(C, "You have been inactive for more than [DisplayTimeText(config.afk_period)] and have been disconnected.") qdel(C) if (!(!C || world.time - C.connection_time < PING_BUFFER_TIME || C.inactivity >= (wait-1))) diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 4770689778..da003145c5 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -178,7 +178,7 @@ SUBSYSTEM_DEF(shuttle) emergency = backup_shuttle if(world.time - SSticker.round_start_time < config.shuttle_refuel_delay) - to_chat(user, "The emergency shuttle is refueling. Please wait another [abs(round(((world.time - SSticker.round_start_time) - config.shuttle_refuel_delay)/600))] minutes before trying again.") + to_chat(user, "The emergency shuttle is refueling. Please wait [DisplayTimeText((world.time - SSticker.round_start_time) - config.shuttle_refuel_delay)] before trying again.") return switch(emergency.mode) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 220c0e355a..7c10883c1d 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -505,7 +505,7 @@ SUBSYSTEM_DEF(ticker) end_state.count() var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100) - to_chat(world, "
[GLOB.TAB]Shift Duration: [round(world.time / 36000)]:[add_zero("[world.time / 600 % 60]", 2)]:[world.time / 100 % 6][world.time / 100 % 10]") + to_chat(world, "
[GLOB.TAB]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]") to_chat(world, "
[GLOB.TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]") if(mode.station_was_nuked) SSticker.news_report = STATION_DESTROYED_NUKE diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 0dbc7c5d3a..0ea16b32d8 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -169,7 +169,7 @@ SUBSYSTEM_DEF(vote) admin = TRUE if(next_allowed_time > world.time && !admin) - to_chat(usr, "A vote was initiated recently, you must wait roughly [(next_allowed_time-world.time)/10] seconds before a new vote can be started!") + to_chat(usr, "A vote was initiated recently, you must wait [DisplayTimeText(next_allowed_time-world.time)] before a new vote can be started!") return 0 reset() @@ -198,7 +198,7 @@ SUBSYSTEM_DEF(vote) if(mode == "custom") text += "\n[question]" log_vote(text) - to_chat(world, "\n[text]\nType vote or click here to place your votes.\nYou have [config.vote_period/10] seconds to vote.") + to_chat(world, "\n[text]\nType vote or click here to place your votes.\nYou have [DisplayTimeText(config.vote_period)] to vote.") time_remaining = round(config.vote_period/10) for(var/c in GLOB.clients) var/client/C = c diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index e22b2747e0..9f8a44bed2 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -57,7 +57,7 @@ if(!placed) if(manualplace_min_time && world.time >= manualplace_min_time) to_chat(src, "You may now place your blob core.") - to_chat(src, "You will automatically place your blob core in [round((autoplace_max_time - world.time)/600, 0.5)] minutes.") + to_chat(src, "You will automatically place your blob core in [DisplayTimeText(autoplace_max_time - world.time)].") manualplace_min_time = 0 if(autoplace_max_time && world.time >= autoplace_max_time) place_blob_core(base_point_rate, 1) diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index 6baf8b4dbe..026183d951 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -365,5 +365,5 @@ to_chat(src, "Shortcuts: Click = Expand Blob | Middle Mouse Click = Rally Spores | Ctrl Click = Create Shield Blob | Alt Click = Remove Blob") to_chat(src, "Attempting to talk will send a message to all other overminds, allowing you to coordinate with them.") if(!placed && autoplace_max_time <= world.time) - to_chat(src, "You will automatically place your blob core in [round((autoplace_max_time - world.time)/600, 0.5)] minutes.") + to_chat(src, "You will automatically place your blob core in [DisplayTimeText(autoplace_max_time - world.time)].") to_chat(src, "You [manualplace_min_time ? "will be able to":"can"] manually place your blob core by pressing the Place Blob Core button in the bottom right corner of the screen.") diff --git a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm index a6eb5fb4e7..9b1ef66c9e 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/spatial_gateway.dm @@ -207,7 +207,7 @@ time_duration = round(time_duration * (2 * efficiency), 1) CO.active = TRUE //you'd be active in a second but you should update immediately invoker.visible_message("The air in front of [invoker] ripples before suddenly tearing open!", \ - "With a word, you rip open a [two_way ? "two-way":"one-way"] rift to [input_target_key]. It will last for [time_duration / 10] seconds and has [gateway_uses] use[gateway_uses > 1 ? "s" : ""].") + "With a word, you rip open a [two_way ? "two-way":"one-way"] rift to [input_target_key]. It will last for [DisplayTimeText(time_duration)] and has [gateway_uses] use[gateway_uses > 1 ? "s" : ""].") var/obj/effect/clockwork/spatial_gateway/S1 = new(issrcobelisk ? get_turf(src) : get_step(get_turf(invoker), invoker.dir)) var/obj/effect/clockwork/spatial_gateway/S2 = new(istargetobelisk ? get_turf(target) : get_step(get_turf(target), target.dir)) diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm index eecfec7780..bf76cdb2f7 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm @@ -318,23 +318,10 @@ if(servants > SCRIPT_SERVANT_REQ) servants -= SCRIPT_SERVANT_REQ production_time += min(SLAB_SERVANT_SLOWDOWN * servants, SLAB_SLOWDOWN_MAXIMUM) - var/production_text_addon = "" if(production_time != SLAB_PRODUCTION_TIME+SLAB_SLOWDOWN_MAXIMUM) - production_text_addon = ", which increases for each human or silicon Servant above [SCRIPT_SERVANT_REQ]" - production_time = production_time/600 - var/list/production_text - if(round(production_time)) - production_text = list("[round(production_time)] minute\s") - if(production_time != round(production_time)) - production_time -= round(production_time) - production_time *= 60 - if(!LAZYLEN(production_text)) - production_text = list("[round(production_time, 1)] second\s") - else - production_text += " and [round(production_time, 1)] second\s" - production_text += "" - production_text += production_text_addon - production_text = production_text.Join() + production_time = "[DisplayTimeText(production_time)], which increases for each human or silicon Servant above [SCRIPT_SERVANT_REQ]" + else + production_time = "[DisplayTimeText(production_time)]" textlist = list("
[text2ratvar("Purge all untruths and honor Engine.")]

\ \ @@ -439,23 +426,10 @@ if(servants > SCRIPT_SERVANT_REQ) servants -= SCRIPT_SERVANT_REQ production_time += min(SLAB_SERVANT_SLOWDOWN * servants, SLAB_SLOWDOWN_MAXIMUM) - var/production_text_addon = "" if(production_time != SLAB_PRODUCTION_TIME+SLAB_SLOWDOWN_MAXIMUM) - production_text_addon = ", which increases for each human or silicon Servant above [SCRIPT_SERVANT_REQ]" - production_time = production_time/600 - var/list/production_text - if(round(production_time)) - production_text = list("[round(production_time)] minute\s") - if(production_time != round(production_time)) - production_time -= round(production_time) - production_time *= 60 - if(!LAZYLEN(production_text)) - production_text = list("[round(production_time, 1)] second\s") - else - production_text += " and [round(production_time, 1)] second\s" - production_text += "" - production_text += production_text_addon - production_text = production_text.Join() + production_time = "[DisplayTimeText(production_time)], which increases for each human or silicon Servant above [SCRIPT_SERVANT_REQ]" + else + production_time = "[DisplayTimeText(production_time)]" dat += "Components & Their Uses

" dat += "Components are your primary resource as a Servant. There are five types of component, with each one being used in different roles:

" dat += "[get_component_icon(BELLIGERENT_EYE)]BE Belligerent Eyes are aggressive and judgemental, and are used in offensive scripture;
" @@ -466,7 +440,7 @@ dat += "Although this is a good rule of thumb, their effects become much more nuanced when used together. For instance, a turret might have both belligerent eyes and \ vanguard cogwheels as construction requirements, because it defends its allies by harming its enemies.

" dat += "Components' primary use is fueling scripture (covered in its own section), and they can be created through various ways. This clockwork slab, for instance, \ - will make a random component of every type - or a specific one, if you choose a target component from the interface - every [production_text]. This number will increase \ + will make a random component of every type - or a specific one, if you choose a target component from the interface - every [production_time]. This number will increase \ as the amount of Servants in the covenant increase; additionally, slabs can only produce components when held by a Servant, and holding more than one slab will cause both \ of them to halt progress until one of them is removed from their person.

" dat += "Your slab has an internal storage of components, but it isn't meant to be the main one. Instead, there's a global storage of components that can be \ diff --git a/code/game/gamemodes/clock_cult/clock_structures/tinkerers_cache.dm b/code/game/gamemodes/clock_cult/clock_structures/tinkerers_cache.dm index 326aa46c06..cd33cf7adc 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/tinkerers_cache.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/tinkerers_cache.dm @@ -105,7 +105,7 @@ ..() if(is_servant_of_ratvar(user) || isobserver(user)) if(linkedwall) - to_chat(user, "It is linked to a Clockwork Wall and will generate a component every [round(get_production_time() * 0.1, 0.1)] seconds!") + to_chat(user, "It is linked to a Clockwork Wall and will generate a component every [DisplayTimeText(get_production_time())]!") else to_chat(user, "It is unlinked! Construct a Clockwork Wall nearby to generate components!") to_chat(user, "Stored components:") diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index 283376b055..b8cbed5051 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -96,7 +96,7 @@ /proc/pollCultists(var/mob/living/Nominee) //Cult Master Poll if(world.time < CULT_POLL_WAIT) - to_chat(Nominee, "It would be premature to select a leader while everyone is still settling in, try again in [round((CULT_POLL_WAIT-world.time)/10)] seconds.") + to_chat(Nominee, "It would be premature to select a leader while everyone is still settling in, try again in [DisplayTimeText(CULT_POLL_WAIT-world.time)].") return GLOB.cult_vote_called = TRUE //somebody's trying to be a master, make sure we don't let anyone else try for(var/datum/mind/B in SSticker.mode.cult) @@ -232,7 +232,7 @@ return FALSE if(cooldown > world.time) if(!CM.active) - to_chat(owner, "You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can mark another target!") + to_chat(owner, "You need to wait [DisplayTimeText(cooldown - world.time)] before you can mark another target!") return FALSE return ..() @@ -324,7 +324,7 @@ return FALSE if(cooldown > world.time) if(!PM.active) - to_chat(owner, "You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can pulse again!") + to_chat(owner, "You need to wait [DisplayTimeText(cooldown - world.time)] before you can pulse again!") return FALSE return ..() diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 0cba943287..c1ccf9a368 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -10,7 +10,7 @@ ..() to_chat(user, "\The [src] is [anchored ? "":"not "]secured to the floor.") if((iscultist(user) || isobserver(user)) && cooldowntime > world.time) - to_chat(user, "The magic in [src] is too weak, [p_they()] will be ready to use again in [getETA()].") + to_chat(user, "The magic in [src] is too weak, [p_they()] will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") /obj/structure/destructible/cult/examine_status(mob/user) if(iscultist(user) || isobserver(user)) @@ -50,13 +50,6 @@ animate(src, color = previouscolor, time = 8) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8) -/obj/structure/destructible/cult/proc/getETA() - var/time = (cooldowntime - world.time)/600 - var/eta = "[round(time, 1)] minutes" - if(time <= 1) - time = (cooldowntime - world.time)*0.1 - eta = "[round(time, 1)] seconds" - return eta /obj/structure/destructible/cult/talisman name = "altar" @@ -72,7 +65,7 @@ to_chat(user, "You need to anchor [src] to the floor with a tome first.") return if(cooldowntime > world.time) - to_chat(user, "The magic in [src] is weak, it will be ready to use again in [getETA()].") + to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") return var/choice = alert(user,"You study the schematics etched into the forge...",,"Eldritch Whetstone","Zealot's Blindfold","Flask of Unholy Water") var/pickedtype @@ -105,7 +98,7 @@ to_chat(user, "You need to anchor [src] to the floor with a tome first.") return if(cooldowntime > world.time) - to_chat(user, "The magic in [src] is weak, it will be ready to use again in [getETA()].") + to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") return var/choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Nar-Sien Hardsuit") var/pickedtype @@ -212,7 +205,7 @@ to_chat(user, "You need to anchor [src] to the floor with a tome first.") return if(cooldowntime > world.time) - to_chat(user, "The magic in [src] is weak, it will be ready to use again in [getETA()].") + to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].") return var/choice = alert(user,"You flip through the black pages of the archives...",,"Supply Talisman","Shuttle Curse","Veil Walker Set") var/list/pickedtype = list() diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 182b7e2756..0a7427b610 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -13,7 +13,7 @@ var/flash = " - || - " var/obj/machinery/abductor/console/console var/message_cooldown = 0 - var/breakout_time = 0.75 + var/breakout_time = 450 /obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user) if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) @@ -50,9 +50,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("You see [user] kicking against the door of [src]!", \ - "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a metallic creaking from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src || state_open) return user.visible_message("[user] successfully broke out of [src]!", \ diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index 7b2a20a297..f51b9ac914 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -19,7 +19,7 @@ return declaring_war = TRUE - var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew? You have [-round((world.time-SSticker.round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide", "Declare war?", "Yes", "No") + var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew? You have [DisplayTimeText(world.time-SSticker.round_start_time - CHALLENGE_TIME_LIMIT)] to decide", "Declare war?", "Yes", "No") declaring_war = FALSE if(!check_allowed(user)) diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 4f691e053f..8a4c854d76 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -43,7 +43,7 @@ to_chat(user, "[src] is out of foam and cannot be activated.") return if(cooldown_time > world.time) - to_chat(user, "[src] cannot be activated for another [round((world.time - cooldown_time) * 0.1)] second\s.") + to_chat(user, "[src] cannot be activated for [DisplayTimeText(world.time - cooldown_time)].") return new /obj/effect/particle_effect/foam(loc) uses-- diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index aafe74f2b3..105fb64042 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -169,7 +169,7 @@ if("working") temp_html += status temp_html += "

System Busy

" - temp_html += "Working ... Please wait ([radduration] Seconds)" + temp_html += "Working ... Please wait ([DisplayTimeText(radduration)])" if("buffer") temp_html += status temp_html += buttons diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 943419c548..48103a455f 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/machinery/computer/pod name = "mass driver launch control" desc = "A combined blastdoor and mass driver control unit." @@ -142,4 +143,149 @@ /obj/machinery/computer/pod/old/swf name = "\improper Magix System IV" - desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorceror's Edition" \ No newline at end of file + desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorceror's Edition" +======= +/obj/machinery/computer/pod + name = "mass driver launch control" + desc = "A combined blastdoor and mass driver control unit." + var/obj/machinery/mass_driver/connected = null + var/title = "Mass Driver Controls" + var/id = 1 + var/timing = 0 + var/time = 30 + var/range = 4 + + +/obj/machinery/computer/pod/Initialize() + . = ..() + for(var/obj/machinery/mass_driver/M in range(range, src)) + if(M.id == id) + connected = M + + +/obj/machinery/computer/pod/proc/alarm() + if(stat & (NOPOWER|BROKEN)) + return + + if(!connected) + say("Cannot locate mass driver connector. Cancelling firing sequence!") + return + + for(var/obj/machinery/door/poddoor/M in range(range, src)) + if(M.id == id) + M.open() + + sleep(20) + for(var/obj/machinery/mass_driver/M in range(range, src)) + if(M.id == id) + M.power = connected.power + M.drive() + + sleep(50) + for(var/obj/machinery/door/poddoor/M in range(range, src)) + if(M.id == id) + M.close() + +/obj/machinery/computer/pod/attack_hand(mob/user) + if(..()) + return + + var/dat = "" + user.set_machine(src) + if(connected) + var/d2 + if(timing) //door controls do not need timers. + d2 = "Stop Time Launch" + else + d2 = "Initiate Time Launch" + dat += "
\nTimer System: [d2]\nTime Left: [DisplayTimeText(time)] - - + +" + var/temp = "" + var/list/L = list( 0.25, 0.5, 1, 2, 4, 8, 16 ) + for(var/t in L) + if(t == connected.power) + temp += "[t] " + else + temp += "[t] " + dat += "
\nPower Level: [temp]
\nFiring Sequence
\nTest Fire Driver
\nToggle Outer Door
" + else + dat += "
\nToggle Outer Door
" + dat += "

Close" + add_fingerprint(usr) + var/datum/browser/popup = new(user, "computer", title, 400, 500) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) + popup.open() + + +/obj/machinery/computer/pod/process() + if(!..()) + return + if(timing) + if(time > 0) + time = round(time) - 1 + else + alarm() + time = 0 + timing = 0 + updateDialog() + + +/obj/machinery/computer/pod/Topic(href, href_list) + if(..()) + return + if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) + usr.set_machine(src) + if(href_list["power"]) + var/t = text2num(href_list["power"]) + t = min(max(0.25, t), 16) + if(connected) + connected.power = t + if(href_list["alarm"]) + alarm() + if(href_list["time"]) + timing = text2num(href_list["time"]) + if(href_list["tp"]) + var/tp = text2num(href_list["tp"]) + time += tp + time = min(max(round(time), 0), 120) + if(href_list["door"]) + for(var/obj/machinery/door/poddoor/M in range(range, src)) + if(M.id == id) + if(M.density) + M.open() + else + M.close() + if(href_list["drive"]) + for(var/obj/machinery/mass_driver/M in range(range, src)) + if(M.id == id) + M.power = connected.power + M.drive() + updateUsrDialog() + + +/obj/machinery/computer/pod/old + name = "\improper DoorMex control console" + title = "Door Controls" + icon_state = "oldcomp" + icon_screen = "library" + icon_keyboard = null + + +/obj/machinery/computer/pod/old/syndicate + name = "\improper ProComp Executive IIc" + desc = "The Syndicate operate on a tight budget. Operates external airlocks." + title = "External Airlock Controls" + req_access = list(ACCESS_SYNDICATE) + +/obj/machinery/computer/pod/old/syndicate/attack_hand(mob/user) + if(!allowed(user)) + to_chat(user, "Access denied.") + return + else + ..() + + +/obj/machinery/computer/pod/old/swf + name = "\improper Magix System IV" + desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorceror's Edition" +>>>>>>> 74f5a8c... DisplayTimeText mk2 (#30969) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 9ba8e1d34d..f919bdbab8 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -96,7 +96,7 @@ dat += "
" dat += " Select Track
" dat += "Track Selected: [selection.song_name]
" - dat += "Track Length: [selection.song_length/10] seconds

" + dat += "Track Length: [DisplayTimeText(selection.song_length)]

" dat += "
DJ's Soundboard:
" dat +="
" dat += "Air Horn " @@ -122,7 +122,7 @@ return if(!active) if(stop > world.time) - to_chat(usr, "Error: The device is still resetting from the last activation, it will be ready again in [round((stop-world.time)/10)] seconds.") + to_chat(usr, "Error: The device is still resetting from the last activation, it will be ready again in [DisplayTimeText(stop-world.time)].") playsound(src, 'sound/misc/compiler-failure.ogg', 50, 1) return active = TRUE diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 4085b4edb4..034a260925 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -15,7 +15,7 @@ var/scan_level var/precision_coeff var/message_cooldown - var/breakout_time = 2 + var/breakout_time = 1200 /obj/machinery/dna_scannernew/RefreshParts() scan_level = 0 @@ -73,9 +73,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("You see [user] kicking against the door of [src]!", \ - "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a metallic creaking from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked) return locked = FALSE diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm index d77e91af90..2d7c7708b3 100644 --- a/code/game/machinery/gulag_teleporter.dm +++ b/code/game/machinery/gulag_teleporter.dm @@ -20,7 +20,7 @@ The console is located at computer/gulag_teleporter.dm circuit = /obj/item/circuitboard/machine/gulag_teleporter var/locked = FALSE var/message_cooldown - var/breakout_time = 1 + var/breakout_time = 600 var/jumpsuit_type = /obj/item/clothing/under/rank/prisoner var/shoes_type = /obj/item/clothing/shoes/sneakers/orange var/obj/machinery/gulag_item_reclaimer/linked_reclaimer @@ -104,9 +104,9 @@ The console is located at computer/gulag_teleporter.dm user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("You see [user] kicking against the door of [src]!", \ - "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a metallic creaking from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked) return locked = FALSE diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index e86f78722b..6af0240214 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -79,7 +79,7 @@ return if(world.time < last_teleport + teleport_cooldown) - to_chat(user, "[src] is recharging power. Please wait [round((last_teleport + teleport_cooldown - world.time) / 10)] seconds.") + to_chat(user, "[src] is recharging power. Please wait [DisplayTimeText(last_teleport + teleport_cooldown - world.time)].") return if(teleporting) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index a78fa50a6a..7c51c383fa 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -27,7 +27,7 @@ var/uv_super = FALSE var/uv_cycles = 6 var/message_cooldown - var/breakout_time = 0.5 + var/breakout_time = 300 /obj/machinery/suit_storage_unit/standard_unit suit_type = /obj/item/clothing/suit/space/eva @@ -267,9 +267,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("You see [user] kicking against the doors of [src]!", \ - "You start kicking against the doors... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You start kicking against the doors... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a thump from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src ) return user.visible_message("[user] successfully broke out of [src]!", \ diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 400cd0478e..f143636512 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -206,12 +206,12 @@ . = ..() /obj/structure/spider/cocoon/container_resist(mob/living/user) - var/breakout_time = 1 + var/breakout_time = 600 user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT - to_chat(user, "You struggle against the tight bonds... (This will take about [breakout_time] minutes.)") + to_chat(user, "You struggle against the tight bonds... (This will take about [DisplayTimeText(breakout_time)].)") visible_message("You see something struggling and writhing in \the [src]!") - if(do_after(user,(breakout_time*60*10), target = src)) + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src) return qdel(src) diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm index 3edb5be090..ee7a91140c 100644 --- a/code/game/objects/items/charter.dm +++ b/code/game/objects/items/charter.dm @@ -59,7 +59,7 @@ to_chat(user, "Your name has been sent to your employers for approval.") // Autoapproves after a certain time response_timer_id = addtimer(CALLBACK(src, .proc/rename_station, new_name, user.name, user.real_name, key_name(user)), approval_time, TIMER_STOPPABLE) - to_chat(GLOB.admins, "CUSTOM STATION RENAME:[ADMIN_LOOKUPFLW(user)] proposes to rename the [name_type] to [new_name] (will autoapprove in [approval_time / 10] seconds). [ADMIN_SMITE(user)] (REJECT) [ADMIN_CENTCOM_REPLY(user)]") + to_chat(GLOB.admins, "CUSTOM STATION RENAME:[ADMIN_LOOKUPFLW(user)] proposes to rename the [name_type] to [new_name] (will autoapprove in [DisplayTimeText(approval_time)]). [ADMIN_SMITE(user)] (REJECT) [ADMIN_CENTCOM_REPLY(user)]") /obj/item/station_charter/proc/reject_proposed(user) if(!user) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 31e5b70732..7d3eabfdc6 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -181,7 +181,7 @@ MASS SPECTROMETER to_chat(user, "Time of Death: [M.tod]") var/tdelta = round(world.time - M.timeofdeath) if(tdelta < (DEFIB_TIME_LIMIT * 10)) - to_chat(user, "Subject died [tdelta / 10] seconds ago, defibrillation may be possible!") + to_chat(user, "Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!") for(var/thing in M.viruses) var/datum/disease/D = thing diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 2cc0ab0417..663eed0a8d 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -111,7 +111,6 @@ effective or pretty fucking useless. /obj/item/device/healthanalyzer/rad_laser/interact(mob/user) user.set_machine(src) - var/cooldown = GetCooldown() var/dat = "Irradiation: [irradiate ? "On" : "Off"]
" dat += "Stealth Mode (NOTE: Deactivates automatically while Irradiation is off): [stealth ? "On" : "Off"]
" dat += "Scan Mode: " @@ -133,7 +132,7 @@ effective or pretty fucking useless. -- [(wavelength+(intensity*4))] ++
- Laser Cooldown: [cooldown] Seconds
+ Laser Cooldown: [DisplayTimeText(GetCooldown())]
"} var/datum/browser/popup = new(user, "radlaser", "Radioactive Microlaser Interface", 400, 240) diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index 76c61ade81..8d252cb5af 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -20,7 +20,7 @@ var/special = FALSE var/special_name = "special function" var/message_cooldown - var/breakout_time = 1 + var/breakout_time = 600 /obj/machinery/implantchair/Initialize() . = ..() @@ -124,9 +124,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("You see [user] kicking against the door of [src]!", \ - "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a metallic creaking from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src || state_open) return user.visible_message("[user] successfully broke out of [src]!", \ diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index e15f0446a5..c7b63be32b 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -15,7 +15,7 @@ max_integrity = 200 integrity_failure = 50 armor = list(melee = 20, bullet = 10, laser = 10, energy = 0, bomb = 10, bio = 0, rad = 0, fire = 70, acid = 60) - var/breakout_time = 2 + var/breakout_time = 1200 var/message_cooldown var/can_weld_shut = TRUE var/horizontal = FALSE @@ -366,9 +366,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("[src] begins to shake violently!", \ - "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear banging from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded) ) return //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting diff --git a/code/game/objects/structures/crates_lockers/crates/critter.dm b/code/game/objects/structures/crates_lockers/crates/critter.dm index 3f631883c1..579ebd45c7 100644 --- a/code/game/objects/structures/crates_lockers/crates/critter.dm +++ b/code/game/objects/structures/crates_lockers/crates/critter.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/structure/closet/crate/critter name = "critter crate" desc = "A crate designed for safe transport of animals. It has an oxygen tank for safe transport in space." @@ -35,4 +36,43 @@ if(tank) return tank.air_contents else +======= +/obj/structure/closet/crate/critter + name = "critter crate" + desc = "A crate designed for safe transport of animals. It has an oxygen tank for safe transport in space." + icon_state = "crittercrate" + horizontal = FALSE + allow_objects = FALSE + breakout_time = 600 + material_drop = /obj/item/stack/sheet/mineral/wood + material_drop_amount = 4 + delivery_icon = "deliverybox" + var/obj/item/tank/internals/emergency_oxygen/tank + +/obj/structure/closet/crate/critter/New() + ..() + tank = new + +/obj/structure/closet/crate/critter/Destroy() + var/turf/T = get_turf(src) + if(tank) + tank.forceMove(T) + tank = null + + return ..() + +/obj/structure/closet/crate/critter/update_icon() + cut_overlays() + if(opened) + add_overlay("crittercrate_door_open") + else + add_overlay("crittercrate_door") + if(manifest) + add_overlay("manifest") + +/obj/structure/closet/crate/critter/return_air() + if(tank) + return tank.air_contents + else +>>>>>>> 74f5a8c... DisplayTimeText mk2 (#30969) return loc.return_air() \ No newline at end of file diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index f4a98811c0..a5def04e0b 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -24,7 +24,7 @@ var/locked = FALSE var/opendir = SOUTH var/message_cooldown - var/breakout_time = 1 + var/breakout_time = 600 /obj/structure/bodycontainer/Destroy() open() @@ -97,9 +97,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message(null, \ - "You lean on the back of [src] and start pushing the tray open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You lean on the back of [src] and start pushing the tray open... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a metallic creaking from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src ) return user.visible_message("[user] successfully broke out of [src]!", \ diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 467f846b3a..39e07e0a9f 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -317,7 +317,7 @@ dat += "Replacement Game Mode: [SSticker.mode.replacementmode.name]
" else dat += "Current Game Mode: [SSticker.mode.name]
" - dat += "Round Duration: [round(world.time / 36000)]:[add_zero("[world.time / 600 % 60]", 2)]:[world.time / 100 % 6][world.time / 100 % 10]
" + dat += "Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
" dat += "Emergency shuttle
" if(EMERGENCY_IDLE_OR_RECALLED) dat += "Call Shuttle
" diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 4cbac86270..0842d82553 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -114,7 +114,7 @@ end_time -= start_time to_chat(usr, "SDQL query results: [query_text]") to_chat(usr, "SDQL query completed: [objs_all] objects selected by path, and [objs_eligible] objects executed on after WHERE filtering if applicable.") - to_chat(usr, "SDQL query took [end_time/10] seconds to complete.") + to_chat(usr, "SDQL query took [DisplayTimeText(end_time)] to complete.") /proc/SDQL_qdel_datum(datum/d) qdel(d) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 16f654bb80..47f240424f 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -399,9 +399,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) dat += "
[GLOB.TAB][TicketHref("Refresh", ref_src)][GLOB.TAB][TicketHref("Re-Title", ref_src, "retitle")]" if(state != AHELP_ACTIVE) dat += "[GLOB.TAB][TicketHref("Reopen", ref_src, "reopen")]" - dat += "

Opened at: [gameTimestamp(wtime = opened_at)] (Approx [(world.time - opened_at) / 600] minutes ago)" + dat += "

Opened at: [gameTimestamp(wtime = opened_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)" if(closed_at) - dat += "
Closed at: [gameTimestamp(wtime = closed_at)] (Approx [(world.time - closed_at) / 600] minutes ago)" + dat += "
Closed at: [gameTimestamp(wtime = closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)" dat += "

" if(initiator) dat += "Actions: [FullMonty(ref_src)]
" diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index a4482154d8..68df8a6666 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -43,8 +43,8 @@ log_admin("DEBUG: [key_name(M)] next_move = [M.next_move] lastDblClick = [M.next_click] world.time = [world.time]") M.next_move = 1 M.next_click = 0 - message_admins("[key_name_admin(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [largest_move_time/10] seconds!") - message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [largest_click_time/10] seconds!") + message_admins("[key_name_admin(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [DisplayTimeText(largest_move_time)]!") + message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [DisplayTimeText(largest_click_time)]!") message_admins("world.time = [world.time]") SSblackbox.add_details("admin_verb","Unfreeze Everyone") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 2e0d1f3805..e368fdde92 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -33,7 +33,7 @@ var/escape_in_progress = FALSE var/message_cooldown - var/breakout_time = 0.5 + var/breakout_time = 300 /obj/machinery/atmospherics/components/unary/cryo_cell/Initialize() . = ..() @@ -246,9 +246,9 @@ user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT user.visible_message("You see [user] kicking against the glass of [src]!", \ - "You struggle inside [src], kicking the release with your foot... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You struggle inside [src], kicking the release with your foot... (this will take about [DisplayTimeText(breakout_time)].)", \ "You hear a thump from [src].") - if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(do_after(user,(breakout_time), target = src)) if(!user || user.stat != CONSCIOUS || user.loc != src ) return user.visible_message("[user] successfully broke out of [src]!", \ diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 0bed5b94c7..2dc38a48f2 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -210,7 +210,7 @@ return if(user.ckey in team_members) if(user.ckey in recently_dead_ckeys) - to_chat(user, "It must be more than [respawn_cooldown/10] seconds from your last death to respawn!") + to_chat(user, "It must be more than [DisplayTimeText(respawn_cooldown)] from your last death to respawn!") return var/client/new_team_member = user.client if(user.mind && user.mind.current) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index ed7fb77bac..9a721bee62 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -123,7 +123,7 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation) to_chat(user, "Error: No destination found.") return if(world.time < wait) - to_chat(user, "Error: Warpspace triangulation in progress. Estimated time to completion: [round(((wait - world.time) / 10) / 60)] minutes.") + to_chat(user, "Error: Warpspace triangulation in progress. Estimated time to completion: [DisplayTimeText(wait - world.time)].") return for(var/obj/machinery/gateway/G in linked) diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index b777ce3f1c..c0c8cf5b74 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -88,7 +88,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) if(usrinfo) //If this info isn't null, it hasn't been added yet desclines.Add(usrinfo) if(silencing) - desclines += " (This error will now be silenced for [configured_error_silence_time / 600] minutes)" + desclines += " (This error will now be silenced for [DisplayTimeText(configured_error_silence_time)])" if(GLOB.error_cache) GLOB.error_cache.log_error(E, desclines) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index c1dd6a662e..4ecf2845db 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -392,12 +392,7 @@ /mob/dead/new_player/proc/LateChoices() - var/mills = world.time - SSticker.round_start_time // 1/10 of a second, not real milliseconds but whatever - //var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something - var/mins = (mills % 36000) / 600 - var/hours = mills / 36000 - - var/dat = "
Round Duration: [round(hours)]h [round(mins)]m
" + var/dat = "
Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
" if(SSshuttle.emergency) switch(SSshuttle.emergency.mode) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 4109166ebd..aa72ebfa9f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -302,10 +302,9 @@ return I.being_removed = TRUE breakouttime = I.breakouttime - var/displaytime = breakouttime / 600 if(!cuff_break) visible_message("[src] attempts to remove [I]!") - to_chat(src, "You attempt to remove [I]... (This will take around [displaytime] minutes and you need to stand still.)") + to_chat(src, "You attempt to remove [I]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)") if(do_after(src, breakouttime, 0, target = src)) clear_cuffs(I, cuff_break) else diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 58b0c673a7..917242609e 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -235,7 +235,7 @@ if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore return var/time_taken = I.embedded_unsafe_removal_time*I.w_class - usr.visible_message("[usr] attempts to remove [I] from their [L.name].","You attempt to remove [I] from your [L.name]... (It will take [time_taken/10] seconds.)") + usr.visible_message("[usr] attempts to remove [I] from their [L.name].","You attempt to remove [I] from your [L.name]... (It will take [DisplayTimeText(time_taken)].)") if(do_after(usr, time_taken, needhand = 1, target = src)) if(!I || !L || I.loc != src || !(I in L.embedded_objects)) return diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index 4d0453a17c..e148bd2763 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -97,7 +97,7 @@ /mob/living/silicon/ai/proc/announcement() var/static/announcing_vox = 0 // Stores the time of the last announcement if(announcing_vox > world.time) - to_chat(src, "Please wait [round((announcing_vox - world.time) / 10)] seconds.") + to_chat(src, "Please wait [DisplayTimeText(announcing_vox - world.time)].") return var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", src.last_announcement) as text diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index d8a2985594..144f7081e0 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -159,7 +159,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians resulthealth = round((summoner.health / summoner.maxHealth) * 100, 0.5) stat(null, "Summoner Health: [resulthealth]%") if(cooldown >= world.time) - stat(null, "Manifest/Recall Cooldown Remaining: [max(round((cooldown - world.time)*0.1, 0.1), 0)] seconds") + stat(null, "Manifest/Recall Cooldown Remaining: [DisplayTimeText(cooldown - world.time)]") /mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range . = ..() diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm index 9632ce3ff9..45d8c17d0c 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm @@ -30,7 +30,7 @@ ..() if(statpanel("Status")) if(stealthcooldown >= world.time) - stat(null, "Stealth Cooldown Remaining: [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds") + stat(null, "Stealth Cooldown Remaining: [DisplayTimeText(stealthcooldown - world.time)]") /mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget() . = ..() @@ -79,7 +79,7 @@ updatestealthalert() toggle = TRUE else if(!forced) - to_chat(src, "You cannot yet enter stealth, wait another [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds!") + to_chat(src, "You cannot yet enter stealth, wait another [DisplayTimeText(stealthcooldown - world.time)]!") /mob/living/simple_animal/hostile/guardian/assassin/proc/updatestealthalert() if(stealthcooldown <= world.time) diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm index 45c093bbf2..c21b1474d8 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm @@ -14,7 +14,7 @@ ..() if(statpanel("Status")) if(bomb_cooldown >= world.time) - stat(null, "Bomb Cooldown Remaining: [max(round((bomb_cooldown - world.time)*0.1, 0.1), 0)] seconds") + stat(null, "Bomb Cooldown Remaining: [DisplayTimeText(bomb_cooldown - world.time)]") /mob/living/simple_animal/hostile/guardian/bomb/AttackingTarget() . = ..() diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index 33ad25291c..db1581d8cb 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -24,7 +24,7 @@ ..() if(statpanel("Status")) if(beacon_cooldown >= world.time) - stat(null, "Beacon Cooldown Remaining: [max(round((beacon_cooldown - world.time)*0.1, 0.1), 0)] seconds") + stat(null, "Beacon Cooldown Remaining: [DisplayTimeText(beacon_cooldown - world.time)]") /mob/living/simple_animal/hostile/guardian/healer/AttackingTarget() . = ..() diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index b21df4000c..1c3d416fd0 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -20,7 +20,7 @@ if(href_list["move"]) var/obj/item/circuitboard/computer/syndicate_shuttle/board = circuit if(board.challenge && world.time < SYNDICATE_CHALLENGE_TIMER) - to_chat(usr, "You've issued a combat challenge to the station! You've got to give them at least [round(((SYNDICATE_CHALLENGE_TIMER - world.time) / 10) / 60)] more minutes to allow them to prepare.") + to_chat(usr, "You've issued a combat challenge to the station! You've got to give them at least [DisplayTimeText(SYNDICATE_CHALLENGE_TIMER - world.time)] more to allow them to prepare.") return 0 board.moved = TRUE ..() diff --git a/code/modules/stock_market/computer.dm b/code/modules/stock_market/computer.dm index d693b86527..90ad08c4bb 100644 --- a/code/modules/stock_market/computer.dm +++ b/code/modules/stock_market/computer.dm @@ -82,7 +82,7 @@ a.updated { mystocks = S.shareholders[logged_in] dat += "
[S.name] ([S.short_name])[S.bankrupt ? " BANKRUPT" : null]
" if (S.last_unification) - dat += "Unified shares [(world.time - S.last_unification) / 600] minutes ago.
" + dat += "Unified shares [DisplayTimeText(world.time - S.last_unification)] ago.
" dat += "Current value per share: [S.current_value] | View history

" dat += "You currently own [mystocks] shares in this company. There are [S.available_shares] purchasable shares on the market currently.
" if (S.bankrupt) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index bdd385bcac..7fd09d69c2 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -61,7 +61,7 @@ else cooldown = revive_cost + world.time reviving = FALSE - to_chat(owner, "Your reviver implant shuts down and starts recharging. It will be ready again in [revive_cost/10] seconds.") + to_chat(owner, "Your reviver implant shuts down and starts recharging. It will be ready again in [DisplayTimeText(revive_cost)].") return if(cooldown > world.time) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 8f32aa89eb..eed05c6161 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -91,7 +91,7 @@ . = ..() if(!IsAvailable()) if(world.time < cords.next_command) - to_chat(owner, "You must wait [(cords.next_command - world.time)/10] seconds before Speaking again.") + to_chat(owner, "You must wait [DisplayTimeText(cords.next_command - world.time)] before Speaking again.") return var/command = input(owner, "Speak with the Voice of God", "Command") if(QDELETED(src) || QDELETED(owner)) @@ -102,7 +102,7 @@ /obj/item/organ/vocal_cords/colossus/can_speak_with() if(world.time < next_command) - to_chat(owner, "You must wait [(next_command - world.time)/10] seconds before Speaking again.") + to_chat(owner, "You must wait [DisplayTimeText(next_command - world.time)] before Speaking again.") return FALSE if(!owner) return FALSE From 0dd54affc4185d3a5a652f0a9f42ba4a62ca3cee Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 25 Sep 2017 10:04:39 -0400 Subject: [PATCH 006/136] Merge pull request #30995 from ShizCalev/map-fixes Map fixes --- _maps/map_files/BoxStation/BoxStation.dmm | 7 ++-- .../map_files/Deltastation/DeltaStation2.dmm | 34 +++++++++--------- _maps/map_files/MetaStation/MetaStation.dmm | 35 +++++++++++-------- _maps/map_files/OmegaStation/OmegaStation.dmm | 9 ++--- _maps/map_files/PubbyStation/PubbyStation.dmm | 9 ++--- 5 files changed, 53 insertions(+), 41 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 81ab68aa6c..656507316d 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -13334,6 +13334,7 @@ id = "chapelgun"; name = "Chapel Launcher Door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/chapel/main) "aEo" = ( @@ -27902,6 +27903,7 @@ id = "trash"; name = "disposal bay door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/maintenance/disposal) "bnw" = ( @@ -39042,6 +39044,7 @@ id = "toxinsdriver"; name = "toxins launcher bay door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/science/mixing) "bLm" = ( @@ -83826,7 +83829,7 @@ bHE bYu bZk bCq -cTG +cTF bCq bCq bCq @@ -85122,7 +85125,7 @@ bCq bCq bCq bCq -cTH +cTF bCq bLv bLv diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index a4ec56f95e..5809176275 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -30323,8 +30323,8 @@ /obj/item/stack/sheet/metal{ amount = 50 }, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /obj/machinery/newscaster{ pixel_y = -32 }, @@ -46733,7 +46733,6 @@ /turf/open/floor/carpet, /area/security/detectives_office) "bMX" = ( -/obj/machinery/computer/security/wooden_tv, /obj/structure/table/wood, /obj/machinery/button/door{ id = "detectivewindows"; @@ -46747,15 +46746,16 @@ pixel_y = -26 }, /obj/structure/disposalpipe/segment, +/obj/item/device/flashlight/lamp, +/obj/item/reagent_containers/food/drinks/flask/det, /turf/open/floor/carpet, /area/security/detectives_office) "bMY" = ( /obj/structure/table/wood, -/obj/item/device/flashlight/lamp, /obj/item/storage/secure/safe{ pixel_x = 32 }, -/obj/item/reagent_containers/food/drinks/flask/det, +/obj/machinery/computer/security/wooden_tv, /turf/open/floor/carpet, /area/security/detectives_office) "bMZ" = ( @@ -67256,7 +67256,7 @@ pixel_x = -26 }, /obj/structure/table/reinforced, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /turf/open/floor/plasteel/vault{ dir = 8 }, @@ -108370,8 +108370,8 @@ amount = 50 }, /obj/item/crowbar, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /obj/effect/turf_decal/bot, /obj/structure/sign/poster/official/report_crimes{ pixel_y = 32 @@ -136696,7 +136696,7 @@ aae aae aae aaf -dYc +aBW aae aae aaa @@ -136947,7 +136947,7 @@ aaa aaa aae aaf -dYc +aBW aae aae aaa @@ -137473,7 +137473,7 @@ dZB eab ear aaa -dYc +aBW aaa aaa aaa @@ -139529,7 +139529,7 @@ dZB eaf ear aaa -dYc +aBW aae aae aae @@ -140543,7 +140543,7 @@ dVy dUl aaf aaf -dYc +aBW aaa dZB eag @@ -140557,7 +140557,7 @@ dZB eag ear aaa -dYc +aBW aaa aaa aaa @@ -141060,14 +141060,14 @@ aaf aae aae aae -dYc +aBW aae aaa aaa aaf aaa aaa -dYc +aBW aae aae aaf @@ -141324,7 +141324,7 @@ aae aaf aae aae -dYc +aBW aaa aaa aaa diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index b12cbde21c..67107bf501 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -4182,6 +4182,7 @@ id = "trash"; name = "disposal bay door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/maintenance/disposal) "aig" = ( @@ -13541,10 +13542,6 @@ /turf/open/floor/carpet, /area/security/detectives_office) "azU" = ( -/obj/machinery/computer/security/wooden_tv{ - pixel_x = 3; - pixel_y = 2 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, @@ -13555,6 +13552,11 @@ network = list("Prison"); pixel_y = 30 }, +/obj/item/device/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/restraints/handcuffs, /turf/open/floor/carpet, /area/security/detectives_office) "azV" = ( @@ -13562,17 +13564,16 @@ /obj/item/storage/secure/safe{ pixel_x = 32 }, -/obj/item/device/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/restraints/handcuffs, /obj/machinery/button/door{ id = "detective_shutters"; name = "detective's office shutters control"; pixel_y = 26; req_access_txt = "4" }, +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 3; + pixel_y = 2 + }, /turf/open/floor/carpet, /area/security/detectives_office) "azW" = ( @@ -17389,8 +17390,8 @@ amount = 50 }, /obj/item/crowbar, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /obj/effect/turf_decal/bot{ dir = 1 }, @@ -23436,6 +23437,7 @@ /turf/open/floor/plating, /area/storage/primary) "aTi" = ( +/obj/machinery/door/firedoor, /obj/machinery/door/airlock/highsecurity{ locked = 0; name = "AI Upload"; @@ -24856,6 +24858,7 @@ /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai_upload_foyer) "aVY" = ( +/obj/machinery/door/firedoor, /obj/machinery/door/airlock/highsecurity{ name = "Secure Network Access"; req_access_txt = "19" @@ -36260,6 +36263,7 @@ d2 = 4; icon_state = "0-4" }, +/obj/item/paper_bin, /obj/item/stack/cable_coil/random, /obj/item/stack/cable_coil/random, /obj/item/stack/cable_coil/random, @@ -36280,6 +36284,7 @@ /area/storage/art) "brf" = ( /obj/structure/table, +/obj/item/paper_bin/construction, /obj/item/airlock_painter, /obj/machinery/airalarm{ dir = 8; @@ -41266,8 +41271,8 @@ /obj/item/stack/sheet/metal{ amount = 50 }, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /turf/open/floor/plasteel/caution{ dir = 8 }, @@ -69603,6 +69608,7 @@ id = "toxinsdriver"; name = "Toxins Launcher Bay Door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/science/mixing) "cDu" = ( @@ -77240,6 +77246,7 @@ id = "chapelgun"; name = "Chapel Launcher Door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/chapel/main) "cRQ" = ( @@ -128535,7 +128542,7 @@ aaa aaa aaf aaa -aaX +blx adl aQf adl diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 13bd789d72..12d1d8abe7 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -13900,8 +13900,8 @@ /obj/item/stack/sheet/metal{ amount = 50 }, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /obj/machinery/newscaster{ pixel_y = 32 }, @@ -20539,8 +20539,8 @@ amount = 50 }, /obj/item/crowbar, -/obj/item/grenade/chem_grenade/metalfoam, -/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/smart_metal_foam, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -35681,6 +35681,7 @@ id = "chapelmassdoor"; name = "Chapel Launcher Door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/chapel/main) "blJ" = ( diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index c82c1afafa..9ac324de33 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -13789,8 +13789,7 @@ pixel_x = -1; pixel_y = 9 }, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ - }, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ pixel_x = 7; pixel_y = 2 @@ -16903,6 +16902,7 @@ id = "trash"; name = "disposal bay door" }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/maintenance/disposal) "aLo" = ( @@ -41644,6 +41644,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/fans/tiny, /turf/open/floor/plating, /area/science/mineral_storeroom) "bMr" = ( @@ -45768,7 +45769,7 @@ /area/storage/tech) "bVL" = ( /obj/structure/table, -/obj/item/storage/box/metalfoam{ +/obj/item/storage/box/smart_metal_foam{ pixel_x = 4; pixel_y = 7 }, @@ -103836,8 +103837,8 @@ aaa aaa aaa aLn -aLn aNT +aQo aPg aQl aRu From f5d8051f4d506234c94f0374e72d5b2a847b4a8c Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 25 Sep 2017 12:08:06 -0500 Subject: [PATCH 008/136] Update mind.dm --- code/datums/mind.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 76c0b1ba0d..9c9fff22ae 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1488,7 +1488,6 @@ var/fail = 0 fail |= !SSticker.mode.equip_revolutionary(current) -<<<<<<< HEAD /datum/mind/proc/make_Abductor() var/role = alert("Abductor Role ?","Role","Agent","Scientist") var/team = input("Abductor Team ?","Team ?") in list(1,2,3,4) @@ -1533,9 +1532,7 @@ if("Scientist") L = scientist_landmarks[team] H.forceMove(L.loc) - -======= ->>>>>>> 18f329a... Datum abductors refactor (#30893) + /datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S) spell_list += S S.action.Grant(current) From 8140b2647ad314e002ad3f1ee6fe031dab6e3e30 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 25 Sep 2017 12:26:26 -0500 Subject: [PATCH 009/136] Update mind.dm --- code/datums/mind.dm | 45 --------------------------------------------- 1 file changed, 45 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 9c9fff22ae..147f442470 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1487,51 +1487,6 @@ take_uplink() var/fail = 0 fail |= !SSticker.mode.equip_revolutionary(current) - -/datum/mind/proc/make_Abductor() - var/role = alert("Abductor Role ?","Role","Agent","Scientist") - var/team = input("Abductor Team ?","Team ?") in list(1,2,3,4) - var/teleport = alert("Teleport to ship ?","Teleport","Yes","No") - - if(!role || !team || !teleport) - return - - if(!ishuman(current)) - return - - SSticker.mode.abductors |= src - - var/datum/objective/experiment/O = new - O.owner = src - objectives += O - - var/mob/living/carbon/human/H = current - - H.set_species(/datum/species/abductor) - var/datum/species/abductor/S = H.dna.species - - if(role == "Scientist") - S.scientist = TRUE - S.team = team - - var/list/obj/effect/landmark/abductor/agent_landmarks = new - var/list/obj/effect/landmark/abductor/scientist_landmarks = new - agent_landmarks.len = 4 - scientist_landmarks.len = 4 - for(var/obj/effect/landmark/abductor/A in GLOB.landmarks_list) - if(istype(A, /obj/effect/landmark/abductor/agent)) - agent_landmarks[text2num(A.team)] = A - else if(istype(A, /obj/effect/landmark/abductor/scientist)) - scientist_landmarks[text2num(A.team)] = A - - var/obj/effect/landmark/L - if(teleport=="Yes") - switch(role) - if("Agent") - L = agent_landmarks[team] - if("Scientist") - L = scientist_landmarks[team] - H.forceMove(L.loc) /datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S) spell_list += S From fd0bc465cc58b880e8559071be0fc2fb74b41be4 Mon Sep 17 00:00:00 2001 From: AnturK Date: Tue, 26 Sep 2017 11:20:05 +0200 Subject: [PATCH 010/136] Refactors cinematics. --- code/__DEFINES/cinematics.dm | 11 + code/controllers/subsystem/ticker.dm | 11 +- code/datums/cinematic.dm | 223 ++++++++++++++++++ code/game/gamemodes/game_mode.dm | 6 +- code/game/gamemodes/nuclear/nuclear.dm | 6 + code/game/gamemodes/nuclear/nuclearbomb.dm | 59 +++-- code/modules/admin/verbs/cinematic.dm | 16 +- code/modules/events/wizard/fakeexplosion.dm | 3 +- .../simple_animal/friendly/cockroach.dm | 2 +- code/modules/power/singularity/narsie.dm | 3 +- tgstation.dme | 5 + 11 files changed, 316 insertions(+), 29 deletions(-) create mode 100644 code/__DEFINES/cinematics.dm create mode 100644 code/datums/cinematic.dm diff --git a/code/__DEFINES/cinematics.dm b/code/__DEFINES/cinematics.dm new file mode 100644 index 0000000000..4bfc8dd3c4 --- /dev/null +++ b/code/__DEFINES/cinematics.dm @@ -0,0 +1,11 @@ +#define CINEMATIC_DEFAULT 1 +#define CINEMATIC_SELFDESTRUCT 2 +#define CINEMATIC_SELFDESTRUCT_MISS 3 +#define CINEMATIC_NUKE_WIN 4 +#define CINEMATIC_NUKE_MISS 5 +#define CINEMATIC_ANNIHILATION 6 +#define CINEMATIC_MALF 7 +#define CINEMATIC_CULT 8 +#define CINEMATIC_NUKE_FAKE 9 +#define CINEMATIC_NUKE_NO_CORE 10 +#define CINEMATIC_NUKE_FAR 11 \ No newline at end of file diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 220c0e355a..e7333966f9 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -51,14 +51,14 @@ SUBSYSTEM_DEF(ticker) var/queue_delay = 0 var/list/queued_players = list() //used for join queues when the server exceeds the hard population cap - var/obj/screen/cinematic = null //used for station explosion cinematic - var/maprotatechecked = 0 var/news_report var/late_join_disabled + var/roundend_check_paused = FALSE + var/round_start_time = 0 var/list/round_start_events var/mode_result = "undefined" @@ -137,7 +137,7 @@ SUBSYSTEM_DEF(ticker) scripture_states = scripture_unlock_alert(scripture_states) SSshuttle.autoEnd() - if(!mode.explosion_in_progress && mode.check_finished(force_ending) || force_ending) + if(!roundend_check_paused && mode.check_finished(force_ending) || force_ending) current_state = GAME_STATE_FINISHED toggle_ooc(TRUE) // Turn it on toggle_dooc(TRUE) @@ -274,6 +274,7 @@ SUBSYSTEM_DEF(ticker) if(epi) explosion(epi, 0, 256, 512, 0, TRUE, TRUE, 0, TRUE) +<<<<<<< HEAD //Plus it provides an easy way to make cinematics for other events. Just use this as a template /datum/controller/subsystem/ticker/proc/station_explosion_cinematic(station_missed=0, override = null, atom/bomb = null) if( cinematic ) @@ -411,6 +412,8 @@ SUBSYSTEM_DEF(ticker) if(actually_blew_up && !isnull(killz) && M.stat != DEAD && M.z == killz) M.gib() +======= +>>>>>>> 1304e83... Refactors cinematics. (#30888) /datum/controller/subsystem/ticker/proc/create_characters() for(var/mob/dead/new_player/player in GLOB.player_list) if(player.ready == PLAYER_READY_TO_PLAY && player.mind) @@ -711,13 +714,11 @@ SUBSYSTEM_DEF(ticker) queue_delay = SSticker.queue_delay queued_players = SSticker.queued_players - cinematic = SSticker.cinematic maprotatechecked = SSticker.maprotatechecked round_start_time = SSticker.round_start_time queue_delay = SSticker.queue_delay queued_players = SSticker.queued_players - cinematic = SSticker.cinematic maprotatechecked = SSticker.maprotatechecked modevoted = SSticker.modevoted diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm new file mode 100644 index 0000000000..3f72ff995b --- /dev/null +++ b/code/datums/cinematic.dm @@ -0,0 +1,223 @@ +GLOBAL_LIST_EMPTY(cinematics) + +// Use to play cinematics. +// Watcher can be world,mob, or a list of mobs +// Blocks until sequence is done. +/proc/Cinematic(id,watcher,datum/callback/special_callback) + var/datum/cinematic/playing + for(var/V in subtypesof(/datum/cinematic)) + var/datum/cinematic/C = V + if(initial(C.id) == id) + playing = new V() + break + if(!playing) + CRASH("Cinematic type not found") + if(special_callback) + playing.special_callback = special_callback + if(watcher == world) + playing.is_global = TRUE + watcher = GLOB.mob_list + playing.play(watcher) + +/obj/screen/cinematic + icon = 'icons/effects/station_explosion.dmi' + icon_state = "station_intact" + layer = 21 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + screen_loc = "1,1" + +/datum/cinematic + var/id = CINEMATIC_DEFAULT + var/list/watching = list() //List of clients watching this + var/list/locked = list() //Who had notransform set during the cinematic + var/is_global = FALSE //Global cinematics will override mob-specific ones + var/obj/screen/cinematic/screen + var/datum/callback/special_callback //For special effects synced with animation (explosions after the countdown etc) + var/cleanup_time = 300 //How long for the final screen to remain + +/datum/cinematic/New() + GLOB.cinematics += src + screen = new(src) + +/datum/cinematic/Destroy() + GLOB.cinematics -= src + QDEL_NULL(screen) + for(var/mob/M in locked) + M.notransform = FALSE + return ..() + +/datum/cinematic/proc/play(watchers) + //Check if you can actually play it (stop mob cinematics for global ones) and create screen objects + for(var/A in GLOB.cinematics) + var/datum/cinematic/C = A + if(C == src) + continue + if(C.is_global || !is_global) + return //Can't play two global or local cinematics at the same time + + //Close all open windows if global + if(is_global) + for (var/datum/html_interface/hi in GLOB.html_interfaces) + hi.closeAll() + SStgui.close_all_uis() + + + for(var/mob/M in GLOB.mob_list) + if(M in watchers) + M.notransform = TRUE //Should this be done for non-global cinematics or even at all ? + locked += M + //Close watcher ui's + SStgui.close_user_uis(M) + if(M.client) + watching += M.client + M.client.screen += screen + else + if(is_global) + M.notransform = TRUE + locked += M + + //Actually play it + content() + //Cleanup + sleep(cleanup_time) + qdel(src) + +//Sound helper +/datum/cinematic/proc/cinematic_sound(s) + if(is_global) + SEND_SOUND(world,s) + else + for(var/C in watching) + SEND_SOUND(C,s) + +//Fire up special callback for actual effects synchronized with animation (eg real nuke explosion happens midway) +/datum/cinematic/proc/special() + if(special_callback) + special_callback.Invoke() + +//Actual cinematic goes in here +/datum/cinematic/proc/content() + sleep(50) + +/datum/cinematic/nuke_win + id = CINEMATIC_NUKE_WIN + +/datum/cinematic/nuke_win/content() + flick("intro_nuke",screen) + sleep(35) + flick("station_explode_fade_red",screen) + cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + special() + screen.icon_state = "summary_nukewin" + +/datum/cinematic/nuke_miss + id = CINEMATIC_NUKE_MISS + +/datum/cinematic/nuke_miss/content() + flick("intro_nuke",screen) + sleep(35) + cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + special() + flick("station_intact_fade_red",screen) + screen.icon_state = "summary_nukefail" + +//Also used for blob +/datum/cinematic/nuke_selfdestruct + id = CINEMATIC_SELFDESTRUCT + +/datum/cinematic/nuke_selfdestruct/content() + flick("intro_nuke",screen) + sleep(35) + flick("station_explode_fade_red", screen) + cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + special() + screen.icon_state = "summary_selfdes" + +/datum/cinematic/nuke_selfdestruct_miss + id = CINEMATIC_SELFDESTRUCT_MISS + +/datum/cinematic/nuke_selfdestruct_miss/content() + flick("intro_nuke",screen) + sleep(35) + cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + special() + screen.icon_state = "station_intact" + +/datum/cinematic/malf + id = CINEMATIC_MALF + +/datum/cinematic/malf/content() + flick("intro_malf",screen) + sleep(76) + flick("station_explode_fade_red",screen) + cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + special() + screen.icon_state = "summary_malf" + +/datum/cinematic/cult + id = CINEMATIC_CULT + +/datum/cinematic/cult/content() + screen.icon_state = null + flick("intro_cult",screen) + sleep(25) + cinematic_sound(sound('sound/magic/enter_blood.ogg')) + sleep(28) + cinematic_sound(sound('sound/machines/terminal_off.ogg')) + sleep(20) + flick("station_corrupted",screen) + cinematic_sound(sound('sound/effects/ghost.ogg')) + sleep(70) + special() + +/datum/cinematic/nuke_annihilation + id = CINEMATIC_ANNIHILATION + +/datum/cinematic/nuke_annihilation/content() + flick("intro_nuke",screen) + sleep(35) + flick("station_explode_fade_red",screen) + cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + special() + screen.icon_state = "summary_totala" + +/datum/cinematic/fake + id = CINEMATIC_NUKE_FAKE + cleanup_time = 100 + +/datum/cinematic/fake/content() + flick("intro_nuke",screen) + sleep(35) + cinematic_sound(sound('sound/items/bikehorn.ogg')) + flick("summary_selfdes",screen) //??? + special() + +/datum/cinematic/no_core + id = CINEMATIC_NUKE_NO_CORE + cleanup_time = 100 + +/datum/cinematic/no_core/content() + flick("intro_nuke",screen) + sleep(35) + flick("station_intact",screen) + cinematic_sound(sound('sound/ambience/signal.ogg')) + sleep(100) + +/datum/cinematic/nuke_far + id = CINEMATIC_NUKE_FAR + cleanup_time = 0 + +/datum/cinematic/nuke_far/content() + cinematic_sound(sound('sound/effects/explosion_distant.ogg')) + special() + +/* Intended usage. +Nuke.Explosion() + -> Cinematic(NUKE_BOOM,world) + -> ActualExplosion() + -> Mode.OnExplosion() + + +Narsie() + -> Cinematic(CULT,world) +*/ \ No newline at end of file diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index f65a64fb08..18a19fb153 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -19,7 +19,6 @@ var/probability = 0 var/false_report_weight = 0 //How often will this show up incorrectly in a centcom report? var/station_was_nuked = 0 //see nuclearbomb.dm and malfunction.dm - var/explosion_in_progress = 0 //sit back and relax var/round_ends_with_antag_death = 0 //flags the "one verse the station" antags as such var/list/datum/mind/modePlayer = new var/list/datum/mind/antag_candidates = list() // List of possible starting antags goes here @@ -562,3 +561,8 @@ /datum/game_mode/proc/generate_report() //Generates a small text blurb for the gamemode in centcom report return "Gamemode report for [name] not set. Contact a coder." + +//By default nuke just ends the round +/datum/game_mode/proc/OnNukeExplosion(off_station) + if(off_station < 2) + station_was_nuked = TRUE //Will end the round on next check. \ No newline at end of file diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index d48628ddd1..4c21f9688b 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -161,6 +161,12 @@ synd_mob.equipOutfit(/datum/outfit/syndicate/no_crystals) return 1 +/datum/game_mode/nuclear/OnNukeExplosion(off_station) + ..() + nukes_left-- + var/obj/docking_port/mobile/Shuttle = SSshuttle.getShuttle("syndicate") + syndies_didnt_escape = (Shuttle && (Shuttle.z == ZLEVEL_CENTCOM || Shuttle.z == ZLEVEL_TRANSIT)) ? 0 : 1 + nuke_off_station = off_station /datum/game_mode/nuclear/check_win() if (nukes_left == 0) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 7642801a6a..8870399f24 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -81,6 +81,20 @@ /obj/machinery/nuclearbomb/syndicate //ui_style = "syndicate" // actually the nuke op bomb is a stole nt bomb +/obj/machinery/nuclearbomb/syndicate/get_cinematic_type(off_station) + var/datum/game_mode/nuclear/NM = SSticker.mode + switch(off_station) + if(0) + if(istype(NM) && NM.syndies_didnt_escape) + return CINEMATIC_ANNIHILATION + else + return CINEMATIC_NUKE_WIN + if(1) + return CINEMATIC_NUKE_MISS + if(2) + return CINEMATIC_NUKE_FAR + return CINEMATIC_NUKE_FAR + /obj/machinery/nuclearbomb/syndicate/Initialize() . = ..() var/obj/machinery/nuclearbomb/existing = locate("syndienuke") in GLOB.nuke_list @@ -422,12 +436,12 @@ update_icon() sound_to_playing_players('sound/machines/alarm.ogg') if(SSticker && SSticker.mode) - SSticker.mode.explosion_in_progress = 1 + SSticker.roundend_check_paused = TRUE sleep(100) if(!core) - SSticker.station_explosion_cinematic(3,"no_core",src) - SSticker.mode.explosion_in_progress = 0 + Cinematic(CINEMATIC_NUKE_NO_CORE,world) + SSticker.roundend_check_paused = FALSE return GLOB.enter_allowed = 0 @@ -437,28 +451,37 @@ var/area/A = get_area(bomb_location) if(bomb_location && (bomb_location.z in GLOB.station_z_levels)) if(istype(A, /area/space)) - off_station = NUKE_MISS_STATION + off_station = NUKE_NEAR_MISS if((bomb_location.x < (128-NUKERANGE)) || (bomb_location.x > (128+NUKERANGE)) || (bomb_location.y < (128-NUKERANGE)) || (bomb_location.y > (128+NUKERANGE))) - off_station = NUKE_MISS_STATION + off_station = NUKE_NEAR_MISS else if((istype(A, /area/syndicate_mothership) || (istype(A, /area/shuttle/syndicate)) && bomb_location.z == ZLEVEL_CENTCOM)) off_station = NUKE_SYNDICATE_BASE else - off_station = NUKE_NEAR_MISS + off_station = NUKE_MISS_STATION - if(istype(SSticker.mode, /datum/game_mode/nuclear)) - var/obj/docking_port/mobile/Shuttle = SSshuttle.getShuttle("syndicate") - var/datum/game_mode/nuclear/NM = SSticker.mode - NM.syndies_didnt_escape = (Shuttle && (Shuttle.z == ZLEVEL_CENTCOM || Shuttle.z == ZLEVEL_TRANSIT)) ? 0 : 1 - NM.nuke_off_station = off_station + if(off_station < 2) + SSshuttle.registerHostileEnvironment(src) + SSshuttle.lockdown = TRUE - SSticker.station_explosion_cinematic(off_station,null,src) - if(SSticker.mode) - if(istype(SSticker.mode, /datum/game_mode/nuclear)) - var/datum/game_mode/nuclear/NM = SSticker.mode - NM.nukes_left -- - if(!SSticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is - SSticker.Reboot("Station destroyed by Nuclear Device.", "nuke - unhandled ending") + //Cinematic + SSticker.mode.OnNukeExplosion(off_station) + var/bombz = z + Cinematic(get_cinematic_type(off_station),world,CALLBACK(SSticker,/datum/controller/subsystem/ticker/proc/station_explosion_detonation,src)) + INVOKE_ASYNC(GLOBAL_PROC,.proc/KillEveryoneOnZLevel,bombz) + SSticker.roundend_check_paused = FALSE +/obj/machinery/nuclearbomb/proc/get_cinematic_type(off_station) + if(off_station < 2) + return CINEMATIC_SELFDESTRUCT + else + return CINEMATIC_SELFDESTRUCT_MISS + +/proc/KillEveryoneOnZLevel(z) + if(!z) + return + for(var/mob/M in GLOB.mob_list) + if(M.stat != DEAD && M.z == z) + M.gib() /* This is here to make the tiles around the station mininuke change when it's armed. diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index 186eee2195..58b60277c0 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /client/proc/cinematic(cinematic as anything in list("explosion",null)) set name = "cinematic" set category = "Fun" @@ -15,4 +16,17 @@ if(0) override = input(src,"mode = ?","Enter Parameter",null) as anything in list("blob","nuclear emergency","AI malfunction","no override") SSticker.station_explosion_cinematic(parameter,override) - return \ No newline at end of file + return +======= +/client/proc/cinematic() + set name = "cinematic" + set category = "Fun" + set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. + set hidden = 1 + if(!SSticker) + return + + var/datum/cinematic/choice = input(src,"Cinematic","Choose",null) as anything in subtypesof(/datum/cinematic) + if(choice) + Cinematic(initial(choice.id),world,null) +>>>>>>> 1304e83... Refactors cinematics. (#30888) diff --git a/code/modules/events/wizard/fakeexplosion.dm b/code/modules/events/wizard/fakeexplosion.dm index 3dee4a1f49..a0852afa5e 100644 --- a/code/modules/events/wizard/fakeexplosion.dm +++ b/code/modules/events/wizard/fakeexplosion.dm @@ -7,4 +7,5 @@ /datum/round_event/wizard/fake_explosion/start() sound_to_playing_players('sound/machines/alarm.ogg') - addtimer(CALLBACK(SSticker, /datum/controller/subsystem/ticker/.proc/station_explosion_cinematic, 1, "fake"), 100) //:o) \ No newline at end of file + sleep(100) + Cinematic(CINEMATIC_NUKE_FAKE,world) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index b49534808a..0218ce5726 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -27,7 +27,7 @@ del_on_death = 1 /mob/living/simple_animal/cockroach/death(gibbed) - if(SSticker.cinematic) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. + if(SSticker.mode && SSticker.mode.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. return ..() diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 381dcbaa75..b566d65f49 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -73,7 +73,6 @@ resolved = TRUE sound_to_playing_players('sound/machines/alarm.ogg') addtimer(CALLBACK(GLOBAL_PROC, .proc/cult_ending_helper), 120) - addtimer(CALLBACK(GLOBAL_PROC, .proc/ending_helper), 220) /obj/singularity/narsie/large/cult/Destroy() GLOB.cult_narsie = null @@ -83,7 +82,7 @@ SSticker.force_ending = 1 /proc/cult_ending_helper(var/no_explosion = 0) - SSticker.station_explosion_cinematic(no_explosion, "cult", null) + Cinematic(CINEMATIC_CULT,world,CALLBACK(GLOBAL_PROC,.ending_helper)) /obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob) diff --git a/tgstation.dme b/tgstation.dme index eb1bfd6c11..f1dbfb642b 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -28,7 +28,11 @@ #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\atom_hud.dm" #include "code\__DEFINES\callbacks.dm" +<<<<<<< HEAD #include "code\__DEFINES\citadel_defines.dm" +======= +#include "code\__DEFINES\cinematics.dm" +>>>>>>> 1304e83... Refactors cinematics. (#30888) #include "code\__DEFINES\clockcult.dm" #include "code\__DEFINES\combat.dm" #include "code\__DEFINES\components.dm" @@ -251,6 +255,7 @@ #include "code\datums\beam.dm" #include "code\datums\browser.dm" #include "code\datums\callback.dm" +#include "code\datums\cinematic.dm" #include "code\datums\datacore.dm" #include "code\datums\datum.dm" #include "code\datums\datumvars.dm" From f8c02be1b59ec5b91eb2e059f31489be84568bbd Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 26 Sep 2017 14:02:02 -0500 Subject: [PATCH 011/136] Update tgstation.dme --- tgstation.dme | 3 --- 1 file changed, 3 deletions(-) diff --git a/tgstation.dme b/tgstation.dme index f1dbfb642b..4a20f4ee7d 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -28,11 +28,8 @@ #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\atom_hud.dm" #include "code\__DEFINES\callbacks.dm" -<<<<<<< HEAD #include "code\__DEFINES\citadel_defines.dm" -======= #include "code\__DEFINES\cinematics.dm" ->>>>>>> 1304e83... Refactors cinematics. (#30888) #include "code\__DEFINES\clockcult.dm" #include "code\__DEFINES\combat.dm" #include "code\__DEFINES\components.dm" From ec3fc4441c063dcc1917f585dac1a2a40a77bf41 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 26 Sep 2017 14:02:49 -0500 Subject: [PATCH 012/136] Update cinematic.dm --- code/modules/admin/verbs/cinematic.dm | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index 58b60277c0..7093ee23ea 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -1,23 +1,3 @@ -<<<<<<< HEAD -/client/proc/cinematic(cinematic as anything in list("explosion",null)) - set name = "cinematic" - set category = "Fun" - set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. - set hidden = 1 - if(!SSticker) - return - switch(cinematic) - if("explosion") - var/parameter = input(src,"station_missed = ?","Enter Parameter",0) as num - var/override - switch(parameter) - if(1) - override = input(src,"mode = ?","Enter Parameter",null) as anything in list("nuclear emergency","gang war","fake","no override") - if(0) - override = input(src,"mode = ?","Enter Parameter",null) as anything in list("blob","nuclear emergency","AI malfunction","no override") - SSticker.station_explosion_cinematic(parameter,override) - return -======= /client/proc/cinematic() set name = "cinematic" set category = "Fun" @@ -28,5 +8,4 @@ var/datum/cinematic/choice = input(src,"Cinematic","Choose",null) as anything in subtypesof(/datum/cinematic) if(choice) - Cinematic(initial(choice.id),world,null) ->>>>>>> 1304e83... Refactors cinematics. (#30888) + Cinematic(initial(choice.id),world,null) From af7dafd383051f8b301da8742b5230e203c704cd Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 24 Sep 2017 12:53:41 -0400 Subject: [PATCH 013/136] Some names -> string --- code/datums/martial/krav_maga.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 6ce082bd2a..84f0f00e45 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -11,7 +11,7 @@ /datum/action/neck_chop/Trigger() if(owner.incapacitated()) - to_chat(owner, "You can't use Krav Maga while you're incapacitated.") + to_chat(owner, "You can't use [name] while you're incapacitated.") return var/mob/living/carbon/human/H = owner if (H.mind.martial_art.streak == "neck_chop") @@ -28,7 +28,7 @@ /datum/action/leg_sweep/Trigger() if(owner.incapacitated()) - to_chat(owner, "You can't use Krav Maga while you're incapacitated.") + to_chat(owner, "You can't use [name] while you're incapacitated.") return var/mob/living/carbon/human/H = owner if (H.mind.martial_art.streak == "leg_sweep") @@ -45,7 +45,7 @@ /datum/action/lung_punch/Trigger() if(owner.incapacitated()) - to_chat(owner, "You can't use Krav Maga while you're incapacitated.") + to_chat(owner, "You can't use [name] while you're incapacitated.") return var/mob/living/carbon/human/H = owner if (H.mind.martial_art.streak == "quick_choke") @@ -57,14 +57,14 @@ /datum/martial_art/krav_maga/teach(mob/living/carbon/human/H,make_temporary=0) if(..()) - to_chat(H, "You know the arts of Krav Maga!") + to_chat(H, "You know the arts of [name]!") to_chat(H, "Place your cursor over a move at the top of the screen to see what it does.") neckchop.Grant(H) legsweep.Grant(H) lungpunch.Grant(H) /datum/martial_art/krav_maga/on_remove(mob/living/carbon/human/H) - to_chat(H, "You suddenly forget the arts of Krav Maga...") + to_chat(H, "You suddenly forget the arts of [name]...") neckchop.Remove(H) legsweep.Remove(H) lungpunch.Remove(H) @@ -140,7 +140,7 @@ playsound(get_turf(D), 'sound/effects/hit_punch.ogg', 50, 1, -1) D.visible_message("[A] [picked_hit_type] [D]!", \ "[A] [picked_hit_type] you!") - add_logs(A, D, "[picked_hit_type] with Krav Maga") + add_logs(A, D, "[picked_hit_type] with [name]") return 1 /datum/martial_art/krav_maga/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) From 10bf80139c6dee5ab0922e9c1b3650da98b26c70 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Wed, 27 Sep 2017 00:52:03 +0300 Subject: [PATCH 015/136] Fixes MMI to AI law transfer (#31017) * Fixes MMI to AI law transfer * Fixes issue with preloaded laws on AI core --- .../clock_cult/clock_items/soul_vessel.dm | 1 + code/game/objects/structures/ai_core.dm | 15 ++++++++++----- code/modules/mob/living/brain/MMI.dm | 6 ++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_items/soul_vessel.dm b/code/game/gamemodes/clock_cult/clock_items/soul_vessel.dm index 0ee6d45f7d..ca80d6f082 100644 --- a/code/game/gamemodes/clock_cult/clock_items/soul_vessel.dm +++ b/code/game/gamemodes/clock_cult/clock_items/soul_vessel.dm @@ -23,6 +23,7 @@ autoping = FALSE resistance_flags = FIRE_PROOF | ACID_PROOF force_replace_ai_name = TRUE + overrides_aicore_laws = TRUE /obj/item/device/mmi/posibrain/soul_vessel/Initialize() . = ..() diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 326b945fd5..0a7b9eb312 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -45,14 +45,13 @@ switch(state) if(EMPTY_CORE) if(istype(P, /obj/item/circuitboard/aicore)) - if(!user.drop_item()) + if(!user.transferItemToLoc(P, src)) return playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) to_chat(user, "You place the circuit board inside the frame.") update_icon() state = CIRCUIT_CORE circuit = P - P.forceMove(src) return if(CIRCUIT_CORE) if(istype(P, /obj/item/screwdriver)) @@ -143,10 +142,9 @@ to_chat(user, "This [M.name] is mindless!") return - if(!user.drop_item()) + if(!user.transferItemToLoc(M,src)) return - M.forceMove(src) brain = M to_chat(user, "You add [M.name] to the frame.") update_icon() @@ -176,7 +174,14 @@ SSticker.mode.remove_antag_for_borging(brain.brainmob.mind) if(!istype(brain.laws, /datum/ai_laws/ratvar)) remove_servant_of_ratvar(brain.brainmob, TRUE) - var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(loc, laws, brain.brainmob) + + var/mob/living/silicon/ai/A = null + + if (brain.overrides_aicore_laws) + A = new /mob/living/silicon/ai(loc, brain.laws, brain.brainmob) + else + A = new /mob/living/silicon/ai(loc, laws, brain.brainmob) + if(brain.force_replace_ai_name) A.fully_replace_character_name(A.name, brain.replacement_ai_name()) SSblackbox.inc("cyborg_ais_created",1) diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 8e919491bb..65a3fd253e 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -13,6 +13,7 @@ var/obj/item/organ/brain/brain = null //The actual brain var/datum/ai_laws/laws = new() var/force_replace_ai_name = FALSE + var/overrides_aicore_laws = FALSE // Whether the laws on the MMI, if any, override possible pre-existing laws loaded on the AI core. /obj/item/device/mmi/update_icon() if(brain) @@ -203,8 +204,9 @@ name = "Syndicate Man-Machine Interface" desc = "Syndicate's own brand of MMI. It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs and AIs created with it." origin_tech = "biotech=4;programming=4;syndicate=2" + overrides_aicore_laws = TRUE -/obj/item/device/mmi/syndie/New() - ..() +/obj/item/device/mmi/syndie/Initialize() + . = ..() laws = new /datum/ai_laws/syndicate_override() radio.on = 0 From 0aea66649ed6bafaf8054ccb7b12d6ce77b83e08 Mon Sep 17 00:00:00 2001 From: Armhulen Date: Tue, 26 Sep 2017 22:45:26 -0700 Subject: [PATCH 017/136] whoops we'll get right on that (#31020) --- code/modules/mob/living/simple_animal/hostile/giant_spider.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 7e8bd6d2c8..6ae5fe0622 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -117,6 +117,7 @@ move_to_delay = 4 poison_type = "venom" //all in venom, glass cannon. you bite 5 times and they are DEFINITELY dead, but 40 health and you are extremely obvious. Ambush, maybe? speed = 1 + gold_core_spawnable = 0 //tarantulas are really tanky, regenerating (maybe), hulky monster but are also extremely slow, so. /mob/living/simple_animal/hostile/poison/giant_spider/tarantula @@ -134,6 +135,7 @@ speed = 7 status_flags = NONE mob_size = MOB_SIZE_LARGE + gold_core_spawnable = 0 /mob/living/simple_animal/hostile/poison/giant_spider/tarantula/movement_delay() var/turf/T = get_turf(src) @@ -153,6 +155,7 @@ maxHealth = 40 health = 40 var/datum/action/innate/spider/comm/letmetalkpls + gold_core_spawnable = 0 /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize() . = ..() From 7b3fa9bdb1277ae27da0d6562cad5177c3850b70 Mon Sep 17 00:00:00 2001 From: GLACoding Date: Wed, 27 Sep 2017 10:13:46 +0100 Subject: [PATCH 019/136] Adds installing cells as part of mech construction and fixes some mech construction bugs. --- .../helper_datums/construction_datum.dm | 114 +++ code/game/mecha/combat/combat.dm | 31 + code/game/mecha/mecha.dm | 13 + code/game/mecha/mecha_construction_paths.dm | 797 +++++++++++------- icons/mecha/mech_construction.dmi | Bin 17212 -> 17377 bytes 5 files changed, 647 insertions(+), 308 deletions(-) diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index e4017e9ece..a0885ae373 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD #define FORWARD -1 #define BACKWARD 1 @@ -101,3 +102,116 @@ /datum/construction/reversible/custom_action(index, diff, used_atom, user) return 1 +======= +#define FORWARD -1 +#define BACKWARD 1 + +/datum/construction + var/list/steps + var/atom/holder + var/result + var/list/steps_desc + +/datum/construction/New(atom) + ..() + holder = atom + if(!holder) //don't want this without a holder + qdel(src) + set_desc(steps.len) + return + +/datum/construction/proc/next_step() + steps.len-- + if(!steps.len) + spawn_result() + else + set_desc(steps.len) + return + +/datum/construction/proc/action(atom/used_atom,mob/user) + return + +/datum/construction/proc/check_step(atom/used_atom,mob/user) //check last step only + var/valid_step = is_right_key(used_atom) + if(valid_step) + if(custom_action(valid_step, used_atom, user)) + next_step() + return 1 + return 0 + +/datum/construction/proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type. + var/list/L = steps[steps.len] + if(istype(used_atom, L["key"])) + return steps.len + return 0 + +/datum/construction/proc/custom_action(step, used_atom, user) + return 1 + +/datum/construction/proc/check_all_steps(atom/used_atom,mob/user) //check all steps, remove matching one. + for(var/i=1;i<=steps.len;i++) + var/list/L = steps[i]; + if(istype(used_atom, L["key"])) + if(custom_action(i, used_atom, user)) + steps[i]=null;//stupid byond list from list removal... + listclearnulls(steps); + if(!steps.len) + spawn_result() + return 1 + return 0 + + +/datum/construction/proc/spawn_result() + if(result) + new result(get_turf(holder)) + qdel(holder) + return + +/datum/construction/proc/spawn_mecha_result() + if(result) + var/obj/mecha/m = new result(get_turf(holder)) + var/obj/item/oldcell = locate (/obj/item/stock_parts/cell) in m + QDEL_NULL(oldcell) + m.CheckParts(holder.contents) + QDEL_NULL(holder) + +/datum/construction/proc/set_desc(index as num) + var/list/step = steps[index] + holder.desc = step["desc"] + return + +/datum/construction/reversible + var/index + +/datum/construction/reversible/New(atom) + ..() + index = steps.len + return + +/datum/construction/reversible/proc/update_index(diff as num) + index+=diff + if(index==0) + spawn_result() + else + set_desc(index) + return + +/datum/construction/reversible/is_right_key(atom/used_atom) // returns index step + var/list/L = steps[index] + if(istype(used_atom, L["key"])) + return FORWARD //to the first step -> forward + else if(L["backkey"] && istype(used_atom, L["backkey"])) + return BACKWARD //to the last step -> backwards + return 0 + +/datum/construction/reversible/check_step(atom/used_atom,mob/user) + var/diff = is_right_key(used_atom) + if(diff) + if(custom_action(index, diff, used_atom, user)) + update_index(diff) + return 1 + return 0 + +/datum/construction/reversible/custom_action(index, diff, used_atom, user) + return 1 +>>>>>>> e632dee... Adds installing cells as part of mech construction and fixes some mech construction bugs. (#30942) diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 4e8e42e10f..a8977dd7c1 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/mecha/combat force = 30 internal_damage_threshold = 50 @@ -35,3 +36,33 @@ ..() +======= +/obj/mecha/combat + force = 30 + internal_damage_threshold = 50 + armor = list(melee = 30, bullet = 30, laser = 15, energy = 20, bomb = 20, bio = 0, rad = 0, fire = 100, acid = 100) + +/obj/mecha/combat/moved_inside(mob/living/carbon/human/H) + if(..()) + if(H.client && H.client.mouse_pointer_icon == initial(H.client.mouse_pointer_icon)) + H.client.mouse_pointer_icon = 'icons/mecha/mecha_mouse.dmi' + return 1 + else + return 0 + +/obj/mecha/combat/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc,mob/user) + if(..()) + if(occupant.client && occupant.client.mouse_pointer_icon == initial(occupant.client.mouse_pointer_icon)) + occupant.client.mouse_pointer_icon = 'icons/mecha/mecha_mouse.dmi' + return 1 + else + return 0 + + +/obj/mecha/combat/go_out() + if(occupant && occupant.client && occupant.client.mouse_pointer_icon == 'icons/mecha/mecha_mouse.dmi') + occupant.client.mouse_pointer_icon = initial(occupant.client.mouse_pointer_icon) + ..() + + +>>>>>>> e632dee... Adds installing cells as part of mech construction and fixes some mech construction bugs. (#30942) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index ed2a1ff82a..9b27e1e7c6 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -202,6 +202,19 @@ GLOB.mechas_list -= src //global mech list return ..() +/obj/mecha/CheckParts(list/parts_list) + ..() + var/obj/item/C = locate(/obj/item/stock_parts/cell) in contents + cell = C + var/obj/item/stock_parts/scanning_module/SM = locate() in contents + var/obj/item/stock_parts/capacitor/CP = locate() in contents + if(SM) + step_energy_drain = 20 - (5 * SM.rating) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best + qdel(SM) + if(CP) + armor["energy"] += (CP.rating * 10) //Each level of capacitor protects the mech against emp by 10% + qdel(CP) + //////////////////////// ////// Helpers ///////// //////////////////////// diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 24c1c513c3..27aeea4c09 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -102,8 +102,11 @@ /datum/construction/reversible/mecha/ripley - result = "/obj/mecha/working/ripley" + result = /obj/mecha/working/ripley steps = list( + //0, dummy step used to stop the steps from finishing and spawn_result() being called automatically. + list("desc"="You shouldn't be able to see this."), + //1 list("key"=/obj/item/weldingtool, "backkey"=/obj/item/wrench, @@ -127,38 +130,47 @@ //6 list("key"=/obj/item/stack/sheet/metal, "backkey"=/obj/item/screwdriver, - "desc"="Peripherals control module is secured."), + "desc"="The power cell is secured."), //7 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Peripherals control module is installed."), + "desc"="The power cell is installed."), //8 - list("key"=/obj/item/circuitboard/mecha/ripley/peripherals, + list("key"=/obj/item/stock_parts/cell, "backkey"=/obj/item/screwdriver, - "desc"="Central control module is secured."), + "desc"="Peripherals control module is secured."), //9 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Central control module is installed."), + "desc"="Peripherals control module is installed."), //10 + list("key"=/obj/item/circuitboard/mecha/ripley/peripherals, + "backkey"=/obj/item/screwdriver, + "desc"="Central control module is secured."), + //11 + list("key"=/obj/item/screwdriver, + "backkey"=/obj/item/crowbar, + "desc"="Central control module is installed."), + //12 list("key"=/obj/item/circuitboard/mecha/ripley/main, "backkey"=/obj/item/screwdriver, "desc"="The wiring is adjusted."), - //11 + //13 list("key"=/obj/item/wirecutters, "backkey"=/obj/item/screwdriver, "desc"="The wiring is added."), - //12 + //14 list("key"=/obj/item/stack/cable_coil, "backkey"=/obj/item/screwdriver, "desc"="The hydraulic systems are active."), - //13 + //15 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/wrench, "desc"="The hydraulic systems are connected."), - //14 + //16 list("key"=/obj/item/wrench, "desc"="The hydraulic systems are disconnected.") + ) /datum/construction/reversible/mecha/ripley/action(atom/used_atom,mob/user) @@ -170,24 +182,24 @@ //TODO: better messages. switch(index) - if(14) + if(17) user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") holder.icon_state = "ripley1" - if(13) + if(16) if(diff==FORWARD) user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") holder.icon_state = "ripley2" else user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") holder.icon_state = "ripley0" - if(12) + if(15) if(diff==FORWARD) user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") holder.icon_state = "ripley3" else user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") holder.icon_state = "ripley1" - if(11) + if(14) if(diff==FORWARD) user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") holder.icon_state = "ripley4" @@ -196,7 +208,7 @@ var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) coil.amount = 4 holder.icon_state = "ripley2" - if(10) + if(13) if(diff==FORWARD) user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") qdel(used_atom) @@ -204,7 +216,7 @@ else user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") holder.icon_state = "ripley3" - if(9) + if(12) if(diff==FORWARD) user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") holder.icon_state = "ripley6" @@ -212,7 +224,7 @@ user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") new /obj/item/circuitboard/mecha/ripley/main(get_turf(holder)) holder.icon_state = "ripley4" - if(8) + if(11) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) @@ -220,7 +232,7 @@ else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") holder.icon_state = "ripley5" - if(7) + if(10) if(diff==FORWARD) user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") holder.icon_state = "ripley8" @@ -228,54 +240,73 @@ user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") new /obj/item/circuitboard/mecha/ripley/peripherals(get_turf(holder)) holder.icon_state = "ripley6" - if(6) + if(9) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + user.visible_message("[user] installs the power cell into the [holder].", "You install the power cell into the [holder].") + var/obj/item/I = used_atom + user.transferItemToLoc(I, holder, TRUE) holder.icon_state = "ripley9" else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") holder.icon_state = "ripley7" - if(5) + if(8) + if(diff==FORWARD) + user.visible_message("[user] secures the power cell.", "You secure the power cell.") + holder.icon_state = "ripley10" + else + user.visible_message("[user] prys the power cell from [holder].", "You pry the power cell from [holder].") + var/obj/item/I = locate(/obj/item/stock_parts/cell) in holder + I.forceMove(holder.drop_location()) + holder.icon_state = "ripley8" + if(7) + if(diff==FORWARD) + user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + holder.icon_state = "ripley11" + else + user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + holder.icon_state = "ripley9" + if(6) if(diff==FORWARD) user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") - holder.icon_state = "ripley10" + holder.icon_state = "ripley12" else user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 - holder.icon_state = "ripley8" - if(4) + holder.icon_state = "ripley10" + if(5) if(diff==FORWARD) user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") - holder.icon_state = "ripley11" + holder.icon_state = "ripley13" else user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - holder.icon_state = "ripley9" - if(3) + holder.icon_state = "ripley11" + if(4) if(diff==FORWARD) user.visible_message("[user] installs the external reinforced armor layer to the [holder].", "You install the external reinforced armor layer to the [holder].") - holder.icon_state = "ripley12" + holder.icon_state = "ripley14" else user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") - holder.icon_state = "ripley10" - if(2) + holder.icon_state = "ripley12" + if(3) if(diff==FORWARD) user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") - holder.icon_state = "ripley13" + holder.icon_state = "ripley15" else user.visible_message("[user] pries external armor layer from the [holder].", "You pry external armor layer from the [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 - holder.icon_state = "ripley11" - if(1) + holder.icon_state = "ripley13" + if(2) if(diff==FORWARD) user.visible_message("[user] welds the external armor layer to the [holder].", "You weld the external armor layer to the [holder].") + spawn_mecha_result() else user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") - holder.icon_state = "ripley12" + holder.icon_state = "ripley14" return 1 -/datum/construction/reversible/mecha/ripley/spawn_result() +/datum/construction/reversible/mecha/ripley/spawn_mecha_result() ..() SSblackbox.inc("mecha_ripley_created",1) return @@ -311,8 +342,11 @@ /datum/construction/reversible/mecha/gygax - result = "/obj/mecha/combat/gygax" + result = /obj/mecha/combat/gygax steps = list( + //0, dummy step used to stop the steps from finishing and spawn_result() being called automatically. + list("desc"="You shouldn't be able to see this."), + //1 list("key"=/obj/item/weldingtool, "backkey"=/obj/item/wrench, @@ -336,60 +370,68 @@ //6 list("key"=/obj/item/stack/sheet/metal, "backkey"=/obj/item/screwdriver, - "desc"="Advanced capacitor is secured."), + "desc"="The power cell is secured."), //7 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Advanced capacitor is installed."), + "desc"="The power cell is installed."), //8 - list("key"=/obj/item/stock_parts/capacitor, + list("key"=/obj/item/stock_parts/cell, "backkey"=/obj/item/screwdriver, - "desc"="Advanced scanner module is secured."), + "desc"="Advanced capacitor is secured."), //9 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Advanced scanner module is installed."), + "desc"="Advanced capacitor is installed."), //10 - list("key"=/obj/item/stock_parts/scanning_module, + list("key"=/obj/item/stock_parts/capacitor, "backkey"=/obj/item/screwdriver, - "desc"="Weapon control module is secured."), + "desc"="Advanced scanner module is secured."), //11 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Weapon control module is installed."), + "desc"="Advanced scanner module is installed."), //12 - list("key"=/obj/item/circuitboard/mecha/gygax/targeting, + list("key"=/obj/item/stock_parts/scanning_module, "backkey"=/obj/item/screwdriver, - "desc"="Peripherals control module is secured."), + "desc"="Weapon control module is secured."), //13 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Peripherals control module is installed."), + "desc"="Weapon control module is installed."), //14 - list("key"=/obj/item/circuitboard/mecha/gygax/peripherals, + list("key"=/obj/item/circuitboard/mecha/gygax/targeting, "backkey"=/obj/item/screwdriver, - "desc"="Central control module is secured."), + "desc"="Peripherals control module is secured."), //15 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Central control module is installed."), + "desc"="Peripherals control module is installed."), //16 + list("key"=/obj/item/circuitboard/mecha/gygax/peripherals, + "backkey"=/obj/item/screwdriver, + "desc"="Central control module is secured."), + //17 + list("key"=/obj/item/screwdriver, + "backkey"=/obj/item/crowbar, + "desc"="Central control module is installed."), + //18 list("key"=/obj/item/circuitboard/mecha/gygax/main, "backkey"=/obj/item/screwdriver, "desc"="The wiring is adjusted."), - //17 + //19 list("key"=/obj/item/wirecutters, "backkey"=/obj/item/screwdriver, "desc"="The wiring is added."), - //18 + //20 list("key"=/obj/item/stack/cable_coil, "backkey"=/obj/item/screwdriver, "desc"="The hydraulic systems are active."), - //19 + //21 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/wrench, "desc"="The hydraulic systems are connected."), - //20 + //22 list("key"=/obj/item/wrench, "desc"="The hydraulic systems are disconnected.") ) @@ -403,24 +445,24 @@ //TODO: better messages. switch(index) - if(20) + if(23) user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") holder.icon_state = "gygax1" - if(19) + if(22) if(diff==FORWARD) user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") holder.icon_state = "gygax2" else user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") holder.icon_state = "gygax0" - if(18) + if(21) if(diff==FORWARD) user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") holder.icon_state = "gygax3" else user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") holder.icon_state = "gygax1" - if(17) + if(20) if(diff==FORWARD) user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") holder.icon_state = "gygax4" @@ -429,7 +471,7 @@ var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) coil.amount = 4 holder.icon_state = "gygax2" - if(16) + if(19) if(diff==FORWARD) user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") qdel(used_atom) @@ -437,7 +479,7 @@ else user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") holder.icon_state = "gygax3" - if(15) + if(18) if(diff==FORWARD) user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") holder.icon_state = "gygax6" @@ -445,7 +487,7 @@ user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") new /obj/item/circuitboard/mecha/gygax/main(get_turf(holder)) holder.icon_state = "gygax4" - if(14) + if(17) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) @@ -453,7 +495,7 @@ else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") holder.icon_state = "gygax5" - if(13) + if(16) if(diff==FORWARD) user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") holder.icon_state = "gygax8" @@ -461,7 +503,7 @@ user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") new /obj/item/circuitboard/mecha/gygax/peripherals(get_turf(holder)) holder.icon_state = "gygax6" - if(12) + if(15) if(diff==FORWARD) user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].") qdel(used_atom) @@ -469,7 +511,7 @@ else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") holder.icon_state = "gygax7" - if(11) + if(14) if(diff==FORWARD) user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") holder.icon_state = "gygax10" @@ -477,7 +519,7 @@ user.visible_message("[user] removes the weapon control module from the [holder].", "You remove the weapon control module from the [holder].") new /obj/item/circuitboard/mecha/gygax/targeting(get_turf(holder)) holder.icon_state = "gygax8" - if(10) + if(13) if(diff==FORWARD) user.visible_message("[user] installs scanner module to the [holder].", "You install scanner module to the [holder].") var/obj/item/I = used_atom @@ -486,7 +528,7 @@ else user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") holder.icon_state = "gygax9" - if(9) + if(12) if(diff==FORWARD) user.visible_message("[user] secures the advanced scanner module.", "You secure the scanner module.") holder.icon_state = "gygax12" @@ -495,7 +537,7 @@ var/obj/item/I = locate(/obj/item/stock_parts/scanning_module) in holder I.loc = get_turf(holder) holder.icon_state = "gygax10" - if(8) + if(11) if(diff==FORWARD) user.visible_message("[user] installs capacitor to the [holder].", "You install capacitor to the [holder].") var/obj/item/I = used_atom @@ -504,7 +546,7 @@ else user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") holder.icon_state = "gygax11" - if(7) + if(10) if(diff==FORWARD) user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") holder.icon_state = "gygax14" @@ -513,57 +555,74 @@ var/obj/item/I = locate(/obj/item/stock_parts/capacitor) in holder I.loc = get_turf(holder) holder.icon_state = "gygax12" - if(6) + if(9) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + user.visible_message("[user] installs the power cell into the [holder].", "You install the power cell into the [holder].") + var/obj/item/I = used_atom + user.transferItemToLoc(I, holder, TRUE) holder.icon_state = "gygax15" else user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") holder.icon_state = "gygax13" - if(5) + if(8) + if(diff==FORWARD) + user.visible_message("[user] secures the power cell.", "You secure the power cell.") + holder.icon_state = "gygax16" + else + user.visible_message("[user] prys the power cell from [holder].", "You pry the power cell from [holder].") + var/obj/item/I = locate(/obj/item/stock_parts/cell) in holder + I.forceMove(holder.drop_location()) + holder.icon_state = "gygax14" + if(7) + if(diff==FORWARD) + user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + holder.icon_state = "gygax17" + else + user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + holder.icon_state = "gygax15" + if(6) if(diff==FORWARD) user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") - holder.icon_state = "gygax16" + holder.icon_state = "gygax18" else user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 - holder.icon_state = "gygax14" - if(4) + holder.icon_state = "gygax16" + if(5) if(diff==FORWARD) user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") - holder.icon_state = "gygax17" + holder.icon_state = "gygax19" else user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - holder.icon_state = "gygax15" - if(3) + holder.icon_state = "gygax17" + if(4) if(diff==FORWARD) user.visible_message("[user] installs Gygax Armor Plates to the [holder].", "You install Gygax Armor Plates to the [holder].") qdel(used_atom) - holder.icon_state = "gygax18" + holder.icon_state = "gygax20" else user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") - holder.icon_state = "gygax16" - if(2) + holder.icon_state = "gygax18" + if(3) if(diff==FORWARD) user.visible_message("[user] secures Gygax Armor Plates.", "You secure Gygax Armor Plates.") - holder.icon_state = "gygax19" + holder.icon_state = "gygax21" else user.visible_message("[user] pries Gygax Armor Plates from the [holder].", "You pry Gygax Armor Plates from the [holder].") new /obj/item/mecha_parts/part/gygax_armor(get_turf(holder)) - holder.icon_state = "gygax17" - if(1) + holder.icon_state = "gygax19" + if(2) if(diff==FORWARD) user.visible_message("[user] welds Gygax Armor Plates to the [holder].", "You weld Gygax Armor Plates to the [holder].") + spawn_mecha_result() else user.visible_message("[user] unfastens Gygax Armor Plates.", "You unfasten Gygax Armor Plates.") - holder.icon_state = "gygax18" + holder.icon_state = "gygax20" return 1 -/datum/construction/reversible/mecha/gygax/spawn_result() - var/obj/mecha/combat/gygax/M = new result(get_turf(holder)) - M.CheckParts(holder.contents) - qdel(holder) +/datum/construction/reversible/mecha/gygax/spawn_mecha_result() + ..() SSblackbox.inc("mecha_gygax_created",1) return @@ -596,13 +655,16 @@ /datum/construction/reversible/mecha/firefighter - result = "/obj/mecha/working/ripley/firefighter" + result = /obj/mecha/working/ripley/firefighter steps = list( - //1 - list("key"=/obj/item/weldingtool, + //0, dummy step used to stop the steps from finishing and spawn_result() being called automatically. + list("desc"="You shouldn't be able to see this."), + + //1 + list("key"=/obj/item/weldingtool, "backkey"=/obj/item/wrench, "desc"="External armor is wrenched."), - //2 + //2 list("key"=/obj/item/wrench, "backkey"=/obj/item/crowbar, "desc"="External armor is installed."), @@ -622,40 +684,47 @@ list("key"=/obj/item/wrench, "backkey"=/obj/item/crowbar, "desc"="Internal armor is installed."), - //7 list("key"=/obj/item/stack/sheet/plasteel, "backkey"=/obj/item/screwdriver, - "desc"="Peripherals control module is secured."), + "desc"="The power cell is secured."), //8 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Peripherals control module is installed."), + "desc"="The power cell is installed."), //9 - list("key"=/obj/item/circuitboard/mecha/ripley/peripherals, + list("key"=/obj/item/stock_parts/cell, "backkey"=/obj/item/screwdriver, - "desc"="Central control module is secured."), + "desc"="Peripherals control module is secured."), //10 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Central control module is installed."), + "desc"="Peripherals control module is installed."), //11 + list("key"=/obj/item/circuitboard/mecha/ripley/peripherals, + "backkey"=/obj/item/screwdriver, + "desc"="Central control module is secured."), + //12 + list("key"=/obj/item/screwdriver, + "backkey"=/obj/item/crowbar, + "desc"="Central control module is installed."), + //13 list("key"=/obj/item/circuitboard/mecha/ripley/main, "backkey"=/obj/item/screwdriver, "desc"="The wiring is adjusted."), - //12 + //14 list("key"=/obj/item/wirecutters, "backkey"=/obj/item/screwdriver, "desc"="The wiring is added."), - //13 + //15 list("key"=/obj/item/stack/cable_coil, "backkey"=/obj/item/screwdriver, "desc"="The hydraulic systems are active."), - //14 + //16 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/wrench, "desc"="The hydraulic systems are connected."), - //15 + //17 list("key"=/obj/item/wrench, "desc"="The hydraulic systems are disconnected.") ) @@ -669,24 +738,24 @@ //TODO: better messages. switch(index) - if(15) + if(18) user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") holder.icon_state = "fireripley1" - if(14) + if(17) if(diff==FORWARD) user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") holder.icon_state = "fireripley2" else user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") holder.icon_state = "fireripley0" - if(13) + if(16) if(diff==FORWARD) user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") holder.icon_state = "fireripley3" else user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") holder.icon_state = "fireripley1" - if(12) + if(15) if(diff==FORWARD) user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") holder.icon_state = "fireripley4" @@ -695,7 +764,7 @@ var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) coil.amount = 4 holder.icon_state = "fireripley2" - if(11) + if(14) if(diff==FORWARD) user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") qdel(used_atom) @@ -703,7 +772,7 @@ else user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") holder.icon_state = "fireripley3" - if(10) + if(13) if(diff==FORWARD) user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") holder.icon_state = "fireripley6" @@ -711,7 +780,7 @@ user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") new /obj/item/circuitboard/mecha/ripley/main(get_turf(holder)) holder.icon_state = "fireripley4" - if(9) + if(12) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) @@ -719,7 +788,7 @@ else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") holder.icon_state = "fireripley5" - if(8) + if(11) if(diff==FORWARD) user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") holder.icon_state = "fireripley8" @@ -727,64 +796,82 @@ user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") new /obj/item/circuitboard/mecha/ripley/peripherals(get_turf(holder)) holder.icon_state = "fireripley6" - if(7) + if(10) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + user.visible_message("[user] installs the power cell into the [holder].", "You install the power cell into the [holder].") + var/obj/item/I = used_atom + user.transferItemToLoc(I, holder, TRUE) holder.icon_state = "fireripley9" else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") holder.icon_state = "fireripley7" - - if(6) + if(9) + if(diff==FORWARD) + user.visible_message("[user] secures the power cell.", "You secure the power cell.") + holder.icon_state = "fireripley10" + else + user.visible_message("[user] prys the power cell from [holder].", "You pry the power cell from [holder].") + var/obj/item/I = locate(/obj/item/stock_parts/cell) in holder + I.forceMove(holder.drop_location()) + holder.icon_state = "fireripley8" + if(8) + if(diff==FORWARD) + user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + holder.icon_state = "fireripley11" + else + user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + holder.icon_state = "fireripley9" + if(7) if(diff==FORWARD) user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") - holder.icon_state = "fireripley10" + holder.icon_state = "fireripley12" else user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 - holder.icon_state = "fireripley8" - if(5) + holder.icon_state = "fireripley10" + if(6) if(diff==FORWARD) user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") - holder.icon_state = "fireripley11" + holder.icon_state = "fireripley13" else user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - holder.icon_state = "fireripley9" - if(4) + holder.icon_state = "fireripley11" + if(5) if(diff==FORWARD) user.visible_message("[user] starts to install the external armor layer to the [holder].", "You install the external armor layer to the [holder].") - holder.icon_state = "fireripley12" + holder.icon_state = "fireripley14" else user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") - holder.icon_state = "fireripley10" - if(3) + holder.icon_state = "fireripley12" + if(4) if(diff==FORWARD) user.visible_message("[user] installs the external reinforced armor layer to the [holder].", "You install the external reinforced armor layer to the [holder].") - holder.icon_state = "fireripley13" + holder.icon_state = "fireripley15" else user.visible_message("[user] removes the external armor from the [holder].", "You remove the external armor from the [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 - holder.icon_state = "fireripley11" - if(2) + holder.icon_state = "fireripley13" + if(3) if(diff==FORWARD) user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") - holder.icon_state = "fireripley14" + holder.icon_state = "fireripley16" else user.visible_message("[user] pries external armor layer from the [holder].", "You pry external armor layer from the [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 - holder.icon_state = "fireripley12" - if(1) + holder.icon_state = "fireripley14" + if(2) if(diff==FORWARD) user.visible_message("[user] welds the external armor layer to the [holder].", "You weld the external armor layer to the [holder].") + spawn_mecha_result() else user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") - holder.icon_state = "fireripley13" + holder.icon_state = "fireripley15" return 1 -/datum/construction/reversible/mecha/firefighter/spawn_result() +/datum/construction/reversible/mecha/firefighter/spawn_mecha_result() ..() SSblackbox.inc("mecha_firefighter_created",1) return @@ -818,19 +905,23 @@ /datum/construction/mecha/honker - result = "/obj/mecha/combat/honker" - steps = list(list("key"=/obj/item/bikehorn), //1 + result = /obj/mecha/combat/honker + steps = list( + list("desc"="You shouldn't be able to see this."), //0, note steps in the construction path are +1 to the ones here + list("key"=/obj/item/bikehorn), //1 list("key"=/obj/item/clothing/shoes/clown_shoes), //2 list("key"=/obj/item/bikehorn), //3 list("key"=/obj/item/clothing/mask/gas/clown_hat), //4 list("key"=/obj/item/bikehorn), //5 - list("key"=/obj/item/circuitboard/mecha/honker/targeting), //6 + list("key"=/obj/item/stock_parts/cell), //6 list("key"=/obj/item/bikehorn), //7 - list("key"=/obj/item/circuitboard/mecha/honker/peripherals), //8 + list("key"=/obj/item/circuitboard/mecha/honker/targeting), //8 list("key"=/obj/item/bikehorn), //9 - list("key"=/obj/item/circuitboard/mecha/honker/main), //10 + list("key"=/obj/item/circuitboard/mecha/honker/peripherals), //10 list("key"=/obj/item/bikehorn), //11 - ) + list("key"=/obj/item/circuitboard/mecha/honker/main), //12 + list("key"=/obj/item/bikehorn), //13 + ) /datum/construction/mecha/honker/action(atom/used_atom,mob/user) return check_step(used_atom,user) @@ -842,27 +933,34 @@ if(istype(used_atom, /obj/item/bikehorn)) playsound(holder, 'sound/items/bikehorn.ogg', 50, 1) user.visible_message("HONK!") + if(step==2) + spawn_mecha_result() + //TODO: better messages. switch(step) - if(10) + if(13) user.visible_message("[user] installs the central control module into the [holder].", "You install the central control module into the [holder].") qdel(used_atom) - if(8) + if(11) user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) - if(6) + if(9) user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].") qdel(used_atom) - if(4) + if(7) + user.visible_message("[user] installs the power cell into the [holder].", "You install the power cell into the [holder].") + var/obj/item/I = used_atom + user.transferItemToLoc(I, holder, TRUE) + if(5) user.visible_message("[user] puts clown wig and mask on the [holder].", "You put clown wig and mask on the [holder].") qdel(used_atom) - if(2) + if(3) user.visible_message("[user] puts clown boots on the [holder].", "You put clown boots on the [holder].") qdel(used_atom) return 1 -/datum/construction/mecha/honker/spawn_result() +/datum/construction/mecha/honker/spawn_mecha_result() ..() SSblackbox.inc("mecha_honker_created",1) return @@ -895,10 +993,13 @@ return /datum/construction/reversible/mecha/durand - result = "/obj/mecha/combat/durand" + result = /obj/mecha/combat/durand steps = list( - //1 - list("key"=/obj/item/weldingtool, + //0, dummy step used to stop the steps from finishing and spawn_result() being called automatically. + list("desc"="You shouldn't be able to see this."), + + //1 + list("key"=/obj/item/weldingtool, "backkey"=/obj/item/wrench, "desc"="External armor is wrenched."), //2 @@ -920,60 +1021,68 @@ //6 list("key"=/obj/item/stack/sheet/metal, "backkey"=/obj/item/screwdriver, - "desc"="Super capacitor is secured."), + "desc"="The power cell is secured."), //7 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Super capacitor is installed."), + "desc"="The power cell is installed."), //8 - list("key"=/obj/item/stock_parts/capacitor, + list("key"=/obj/item/stock_parts/cell, "backkey"=/obj/item/screwdriver, - "desc"="Phasic scanner module is secured."), + "desc"="Super capacitor is secured."), //9 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Phasic scanner module is installed."), + "desc"="Super capacitor is installed."), //10 - list("key"=/obj/item/stock_parts/scanning_module, + list("key"=/obj/item/stock_parts/capacitor, "backkey"=/obj/item/screwdriver, - "desc"="Weapon control module is secured."), + "desc"="Phasic scanner module is secured."), //11 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Weapon control module is installed."), + "desc"="Phasic scanner module is installed."), //12 - list("key"=/obj/item/circuitboard/mecha/durand/targeting, + list("key"=/obj/item/stock_parts/scanning_module, "backkey"=/obj/item/screwdriver, - "desc"="Peripherals control module is secured."), + "desc"="Weapon control module is secured."), //13 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Peripherals control module is installed."), + "desc"="Weapon control module is installed."), //14 - list("key"=/obj/item/circuitboard/mecha/durand/peripherals, + list("key"=/obj/item/circuitboard/mecha/durand/targeting, "backkey"=/obj/item/screwdriver, - "desc"="Central control module is secured."), + "desc"="Peripherals control module is secured."), //15 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Central control module is installed."), + "desc"="Peripherals control module is installed."), //16 + list("key"=/obj/item/circuitboard/mecha/durand/peripherals, + "backkey"=/obj/item/screwdriver, + "desc"="Central control module is secured."), + //17 + list("key"=/obj/item/screwdriver, + "backkey"=/obj/item/crowbar, + "desc"="Central control module is installed."), + //18 list("key"=/obj/item/circuitboard/mecha/durand/main, "backkey"=/obj/item/screwdriver, "desc"="The wiring is adjusted."), - //17 + //19 list("key"=/obj/item/wirecutters, "backkey"=/obj/item/screwdriver, "desc"="The wiring is added."), - //18 + //20 list("key"=/obj/item/stack/cable_coil, "backkey"=/obj/item/screwdriver, "desc"="The hydraulic systems are active."), - //19 + //21 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/wrench, "desc"="The hydraulic systems are connected."), - //20 + //22 list("key"=/obj/item/wrench, "desc"="The hydraulic systems are disconnected.") ) @@ -988,24 +1097,24 @@ //TODO: better messages. switch(index) - if(20) + if(23) user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") holder.icon_state = "durand1" - if(19) + if(22) if(diff==FORWARD) user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") holder.icon_state = "durand2" else user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") holder.icon_state = "durand0" - if(18) + if(21) if(diff==FORWARD) user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") holder.icon_state = "durand3" else user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") holder.icon_state = "durand1" - if(17) + if(20) if(diff==FORWARD) user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") holder.icon_state = "durand4" @@ -1014,7 +1123,7 @@ var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) coil.amount = 4 holder.icon_state = "durand2" - if(16) + if(19) if(diff==FORWARD) user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") qdel(used_atom) @@ -1022,7 +1131,7 @@ else user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") holder.icon_state = "durand3" - if(15) + if(18) if(diff==FORWARD) user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") holder.icon_state = "durand6" @@ -1030,7 +1139,7 @@ user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") new /obj/item/circuitboard/mecha/durand/main(get_turf(holder)) holder.icon_state = "durand4" - if(14) + if(17) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) @@ -1038,7 +1147,7 @@ else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") holder.icon_state = "durand5" - if(13) + if(16) if(diff==FORWARD) user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") holder.icon_state = "durand8" @@ -1046,7 +1155,7 @@ user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") new /obj/item/circuitboard/mecha/durand/peripherals(get_turf(holder)) holder.icon_state = "durand6" - if(12) + if(15) if(diff==FORWARD) user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].") qdel(used_atom) @@ -1054,7 +1163,7 @@ else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") holder.icon_state = "durand7" - if(11) + if(14) if(diff==FORWARD) user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") holder.icon_state = "durand10" @@ -1062,7 +1171,7 @@ user.visible_message("[user] removes the weapon control module from the [holder].", "You remove the weapon control module from the [holder].") new /obj/item/circuitboard/mecha/durand/targeting(get_turf(holder)) holder.icon_state = "durand8" - if(10) + if(13) if(diff==FORWARD) user.visible_message("[user] installs scanner module to the [holder].", "You install phasic scanner module to the [holder].") var/obj/item/I = used_atom @@ -1071,7 +1180,7 @@ else user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") holder.icon_state = "durand9" - if(9) + if(12) if(diff==FORWARD) user.visible_message("[user] secures the scanner module.", "You secure the scanner module.") holder.icon_state = "durand12" @@ -1080,7 +1189,7 @@ var/obj/item/I = locate(/obj/item/stock_parts/scanning_module) in holder I.loc = get_turf(holder) holder.icon_state = "durand10" - if(8) + if(11) if(diff==FORWARD) user.visible_message("[user] installs capacitor to the [holder].", "You install capacitor to the [holder].") var/obj/item/I = used_atom @@ -1089,7 +1198,7 @@ else user.visible_message("[user] unfastens the scanner module.", "You unfasten the scanner module.") holder.icon_state = "durand11" - if(7) + if(10) if(diff==FORWARD) user.visible_message("[user] secures the capacitor.", "You secure the capacitor.") holder.icon_state = "durand14" @@ -1098,64 +1207,80 @@ var/obj/item/I = locate(/obj/item/stock_parts/capacitor) in holder I.loc = get_turf(holder) holder.icon_state = "durand12" - if(6) + if(9) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + user.visible_message("[user] installs the power cell into the [holder].", "You install the power cell into the [holder].") + var/obj/item/I = used_atom + user.transferItemToLoc(I, holder, TRUE) holder.icon_state = "durand15" else - user.visible_message("[user] unfastens the super capacitor.", "You unfasten the capacitor.") + user.visible_message("[user] unfastens the capacitor.", "You unfasten the capacitor.") holder.icon_state = "durand13" - if(5) + if(8) + if(diff==FORWARD) + user.visible_message("[user] secures the power cell.", "You secure the power cell.") + holder.icon_state = "durand16" + else + user.visible_message("[user] prys the power cell from [holder].", "You pry the power cell from [holder].") + var/obj/item/I = locate(/obj/item/stock_parts/cell) in holder + I.forceMove(holder.drop_location()) + holder.icon_state = "durand14" + if(7) + if(diff==FORWARD) + user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + holder.icon_state = "durand17" + else + user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + holder.icon_state = "durand15" + if(6) if(diff==FORWARD) user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") - holder.icon_state = "durand16" + holder.icon_state = "durand18" else user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 - holder.icon_state = "durand14" - if(4) + holder.icon_state = "durand16" + if(5) if(diff==FORWARD) user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") - holder.icon_state = "durand17" + holder.icon_state = "durand19" else user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - holder.icon_state = "durand15" - if(3) + holder.icon_state = "durand17" + if(4) if(diff==FORWARD) user.visible_message("[user] installs Durand Armor Plates to the [holder].", "You install Durand Armor Plates to the [holder].") qdel(used_atom) - holder.icon_state = "durand18" + holder.icon_state = "durand20" else user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") - holder.icon_state = "durand16" - if(2) + holder.icon_state = "durand18" + if(3) if(diff==FORWARD) user.visible_message("[user] secures Durand Armor Plates.", "You secure Durand Armor Plates.") - holder.icon_state = "durand19" + holder.icon_state = "durand21" else user.visible_message("[user] pries Durand Armor Plates from the [holder].", "You pry Durand Armor Plates from the [holder].") new /obj/item/mecha_parts/part/durand_armor(get_turf(holder)) - holder.icon_state = "durand17" - if(1) + holder.icon_state = "durand19" + if(2) if(diff==FORWARD) user.visible_message("[user] welds Durand Armor Plates to the [holder].", "You weld Durand Armor Plates to the [holder].") + spawn_mecha_result() else user.visible_message("[user] unfastens Durand Armor Plates.", "You unfasten Durand Armor Plates.") - holder.icon_state = "durand18" + holder.icon_state = "durand20" return 1 -/datum/construction/reversible/mecha/durand/spawn_result() - var/obj/mecha/combat/gygax/M = new result(get_turf(holder)) - M.CheckParts(holder.contents) - qdel(holder) +/datum/construction/reversible/mecha/durand/spawn_mecha_result() + ..() SSblackbox.inc("mecha_durand_created",1) return //PHAZON /datum/construction/mecha/phazon_chassis - result = "/obj/mecha/combat/phazon" steps = list(list("key"=/obj/item/mecha_parts/part/phazon_torso), //1 list("key"=/obj/item/mecha_parts/part/phazon_left_arm), //2 list("key"=/obj/item/mecha_parts/part/phazon_right_arm), //3 @@ -1183,15 +1308,17 @@ return /datum/construction/reversible/mecha/phazon - result = "/obj/mecha/combat/phazon" + result = /obj/mecha/combat/phazon steps = list( - //1 - list("key"=/obj/item/device/assembly/signaler/anomaly, + //0, dummy step used to stop the steps from finishing and spawn_result() being called automatically. + list("desc"="You shouldn't be able to see this."), + + //1 + list("key"=/obj/item/device/assembly/signaler/anomaly, "backkey"=null, //Cannot remove the anomaly core once it's in "desc"="Anomaly core socket is open and awaiting connection."), - - //2 - list("key"=/obj/item/weldingtool, + //2 + list("key"=/obj/item/weldingtool, "backkey"=/obj/item/wrench, "desc"="External armor is wrenched."), //3 @@ -1213,72 +1340,80 @@ //7 list("key"=/obj/item/stack/sheet/plasteel, "backkey"=/obj/item/screwdriver, - "desc"="The bluespace crystal is engaged."), + "desc"="The power cell is secured."), //8 + list("key"=/obj/item/screwdriver, + "backkey"=/obj/item/crowbar, + "desc"="The power cell is installed."), + //9 + list("key"=/obj/item/stock_parts/cell, + "backkey"=/obj/item/screwdriver, + "desc"="The bluespace crystal is engaged."), + //10 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/wirecutters, "desc"="The bluespace crystal is connected."), - //9 + //11 list("key"=/obj/item/stack/cable_coil, "backkey"=/obj/item/crowbar, "desc"="The bluespace crystal is installed."), - //10 + //12 list("key"=/obj/item/ore/bluespace_crystal, "backkey"=/obj/item/screwdriver, "desc"="Super capacitor is secured."), - //12 - list("key"=/obj/item/screwdriver, - "backkey"=/obj/item/crowbar, - "desc"="Super capacitor is installed."), - //12 - list("key"=/obj/item/stock_parts/capacitor, - "backkey"=/obj/item/screwdriver, - "desc"="Phasic scanner module is secured."), //13 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Phasic scanner module is installed."), + "desc"="Super capacitor is installed."), //14 - list("key"=/obj/item/stock_parts/scanning_module, + list("key"=/obj/item/stock_parts/capacitor, "backkey"=/obj/item/screwdriver, - "desc"="Weapon control module is secured."), + "desc"="Phasic scanner module is secured."), //15 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Weapon control is installed."), + "desc"="Phasic scanner module is installed."), //16 - list("key"=/obj/item/circuitboard/mecha/phazon/targeting, + list("key"=/obj/item/stock_parts/scanning_module, "backkey"=/obj/item/screwdriver, - "desc"="Peripherals control module is secured."), + "desc"="Weapon control module is secured."), //17 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Peripherals control module is installed"), + "desc"="Weapon control is installed."), //18 - list("key"=/obj/item/circuitboard/mecha/phazon/peripherals, + list("key"=/obj/item/circuitboard/mecha/phazon/targeting, "backkey"=/obj/item/screwdriver, - "desc"="Central control module is secured."), + "desc"="Peripherals control module is secured."), //19 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Central control module is installed."), + "desc"="Peripherals control module is installed"), //20 + list("key"=/obj/item/circuitboard/mecha/phazon/peripherals, + "backkey"=/obj/item/screwdriver, + "desc"="Central control module is secured."), + //21 + list("key"=/obj/item/screwdriver, + "backkey"=/obj/item/crowbar, + "desc"="Central control module is installed."), + //22 list("key"=/obj/item/circuitboard/mecha/phazon/main, "backkey"=/obj/item/screwdriver, "desc"="The wiring is adjusted."), - //21 + //23 list("key"=/obj/item/wirecutters, "backkey"=/obj/item/screwdriver, "desc"="The wiring is added."), - //22 + //24 list("key"=/obj/item/stack/cable_coil, "backkey"=/obj/item/screwdriver, "desc"="The hydraulic systems are active."), - //23 + //25 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/wrench, "desc"="The hydraulic systems are connected."), - //24 + //26 list("key"=/obj/item/wrench, "desc"="The hydraulic systems are disconnected.") ) @@ -1293,24 +1428,24 @@ //TODO: better messages. switch(index) - if(24) + if(27) user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") holder.icon_state = "phazon1" - if(23) + if(26) if(diff==FORWARD) user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") holder.icon_state = "phazon2" else user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") holder.icon_state = "phazon0" - if(22) + if(25) if(diff==FORWARD) user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") holder.icon_state = "phazon3" else user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") holder.icon_state = "phazon1" - if(21) + if(24) if(diff==FORWARD) user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") holder.icon_state = "phazon4" @@ -1319,7 +1454,7 @@ var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) coil.amount = 4 holder.icon_state = "phazon2" - if(20) + if(23) if(diff==FORWARD) user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") qdel(used_atom) @@ -1327,7 +1462,7 @@ else user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") holder.icon_state = "phazon3" - if(19) + if(22) if(diff==FORWARD) user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") holder.icon_state = "phazon6" @@ -1335,7 +1470,7 @@ user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") new /obj/item/circuitboard/mecha/phazon/main(get_turf(holder)) holder.icon_state = "phazon4" - if(18) + if(21) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) @@ -1343,7 +1478,7 @@ else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") holder.icon_state = "phazon5" - if(17) + if(20) if(diff==FORWARD) user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") holder.icon_state = "phazon8" @@ -1351,7 +1486,7 @@ user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") new /obj/item/circuitboard/mecha/phazon/peripherals(get_turf(holder)) holder.icon_state = "phazon6" - if(16) + if(19) if(diff==FORWARD) user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].") qdel(used_atom) @@ -1359,7 +1494,7 @@ else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") holder.icon_state = "phazon7" - if(15) + if(18) if(diff==FORWARD) user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.") holder.icon_state = "phazon10" @@ -1367,7 +1502,7 @@ user.visible_message("[user] removes the weapon control module from the [holder].", "You remove the weapon control module from the [holder].") new /obj/item/circuitboard/mecha/phazon/targeting(get_turf(holder)) holder.icon_state = "phazon8" - if(14) + if(17) if(diff==FORWARD) user.visible_message("[user] installs phasic scanner module to the [holder].", "You install scanner module to the [holder].") var/obj/item/I = used_atom @@ -1376,7 +1511,7 @@ else user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.") holder.icon_state = "phazon9" - if(13) + if(16) if(diff==FORWARD) user.visible_message("[user] secures the phasic scanner module.", "You secure the scanner module.") holder.icon_state = "phazon12" @@ -1385,7 +1520,7 @@ var/obj/item/I = locate(/obj/item/stock_parts/scanning_module) in holder I.loc = get_turf(holder) holder.icon_state = "phazon10" - if(12) + if(15) if(diff==FORWARD) user.visible_message("[user] installs super capacitor to the [holder].", "You install capacitor to the [holder].") var/obj/item/I = used_atom @@ -1394,7 +1529,7 @@ else user.visible_message("[user] unfastens the phasic scanner module.", "You unfasten the scanner module.") holder.icon_state = "phazon11" - if(11) + if(14) if(diff==FORWARD) user.visible_message("[user] secures the super capacitor.", "You secure the capacitor.") holder.icon_state = "phazon14" @@ -1403,7 +1538,7 @@ var/obj/item/I = locate(/obj/item/stock_parts/capacitor) in holder I.loc = get_turf(holder) holder.icon_state = "phazon12" - if(10) + if(13) if(diff==FORWARD) user.visible_message("[user] installs the bluespace crystal.", "You install the bluespace crystal.") qdel(used_atom) @@ -1411,7 +1546,7 @@ else user.visible_message("[user] unsecures the super capacitor from the [holder].", "You unsecure the capacitor from the [holder].") holder.icon_state = "phazon13" - if(9) + if(12) if(diff==FORWARD) user.visible_message("[user] connects the bluespace crystal.", "You connect the bluespace crystal.") holder.icon_state = "phazon16" @@ -1419,68 +1554,85 @@ user.visible_message("[user] removes the bluespace crystal from the [holder].", "You remove the bluespace crystal from the [holder].") new /obj/item/ore/bluespace_crystal(get_turf(holder)) holder.icon_state = "phazon14" - if(8) + if(11) if(diff==FORWARD) user.visible_message("[user] engages the bluespace crystal.", "You engage the bluespace crystal.") holder.icon_state = "phazon17" else user.visible_message("[user] disconnects the bluespace crystal from the [holder].", "You disconnect the bluespace crystal from the [holder].") holder.icon_state = "phazon15" - if(7) + if(10) if(diff==FORWARD) - user.visible_message("[user] installs the phase armor layer to the [holder].", "You install the phase armor layer to the [holder].") + user.visible_message("[user] installs the power cell into the [holder].", "You install the power cell into the [holder].") + var/obj/item/I = used_atom + user.transferItemToLoc(I, holder, TRUE) holder.icon_state = "phazon18" else user.visible_message("[user] disengages the bluespace crystal.", "You disengage the bluespace crystal.") holder.icon_state = "phazon16" - if(6) + if(9) + if(diff==FORWARD) + user.visible_message("[user] secures the power cell.", "You secure the power cell.") + holder.icon_state = "phazon19" + else + user.visible_message("[user] prys the power cell from [holder].", "You pry the power cell from [holder].") + var/obj/item/I = locate(/obj/item/stock_parts/cell) in holder + I.forceMove(holder.drop_location()) + holder.icon_state = "phazon17" + if(8) + if(diff==FORWARD) + user.visible_message("[user] installs the phase armor layer to the [holder].", "You install the phase armor layer to the [holder].") + holder.icon_state = "phazon20" + else + user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + holder.icon_state = "durand18" + if(7) if(diff==FORWARD) user.visible_message("[user] secures the phase armor layer.", "You secure the phase armor layer.") - holder.icon_state = "phazon19" + holder.icon_state = "phazon21" else user.visible_message("[user] pries the phase armor layer from the [holder].", "You pry the phase armor layer from the [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 - holder.icon_state = "phazon17" - if(5) + holder.icon_state = "phazon19" + if(6) if(diff==FORWARD) user.visible_message("[user] welds the phase armor layer to the [holder].", "You weld the phase armor layer to the [holder].") - holder.icon_state = "phazon20" + holder.icon_state = "phazon22" else user.visible_message("[user] unfastens the phase armor layer.", "You unfasten the phase armor layer.") - holder.icon_state = "phazon18" - if(4) + holder.icon_state = "phazon20" + if(5) if(diff==FORWARD) user.visible_message("[user] installs Phazon Armor Plates to the [holder].", "You install Phazon Armor Plates to the [holder].") qdel(used_atom) - holder.icon_state = "phazon21" + holder.icon_state = "phazon23" else user.visible_message("[user] cuts phase armor layer from the [holder].", "You cut the phase armor layer from the [holder].") - holder.icon_state = "phazon19" - if(3) + holder.icon_state = "phazon21" + if(4) if(diff==FORWARD) user.visible_message("[user] secures Phazon Armor Plates.", "You secure Phazon Armor Plates.") - holder.icon_state = "phazon22" + holder.icon_state = "phazon24" else user.visible_message("[user] pries Phazon Armor Plates from the [holder].", "You pry Phazon Armor Plates from the [holder].") new /obj/item/mecha_parts/part/phazon_armor(get_turf(holder)) - holder.icon_state = "phazon20" - if(2) + holder.icon_state = "phazon22" + if(3) if(diff==FORWARD) user.visible_message("[user] welds Phazon Armor Plates to the [holder].", "You weld Phazon Armor Plates to the [holder].") else user.visible_message("[user] unfastens Phazon Armor Plates.", "You unfasten Phazon Armor Plates.") - holder.icon_state = "phazon21" - if(1) + holder.icon_state = "phazon23" + if(2) if(diff==FORWARD) user.visible_message("[user] carefully inserts the anomaly core into \the [holder] and secures it.", "You slowly place the anomaly core into its socket and close its chamber.") qdel(used_atom) + spawn_mecha_result() return 1 -/datum/construction/reversible/mecha/phazon/spawn_result() - var/obj/mecha/combat/gygax/M = new result(get_turf(holder)) - M.CheckParts(holder.contents) - qdel(holder) +/datum/construction/reversible/mecha/phazon/spawn_mecha_result() + ..() SSblackbox.inc("mecha_phazon_created",1) return @@ -1515,13 +1667,16 @@ /datum/construction/reversible/mecha/odysseus - result = "/obj/mecha/medical/odysseus" + result = /obj/mecha/medical/odysseus steps = list( - //1 - list("key"=/obj/item/weldingtool, + //0, dummy step used to stop the steps from finishing and spawn_result() being called automatically. + list("desc"="You shouldn't be able to see this."), + + //1 + list("key"=/obj/item/weldingtool, "backkey"=/obj/item/wrench, "desc"="External armor is wrenched."), - //2 + //2 list("key"=/obj/item/wrench, "backkey"=/obj/item/crowbar, "desc"="External armor is installed."), @@ -1540,36 +1695,44 @@ //6 list("key"=/obj/item/stack/sheet/metal, "backkey"=/obj/item/screwdriver, - "desc"="Peripherals control module is secured."), + "desc"="The power cell is secured."), //7 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Peripherals control module is installed."), + "desc"="The power cell is installed."), //8 - list("key"=/obj/item/circuitboard/mecha/odysseus/peripherals, + list("key"=/obj/item/stock_parts/cell, "backkey"=/obj/item/screwdriver, - "desc"="Central control module is secured."), + "desc"="Peripherals control module is secured."), //9 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/crowbar, - "desc"="Central control module is installed."), + "desc"="Peripherals control module is installed."), //10 + list("key"=/obj/item/circuitboard/mecha/odysseus/peripherals, + "backkey"=/obj/item/screwdriver, + "desc"="Central control module is secured."), + //11 + list("key"=/obj/item/screwdriver, + "backkey"=/obj/item/crowbar, + "desc"="Central control module is installed."), + //12 list("key"=/obj/item/circuitboard/mecha/odysseus/main, "backkey"=/obj/item/screwdriver, "desc"="The wiring is adjusted."), - //11 + //13 list("key"=/obj/item/wirecutters, "backkey"=/obj/item/screwdriver, "desc"="The wiring is added."), - //12 + //14 list("key"=/obj/item/stack/cable_coil, "backkey"=/obj/item/screwdriver, "desc"="The hydraulic systems are active."), - //13 + //15 list("key"=/obj/item/screwdriver, "backkey"=/obj/item/wrench, "desc"="The hydraulic systems are connected."), - //14 + //16 list("key"=/obj/item/wrench, "desc"="The hydraulic systems are disconnected.") ) @@ -1583,24 +1746,24 @@ //TODO: better messages. switch(index) - if(14) + if(17) user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.") holder.icon_state = "odysseus1" - if(13) + if(16) if(diff==FORWARD) user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.") holder.icon_state = "odysseus2" else user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.") holder.icon_state = "odysseus0" - if(12) + if(15) if(diff==FORWARD) user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].") holder.icon_state = "odysseus3" else user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.") holder.icon_state = "odysseus1" - if(11) + if(14) if(diff==FORWARD) user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].") holder.icon_state = "odysseus4" @@ -1609,7 +1772,7 @@ var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder)) coil.amount = 4 holder.icon_state = "odysseus2" - if(10) + if(13) if(diff==FORWARD) user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].") qdel(used_atom) @@ -1617,7 +1780,7 @@ else user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].") holder.icon_state = "odysseus3" - if(9) + if(12) if(diff==FORWARD) user.visible_message("[user] secures the mainboard.", "You secure the mainboard.") holder.icon_state = "odysseus6" @@ -1625,7 +1788,7 @@ user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].") new /obj/item/circuitboard/mecha/odysseus/main(get_turf(holder)) holder.icon_state = "odysseus4" - if(8) + if(11) if(diff==FORWARD) user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].") qdel(used_atom) @@ -1633,7 +1796,7 @@ else user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.") holder.icon_state = "odysseus5" - if(7) + if(10) if(diff==FORWARD) user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.") holder.icon_state = "odysseus8" @@ -1641,56 +1804,74 @@ user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].") new /obj/item/circuitboard/mecha/odysseus/peripherals(get_turf(holder)) holder.icon_state = "odysseus6" - if(6) + if(9) if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + user.visible_message("[user] installs the power cell into the [holder].", "You install the power cell into the [holder].") + var/obj/item/I = used_atom + user.transferItemToLoc(I, holder, TRUE) holder.icon_state = "odysseus9" else user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.") holder.icon_state = "odysseus7" - if(5) + if(8) + if(diff==FORWARD) + user.visible_message("[user] secures the power cell.", "You secure the power cell.") + holder.icon_state = "odysseus10" + else + user.visible_message("[user] prys the power cell from [holder].", "You pry the power cell from [holder].") + var/obj/item/I = locate(/obj/item/stock_parts/cell) in holder + I.forceMove(holder.drop_location()) + holder.icon_state = "odysseus8" + if(7) + if(diff==FORWARD) + user.visible_message("[user] installs the internal armor layer to the [holder].", "You install the internal armor layer to the [holder].") + holder.icon_state = "odysseus11" + else + user.visible_message("[user] unfastens the power cell.", "You unfasten the power cell.") + holder.icon_state = "odysseus9" + if(6) if(diff==FORWARD) user.visible_message("[user] secures the internal armor layer.", "You secure the internal armor layer.") - holder.icon_state = "odysseus10" + holder.icon_state = "odysseus12" else user.visible_message("[user] pries internal armor layer from the [holder].", "You pry internal armor layer from the [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 - holder.icon_state = "odysseus8" - if(4) + holder.icon_state = "odysseus10" + if(5) if(diff==FORWARD) user.visible_message("[user] welds the internal armor layer to the [holder].", "You weld the internal armor layer to the [holder].") - holder.icon_state = "odysseus11" + holder.icon_state = "odysseus13" else user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.") - holder.icon_state = "odysseus9" - if(3) + holder.icon_state = "odysseus11" + if(4) if(diff==FORWARD) user.visible_message("[user] installs [used_atom] layer to the [holder].", "You install the external reinforced armor layer to the [holder].") - holder.icon_state = "odysseus12" + holder.icon_state = "odysseus14" else user.visible_message("[user] cuts the internal armor layer from the [holder].", "You cut the internal armor layer from the [holder].") - holder.icon_state = "odysseus10" - if(2) + holder.icon_state = "odysseus12" + if(3) if(diff==FORWARD) user.visible_message("[user] secures the external armor layer.", "You secure the external reinforced armor layer.") - holder.icon_state = "odysseus13" + holder.icon_state = "odysseus15" else var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 user.visible_message("[user] pries [MS] from the [holder].", "You pry [MS] from the [holder].") - holder.icon_state = "odysseus11" - if(1) + holder.icon_state = "odysseus13" + if(2) if(diff==FORWARD) user.visible_message("[user] welds the external armor layer to the [holder].", "You weld the external armor layer to the [holder].") - holder.icon_state = "odysseus14" + spawn_mecha_result() else user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.") - holder.icon_state = "odysseus12" + holder.icon_state = "odysseus14" return 1 -/datum/construction/reversible/mecha/odysseus/spawn_result() +/datum/construction/reversible/mecha/odysseus/spawn_mecha_result() ..() SSblackbox.inc("mecha_odysseus_created",1) return diff --git a/icons/mecha/mech_construction.dmi b/icons/mecha/mech_construction.dmi index 38b3b04c5df4267826bf10b1fe07cca2aa9dea53..42cc8eeb57416a14af3e1daaf2096d6a751ca160 100644 GIT binary patch literal 17377 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�*Z{Z32vdL*!U789U=BJIYpXqX)v`yFvI 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 literal 17212 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 From 59541efffb2c9e7d673e3099b85b8346a5e338c4 Mon Sep 17 00:00:00 2001 From: Michiyamenotehifunana <31995558+Michiyamenotehifunana@users.noreply.github.com> Date: Wed, 27 Sep 2017 23:08:36 +0800 Subject: [PATCH 020/136] Wave 3 of guns Reskinnable stetchkins, magrifle, flechette gun, Hyper-burst rifle, and 10mm soporific bullets. --- code/citadel/cit_guns.dm | 440 ++++++++++++++++++++++++- code/modules/uplink/uplink_item_cit.dm | 129 +++++++- icons/obj/guns/cit_guns.dmi | Bin 11194 -> 32918 bytes sound/weapons/magburst.ogg | Bin 0 -> 16302 bytes sound/weapons/magrifle.ogg | Bin 0 -> 18877 bytes 5 files changed, 560 insertions(+), 9 deletions(-) create mode 100644 sound/weapons/magburst.ogg create mode 100644 sound/weapons/magrifle.ogg diff --git a/code/citadel/cit_guns.dm b/code/citadel/cit_guns.dm index efab785d12..e62884ecbc 100644 --- a/code/citadel/cit_guns.dm +++ b/code/citadel/cit_guns.dm @@ -172,6 +172,27 @@ spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable recoil = 1 +///toy memes/// + +/obj/item/ammo_box/magazine/toy/x9 + name = "foam force X9 magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toy9magazine" + max_ammo = 30 + multiple_sprites = 2 + +/obj/item/gun/ballistic/automatic/x9/toy + name = "donksoft X9" + desc = "An old but reliable assault rifle made for combat against unknown enemies. Appears to be hastily converted. Ages 8 and up." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toy9" + can_suppress = 0 + needs_permit = 0 + mag_type = /obj/item/ammo_box/magazine/toy/x9 + casing_ejector = 0 + spread = 45 //MAXIMUM XCOM MEMES (actually that'd be 90 spread) + + ////////XCOM2 Magpistol///////// //////projectiles////// @@ -213,7 +234,7 @@ //////magazines///// -/obj/item/ammo_box/magazine/mmags +/obj/item/ammo_box/magazine/mmag/small name = "magpistol magazine (non-lethal disabler)" icon = 'icons/obj/guns/cit_guns.dmi' icon_state = "nlmagmag" @@ -223,7 +244,7 @@ max_ammo = 7 multiple_sprites = 2 -/obj/item/ammo_box/magazine/mmags/lethal +/obj/item/ammo_box/magazine/mmag/small/lethal name = "magpistol magazine (lethal)" icon = 'icons/obj/guns/cit_guns.dmi' icon_state = "smallmagmag" @@ -239,7 +260,7 @@ icon_state = "magpistol" force = 10 fire_sound = 'sound/weapons/magpistol.ogg' - mag_type = /obj/item/ammo_box/magazine/mmags + mag_type = /obj/item/ammo_box/magazine/mmag/small can_suppress = 0 casing_ejector = 0 fire_delay = 5 @@ -276,7 +297,7 @@ req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5, "syndicate" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 4000, MAT_SILVER = 500) - build_path = /obj/item/ammo_box/magazine/mmags/lethal + build_path = /obj/item/ammo_box/magazine/mmag/small/lethal category = list("Ammo") /datum/design/mag_magpistol/nl @@ -285,7 +306,7 @@ id = "mag_magpistol_nl" req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5) materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250) - build_path = /obj/item/ammo_box/magazine/mmags + build_path = /obj/item/ammo_box/magazine/mmag/small //////toy memes///// @@ -339,3 +360,412 @@ materials = list(MAT_METAL = 7500, MAT_GLASS = 1000) build_path = /obj/item/gun/ballistic/shotgun/toy/mag category = list("hacked", "Misc") + +//////Magrifle////// + +///projectiles/// + +/obj/item/projectile/bullet/magrifle + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-large" + damage = 30 + armour_penetration = 25 + light_range = 3 + light_color = LIGHT_COLOR_RED + +/obj/item/projectile/bullet/nlmagrifle //non-lethal boolets + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-large-nl" + damage = 5 + knockdown = 30 + stamina = 75 + armour_penetration = 0 + light_range = 3 + light_color = LIGHT_COLOR_BLUE + +///ammo casings/// + +/obj/item/ammo_casing/caseless/amagm + desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon." + caliber = "magm" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/magrifle + +/obj/item/ammo_casing/caseless/anlmagm + desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload." + caliber = "magm" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/nlmagrifle + +///magazines/// + +/obj/item/ammo_box/magazine/mmag/ + name = "magrifle magazine (non-lethal disabler)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mediummagmag" + origin_tech = "magnets=6" + ammo_type = /obj/item/ammo_casing/caseless/anlmagm + caliber = "magm" + max_ammo = 15 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/mmag/lethal + name = "magrifle magazine (lethal)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mediummagmag" + origin_tech = "combat=6" + ammo_type = /obj/item/ammo_casing/caseless/amagm + +///the gun itself/// + +/obj/item/gun/ballistic/automatic/magrifle + name = "\improper Magnetic Rifle" + desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magrifle" + item_state = "arg" + slot_flags = 0 + origin_tech = "combat=6;engineering=6;magnets=6" + mag_type = /obj/item/ammo_box/magazine/mmag + fire_sound = 'sound/weapons/magrifle.ogg' + can_suppress = 0 + burst_size = 3 + fire_delay = 2 + spread = 15 + recoil = 1 + casing_ejector = 0 + +///research/// + +/obj/item/gun/ballistic/automatic/magrifle/nopin + pin = null + +/datum/design/magrifle + name = "Magrifle" + desc = "An upscaled Magpistol in rifle form." + id = "magrifle" + req_tech = list("combat" = 7, "magnets" = 7, "powerstorage" = 7) + build_type = PROTOLATHE + materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000) + build_path = /obj/item/gun/ballistic/automatic/magrifle/nopin + category = list("Weapons") + +/datum/design/mag_magrifle + name = "Magrifle Magazine (Lethal)" + desc = "A 15 round magazine for the Magrifle." + id = "mag_magrifle" + req_tech = list("combat" = 7, "magnets" = 7, "materials" = 5, "syndicate" = 4) + build_type = PROTOLATHE + materials = list(MAT_METAL = 8000, MAT_SILVER = 1000) + build_path = /obj/item/ammo_box/magazine/mmag/lethal + category = list("Ammo") + +/datum/design/mag_magrifle/nl + name = "Magrifle Magazine (Non-Lethal)" + desc = "A 15 round non-lethal magazine for the Magrifle." + id = "mag_magrifle_nl" + req_tech = list("combat" = 7, "magnets" = 7, "materials" = 5) + materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500) + build_path = /obj/item/ammo_box/magazine/mmag + +//////Hyper-Burst Rifle////// + +///projectiles/// + +/obj/item/projectile/bullet/mags/hyper + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile" + damage = 10 + armour_penetration = 10 + stamina = 10 + forcedodge = TRUE + range = 6 + light_range = 1 + light_color = LIGHT_COLOR_RED + +/obj/item/projectile/bullet/mags/hyper/inferno + icon_state = "magjectile-large" + stamina = 0 + forcedodge = FALSE + range = 25 + light_range = 4 + +/obj/item/projectile/bullet/mags/hyper/inferno/on_hit(atom/target, blocked = FALSE) + ..() + explosion(target, -1, 1, 2, 4, 5) + return 1 + +///ammo casings/// + +/obj/item/ammo_casing/caseless/ahyper + desc = "A large block of speciallized ferromagnetic material designed to be fired out of the experimental Hyper-Burst Rifle." + caliber = "hypermag" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "hyper-casing-live" + projectile_type = /obj/item/projectile/bullet/mags/hyper + pellets = 12 + variance = 40 + +/obj/item/ammo_casing/caseless/ahyper/inferno + projectile_type = /obj/item/projectile/bullet/mags/hyper/inferno + pellets = 1 + variance = 0 + +///magazines/// + +/obj/item/ammo_box/magazine/mhyper + name = "hyper-burst rifle magazine" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "hypermag-4" + ammo_type = /obj/item/ammo_casing/caseless/ahyper + caliber = "hypermag" + desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that fragments into 12 smaller shards which can absolutely puncture anything, but has rather short effective range." + max_ammo = 4 + +/obj/item/ammo_box/magazine/mhyper/update_icon() + ..() + icon_state = "hypermag-[ammo_count() ? "4" : "0"]" + +/obj/item/ammo_box/magazine/mhyper/inferno + name = "hyper-burst rifle magazine (inferno)" + ammo_type = /obj/item/ammo_casing/caseless/ahyper/inferno + desc = "A magazine for the Hyper-Burst Rifle. Loaded with a special slug that violently reacts with whatever surface it strikes, generating a massive amount of heat and light." + +///gun itself/// + +/obj/item/gun/ballistic/automatic/hyperburst + name = "\improper Hyper-Burst Rifle" + desc = "An extremely beefed up version of a stolen Nanotrasen weapon prototype, this 'rifle' is more like a cannon, with an extremely large bore barrel capable of generating several smaller magnetic 'barrels' to simultaneously launch multiple projectiles at once." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "hyperburst" + item_state = "arg" + slot_flags = 0 + origin_tech = "combat=6;engineering=6;magnets=6;syndicate=6" + mag_type = /obj/item/ammo_box/magazine/mhyper + fire_sound = 'sound/weapons/magburst.ogg' + can_suppress = 0 + burst_size = 1 + fire_delay = 40 + recoil = 2 + casing_ejector = 0 + weapon_weight = WEAPON_HEAVY + +/obj/item/gun/ballistic/automatic/hyperburst/update_icon() + ..() + icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]" + +/* made redundant by reskinnable stetchkins +//////Stealth Pistol////// + +/obj/item/gun/ballistic/automatic/pistol/stealth + name = "stealth pistol" + desc = "A unique bullpup pistol with a compact frame. Has an integrated surpressor." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "stealthpistol" + w_class = WEIGHT_CLASS_SMALL + origin_tech = "combat=3;materials=3;syndicate=4" + mag_type = /obj/item/ammo_box/magazine/m10mm + can_suppress = 0 + fire_sound = 'sound/weapons/gunshot_silenced.ogg' + suppressed = 1 + burst_size = 1 + +/obj/item/gun/ballistic/automatic/pistol/stealth/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("stealthpistol-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +*/ + +//////10mm soporific bullets////// + +obj/item/projectile/bullet/c10mm/soporific + name ="10mm soporific bullet" + armour_penetration = 0 + nodamage = TRUE + dismemberment = 0 + knockdown = 0 + +/obj/item/projectile/bullet/c10mm/soporific/on_hit(atom/target, blocked = FALSE) + if((blocked != 100) && isliving(target)) + var/mob/living/L = target + L.blur_eyes(6) + if(L.staminaloss >= 40) + L.Sleeping(250) + else + L.adjustStaminaLoss(58) + return 1 + +/obj/item/ammo_casing/c10mm/soporific + name = ".10mm soporific bullet casing" + desc = "A 10mm soporific bullet casing." + projectile_type = /obj/item/projectile/bullet/c10mm/soporific + +/obj/item/ammo_box/magazine/m10mm/soporific + name = "pistol magazine (10mm soporific)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "9x19pS" + desc = "A gun magazine. Loaded with rounds which inject the target with a variety of illegal substances to induce sleep in the target." + ammo_type = /obj/item/ammo_casing/c10mm/soporific + +/obj/item/ammo_box/c10mm/soporific + name = "ammo box (10mm soporific)" + ammo_type = /obj/item/ammo_casing/c10mm/soporific + max_ammo = 24 + +//////Flechette Launcher////// + +///projectiles/// + +/obj/item/projectile/bullet/cflechetteap //shreds armor + name = "flechette (armor piercing)" + damage = 8 + armour_penetration = 80 + +/obj/item/projectile/bullet/cflechettes //shreds flesh and forces bleeding + name = "flechette (serrated)" + damage = 8 + dismemberment = 10 + armour_penetration = -80 + +/obj/item/projectile/bullet/cflechettes/on_hit(atom/target, blocked = FALSE) + if((blocked != 100) && iscarbon(target)) + var/mob/living/carbon/C = target + C.bleed(10) + return ..() + +///ammo casings (CASELESS AMMO CASINGS WOOOOOOOO)/// + +/obj/item/ammo_casing/caseless/flechetteap + name = "flechette (armor piercing)" + desc = "A flechette made with a tungsten alloy." + projectile_type = /obj/item/projectile/bullet/cflechetteap + caliber = "flechette" + throwforce = 1 + throw_speed = 3 + +/obj/item/ammo_casing/caseless/flechettes + name = "flechette (serrated)" + desc = "A serrated flechette made of a special alloy intended to deform drastically upon penetration of human flesh." + projectile_type = /obj/item/projectile/bullet/cflechettes + caliber = "flechette" + throwforce = 2 + throw_speed = 3 + embed_chance = 75 + +///magazine/// + +/obj/item/ammo_box/magazine/flechette + name = "flechette magazine (armor piercing)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "flechettemag" + origin_tech = "combat=5;syndicate=1" + ammo_type = /obj/item/ammo_casing/caseless/flechetteap + caliber = "flechette" + max_ammo = 40 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/flechette/s + name = "flechette magazine (serrated)" + ammo_type = /obj/item/ammo_casing/caseless/flechettes + +///the gun itself/// + +/obj/item/gun/ballistic/automatic/flechette + name = "\improper CX Flechette Launcher" + desc = "A flechette launching machine pistol with an unconventional bullpup frame." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "flechettegun" + item_state = "gun" + w_class = WEIGHT_CLASS_NORMAL + slot_flags = 0 + /obj/item/device/firing_pin/implant/pindicate + origin_tech = "combat=6;materials=2;syndicate=5" + mag_type = /obj/item/ammo_box/magazine/flechette/ + fire_sound = 'sound/weapons/gunshot_smg.ogg' + can_suppress = 0 + burst_size = 5 + fire_delay = 1 + casing_ejector = 0 + spread = 20 + +/obj/item/gun/ballistic/automatic/flechette/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("flechettegun-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +///unique variant/// + +/obj/item/projectile/bullet/cflechetteshredder + name = "flechette (shredder)" + damage = 5 + dismemberment = 40 + +/obj/item/ammo_casing/caseless/flechetteshredder + name = "flechette (shredder)" + desc = "A serrated flechette made of a special alloy that forms a monofilament edge." + projectile_type = /obj/item/projectile/bullet/cflechettes + +/obj/item/ammo_box/magazine/flechette/shredder + name = "flechette magazine (shredder)" + icon_state = "shreddermag" + ammo_type = /obj/item/ammo_casing/caseless/flechetteshredder + +/obj/item/gun/ballistic/automatic/flechette/shredder + name = "\improper CX Shredder" + desc = "A flechette launching machine pistol made of ultra-light CFRP optimized for firing serrated monofillament flechettes." + w_class = WEIGHT_CLASS_SMALL + mag_type = /obj/item/ammo_box/magazine/flechette/shredder + spread = 30 + +/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("shreddergun-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +//////modular pistol////// (reskinnable stetchkins) + +/obj/item/gun/ballistic/automatic/pistol/modular + name = "modular pistol" + desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "cde" + can_unsuppress = TRUE + unique_rename = TRUE + unique_reskin = list("Default" = "cde", + "NT-99" = "n99", + "Stealth" = "stealthpistol", + "HKVP-78" = "vp78", + "Luger" = "p08b", + "Mk.58" = "secguncomp", + "PX4 Storm" = "px4" + ) + +/obj/item/gun/ballistic/automatic/pistol/modular/update_icon() + ..() + if(current_skin) + icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" + else + icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" + if(magazine && suppressed) + cut_overlays() + add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay + else if (magazine) + cut_overlays() + add_overlay("[unique_reskin[current_skin]]-magazine") + else + cut_overlays() \ No newline at end of file diff --git a/code/modules/uplink/uplink_item_cit.dm b/code/modules/uplink/uplink_item_cit.dm index c9bb091303..3aa1fd8bb1 100644 --- a/code/modules/uplink/uplink_item_cit.dm +++ b/code/modules/uplink/uplink_item_cit.dm @@ -31,12 +31,133 @@ /datum/uplink_item/dangerous/antitank name = "Anti Tank Pistol" - desc = "Essentially amounting to a sniper rifle with no stock and barrel (or indeed, any rifling at all),\ - this extremely dubious pistol is guaranteed to dislocate your wrists and hit the broad side of a barn!\ - Uses sniper ammo.\ + desc = "Essentially amounting to a sniper rifle with no stock and barrel (or indeed, any rifling at all), \ + this extremely dubious pistol is guaranteed to dislocate your wrists and hit the broad side of a barn! \ + Uses sniper ammo. \ Bullets tend to veer off-course. We are not responsible for any unintentional damage or injury resulting from inaacuracy." item = /obj/item/gun/ballistic/automatic/pistol/antitank/syndicate - refundable = TRUE cost = 14 surplus = 25 include_modes = list(/datum/game_mode/nuclear) + +/* Commented out due to introduction of reskinnable stetchkins. May still have a niche if people decide it somehow has value. +/datum/uplink_item/dangerous/stealthpistol + name = "Stealth Pistol" + desc = "A compact, easily concealable bullpup pistol that fires 10mm auto rounds in 8 round magazines. \ + Has an integrated suppressor." + item = /obj/item/gun/ballistic/automatic/pistol/stealth + cost = 10 + surplus = 30 +*/ + +///Soporific 10mm mags/// + +/datum/uplink_item/ammo/pistolzzz + name = "10mm Soporific Magazine" + desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. Loaded with soporific rounds that put the target to sleep. \ + NOTE: Soporific is not instant acting due to the constraints of the round's scale. Will usually require two shots to take effect." + item = /obj/item/ammo_box/magazine/m10mm/soporific + cost = 2 + +///flechette memes/// + +/datum/uplink_item/dangerous/flechettegun + name = "Flechette Launcher" + desc = "A compact bullpup that fires micro-flechettes.\ + Flechettes have very poor performance idividually, but can be very deadly in numbers. \ + Pre-loaded with armor piercing flechettes that are capable of puncturing most kinds of armor." + item = /obj/item/gun/ballistic/automatic/flechette + cost = 12 + surplus = 30 + include_modes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/ammo/flechetteap + name = "Armor Piercing Flechette Magazine" + desc = "An additional 40-round flechette magazine; compatible with the Flechette Launcer. \ + Loaded with armor piercing flechettes that very nearly ignore armor, but are not very effective agaisnt flesh." + item = /obj/item/ammo_box/magazine/flechette + cost = 2 + include_modes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/ammo/flechettes + name = "Serrated Flechette Magazine" + desc = "An additional 40-round flechette magazine; compatible with the Flechette Launcer. \ + Loaded with serrated flechettes that shreds flesh, but is stopped dead in its tracks by armor. \ + These flechettes are highly likely to sever arteries, and even limbs." + item = /obj/item/ammo_box/magazine/flechette/s + cost = 2 + include_modes = list(/datum/game_mode/nuclear) + +///shredder/// + +/datum/uplink_item/nukeoffer/shredder + name = "Shredder bundle" + desc = "A truly horrific weapon designed simply to maim its victim, the CX Shredder is banned by several intergalactic treaties. \ + You'll get two of them with this. And spare ammo to boot. And we'll throw in an extra elite hardsuit and chest rig to hold them all!" + item = /obj/item/storage/backpack/duffelbag/syndie/shredderbundle + cost = 30 // normally 41 + +///Modular Pistols/// + +/datum/uplink_item/bundle/modular + name="Modular Pistol Kit" + desc="A heavy briefcase containing one modular pistol (chambered in 10mm), one supressor, and spare ammunition, including a box of soporific ammo. \ + Includes a suit jacket that is padded with a robust liner." + item = /obj/item/storage/briefcase/modularbundle + cost = 12 + +//////Bundle stuff////// + +///bundle category/// + +/datum/uplink_item/bundle + category = "Bundles" + surplus = 0 + cant_discount = TRUE + +///place bundle storage items here I guess/// + +/obj/item/storage/briefcase/modularbundle + name = "briefcase" + desc = "It's label reads genuine hardened Captain leather, but suspiciously has no other tags or branding." + icon_state = "briefcase" + flags_1 = CONDUCT_1 + force = 10 + hitsound = "swing_hit" + throw_speed = 2 + throw_range = 4 + w_class = WEIGHT_CLASS_BULKY + max_w_class = WEIGHT_CLASS_NORMAL + max_combined_w_class = 21 + attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") + resistance_flags = FLAMMABLE + max_integrity = 150 + +/obj/item/storage/briefcase/modularbundle/PopulateContents() + new /obj/item/gun/ballistic/automatic/pistol/modular(src) + new /obj/item/suppressor(src) + new /obj/item/ammo_box/magazine/m10mm(src) + new /obj/item/ammo_box/magazine/m10mm/soporific(src) + new /obj/item/ammo_box/c10mm/soporific(src) + new /obj/item/clothing/under/lawyer/blacksuit(src) + new /obj/item/clothing/accessory/waistcoat(src) + new /obj/item/clothing/suit/toggle/lawyer/black/syndie(src) + +/obj/item/clothing/suit/toggle/lawyer/black/syndie + desc = "A snappy dress jacket. Suspiciously has no tags or branding." + armor = list(melee = 10, bullet = 10, laser = 10, energy = 10, bomb = 10) + +/obj/item/storage/backpack/duffelbag/syndie/shredderbundle + desc = "A large duffel bag containing two CX Shredders, some magazines, an elite hardsuit, and a chest rig." + +/obj/item/storage/backpack/duffelbag/syndie/shredderbundle/PopulateContents() + new /obj/item/ammo_box/magazine/flechette/shredder(src) + new /obj/item/ammo_box/magazine/flechette/shredder(src) + new /obj/item/ammo_box/magazine/flechette/shredder(src) + new /obj/item/ammo_box/magazine/flechette/shredder(src) + new /obj/item/gun/ballistic/automatic/flechette/shredder(src) + new /obj/item/gun/ballistic/automatic/flechette/shredder(src) + new /obj/item/storage/belt/military(src) + new /obj/item/clothing/suit/space/hardsuit/syndi/elite(src) + +///End of Bundle stuff/// \ No newline at end of file diff --git a/icons/obj/guns/cit_guns.dmi b/icons/obj/guns/cit_guns.dmi index 2db84677d2ed3c067a2768f462592125a7624a24..c6b2ffe49f96ecf708714d7d7ac85a93647baf41 100644 GIT binary patch literal 32918 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 literal 11194 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 diff --git a/sound/weapons/magburst.ogg b/sound/weapons/magburst.ogg new file mode 100644 index 0000000000000000000000000000000000000000..33068de0ea92c537078c1785fb21fa68ef3a7b4d GIT binary patch literal 16302 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 AV*mgE literal 0 HcmV?d00001 diff --git a/sound/weapons/magrifle.ogg b/sound/weapons/magrifle.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2ec2e72af6339aae2db927bf4f51faad2d61de82 GIT binary patch literal 18877 zcmeFZcUV(T*C@IZ0)%R4F%&WM78F8}sv(3HigZJjE?v5UqM?T>AiXGEx^xgl0qIEZ z0*X=uL@X#)4A4{~$o?ps`ZYSShTO3|jQOm$#dbpR>QScYxT@=n(3^UB&R~<`4i5 z)=2B2d&%R;W&nTy06Rf3=G!hhVx?(?qQO~d+DD~cso1Qv*j|)lf^^@%E@)XN4gi1w zWKp`L;td`5QN>FrktDwYMK=S5duZA?qZLKE?k~cQ-epZ?9^Rv3LU1MvYH;2FPMa@^ z-T3I@K;er=Cd2y1`wrJBhoe^l{J-ai+*Kl4C?&w{7nbVA_aN5fOZ%Ch{xq5e(_4UoZU0$M5TI`!KGP)WHI31A$O_$0qmRhV+=Hg!KmfPZ5)#5eW zfEjLJ`~w1V6?XJAK!ICM+5aoMSY$Z=?=#MIKpenGu`XFc$3h!_fYr@Bjev z6laX-^^?`|m+kjg0kc*BVK7Z^5H zB*hU${?{q&kGy~r;mdc)a3{lMlI{PHg$xdhDuk;u{>20WPzu-3IpaBdBZ|y9>jf3; zxl>)Srnw>yDzb9_aL{vi(1Wqh}J18y+V znK>E&A`yS2_+OVlqWo8iOH$*+heR8nVTUnCm+GgZN^k3)BGehBK`F+_fl{2UtfYyIs+p57qK&6TNqmyY43DW&} z5e9g=zYPAD=J>Mrr|=A>2Q7=uKFOZnlbvAGFp||b;jo$D2%JJXo5{G%{`)#l|~;D2b&k&5suCar3x!v3e`6o@9hR!9=iNfoq66%Nk0 z6q{3#eP^qpi2lE5j%(b#thjrWxHps}(bx>P*qq7-MV>>oZ`=R3`QMtO%gq=|nwhHpuQdj2 zosrd_k_8Ey4gj10uvStw9m34&kgOQ1<_g#8;pw$j+R7`oPKZes(A0UyXYvdIYt9vf1dsuTt;$` z^Z$VhC##P$)&D=o^nXYAzZCf2QUDZj2s8La;tTmCpkxII5VML)MeBT!B|BPtP`S#b z$F@R3svOIqo%)w{fCl!H>{VWsV`X&7vd8Ywjzzfr+c5;t!C=E35Lo-D;Z4`SKx4b-w*Tuz4pH#gpfr6Af||f^x+wXCOKN*QZWp67Jxq0RW2Mm^ zLP%OsStlU?K@F_6BNrY3l>@Kya_I&8`}ftEgDzk z1_jLvNOtNYvdg;?G0cXp14IBV2z0(u$XE|95{(1>r^+E;%a&BZFt{4q9M9Q^JsP31vX%jaoRZZCA?K)zTyx4Q zDnUzv`vW)=Xmgx$R96XF7w8d?nay0fGuaL7*ItXEGW~ncSx{NI-Cip(41f;QLb|gB z&C1bT0|o$AIw1hM6RtE^-T>#;Z~FkSb2ab-6i^lt?1|E)jE<~$`a*j>yf&Ycv9Y*V zDLr0XDBW01yR^g@OO!0lFs9~9PbF5MON@=hr~&c`1@KFPM@3h|fKQ;e=a}a3O!18% zo+!PM=g-PliUQr63UBQ5pM(`oVYp zp|PJ0$c-aH2@N0dsG_ox9=w|Z2^DqZ?^ag6?QS`u|6HK`;t}!Rws(Sb4|L{iJ2KxG z1^_tk0|4T6_JNVNi|RW;LkB&wmyyzNG0^9t;VVJlwZ)>6|DWOyA%lI$h<|n{@(K3; zlzi#`bJy}e_b>l{mgX%zYMRXf)MykH<2VrdlwcBZ=lXR|6{mrvtgJMv>kWOiLva zIq(UJqC)8zmT@(BiZr~mWZKeG8abv&TUe5287J2A8e|Yy2TsM(nt`u0%`#rH1(oZ` z2Xf5=taFqhHiLEGR6H=m2Vh-&FUliPLp0awsMVuJPHf#@w|>UbvAS8fI3e|@uDW@a zKg}51$8G|aaw4VrzM>qfrQcZIX6^pQYa$5(dw{Ya;FMU=X9)@popVB>3XC^djn zRRC~8C^ZpIGo*bn-Em&>AI3ZY_mH6I^&Lsrkz5&AyWhk33;w#lIU$)6$Ip^o9R%k-@F#k*CTE%5Iu5*e?pi z@z-|-2|^Fz_|rfHx2)`Vy1xx+sUTeGKMf!vaQuH7Kt$j$e|vz1BNsgV2==J(=UQ=8 z0&o9b|2C9@h``FfRY!=x+keLUgDA~d{O>Ke{8AmQegfi>Jq9whDo`zUtRC)<&VoBM z1Z{oOtYuY#-;j<@jk+e+MnTEE4lQ3ZN!J;zHl#z$4~L7dI8-|{ zIFtrIa)%0sxI^_r;^A5Ft7XmKF?hrDT9D6IY~lD-uKl2r#Bi5$IDIywz5WexsLvj- zdiU#=+FNIftKX--(tr6>mi9PvlNdE!!)s6+jT!FdVy!KwxCU%-m$UWPxs0s5EH(Wy z6Lg<=wE)W%Wt>G`ZjbLp?UBBV^ZstO8V$ADhqPW&^6+fE2TgNeNNA8Vp`nfaY$hS@ z#%+d89{33P5uS3}b#$);C=j-j?cIY^2B)UqjA`E+~~EL=iRiviiJvS3(^W=EN1-`KiZIf?%Vb*Auo6OxDbv3i(iRd4D&JbrG6bN*~WsU zFOjIQQhuSSU1)7r{O(Rv0jY&dpt&C7(KZZ!7K3buOQBXKnyz{vIfUW_bbKQ`Eexpu zuE7i9^Iot%WrI)w-#v!VtzW_?1+Ne|K7KDMhXaq}OV83wp|9eS+Mgwkimbs@>_TL2 z<)6vbh0*mNdxO8waXLaV|67vjv>jXa)zwWNkamc^8JpFoCvNzMr(~g8Uu!qEILyDl z*&KSy_o7Ji2sd}k?+ASqH&@lyJJpKF^Btd`_qm#yvYWisIJ9P=^EERA9D#&NHAX0Z zIGRF+)c3(W$O+Cml;!e{9(2%-c{r2JXLbpxsPV>dAuD8JcUS;zy`XD&n6;`sfsjx^ z?i2=e5k+0*1Pw!oE9>c(-s=7b!t_;1MGjL+kceIfOkD|eUzpIrp34)Yf}3JpKcgii zaH*qy@0D|?ZfxuiW;g_1oIc`+AGi_~L!?seCpom+}0US`o`EdrPk`x$&TNCpN0T8JOfP_ z)x)GtHOgw8zNG87^|T8gjLQhf-WjYf<$C;dtB1J)M$${jB31kV4J^(8MNHUFFrJe= z;U%f<-On}E?QJ`Dt?$Q%Uhw+EImWHKW1$5%o1`uBd`EUHptt79%?jQB*9G_9xyt3DPHfRevVzyEF`2>>?|0v%(UV{|?MV`DFk zJ-Tn8uZG=Q9IZ1(|MsH)Hfq|#41S&wsWld9003Ppd}g|SwBSV@_w1sQC0n=QO-{t% zIbUz3t3NO7y6oRV;c+)OK+E?p@$b?RH#b$?S@ zvK!}QMZop)Cv;x5gT|XBCpT&MZgXLG39XC|g^^N%929GyaBG{NKSm=rd>-EN!F2?S zJ%4wASRF@pKB=X-Ph2dh;b0{Q#2ASoo>`>{^mC&R#3U~<4F?oBz6rYUjOa>d{3ci9 z^83Co8?+W)ho75S5;aOn6lIMn_9{}!nP*3!~)+2Q>FVvg&qnxp?!t=f- z-p*Fj?CKH>sM?qA7_){T1q^zd0@RzqDE6l8?mJnrezS*lRqVb^%Lm&axPEqih6%D zc{nk~b-Z$AoE|P|5-Y9&qgGUdnn)y1`6h@>3eI(3I0!Y(XxBcldshFvM%0YpG>j!K z3Dr$DV(@l>T!Ufttn*|$!UW~6^sSqjlbKiElinV$RrqK^?Djgu@E1|YHST6#Jx0V{ z9ZKqz5RKvFE@5UbW3nORBa{Y^O!jJ}9!gsEn;4#i;LAPxq62XkIO_4#v6s=&dM~q^ z!g=Y!5P-aPij$*xgqKpoqaV!|U6nxR`>b_o@t7zNLDg^6YPKCkMO%jl6>^|3^hHem zQaA0k)?8dYRlR_;G%{Wj+<*ex39OhPdto)=4Wf4U+p9qmQBVq2SO~<#v2vPQ4(2{H2U}CRMVM;vt%oUaN`g5;gFLbn=P12Eva#90bijm_MabnoPpA_QStX+ z zJ3dHtymBtJ`LZmH*2+}|vt+&79GvRn$Hb`yP{}`UF+zdQ`*21Su+5)T(bZUh>LjfM z6|*-y)yku=(r+w&YjPK$RlXPl`Z>IwGs_}xk_%|h_gcLPO-q5OUTvRv|84^>A~L3O z=p)O+bgm3lpA{iM>k_|`4F>hl?nc8>cNLkL1^Z>byiK7>G>)Ur9bD_&e{th_jpC=N z`(}HG+iNX{AFp{X{1k0}%Tncv&pcI65-Z?eP7UlUx_I~|U=W0z42K+^UQ5((hoW~ zaMeBQ^uiAB7m4|*$(Wy3iC<@sI>?9L<4>OfrOs2%U*9`Z(=(G3B;ZA2dvKGP!L33% z@5LATD50pgo8L{bgcAbkSNVv~F#5}yS3t?5FvOf@6^3 zHQE|N(vuAR|B(#@`5bu5H#hwMOZ(Ul!y_)c)(A@mDPRwev00SK|=Cw$6%SW`TlQ4 z?G`HDqFZV2a@SqNoiwruUCPoqx{{Ba5UeCzkUcc6#4W~&ra@W4Cl|mEEXC8u=cZBLb1a*dtA_wI4_N@j z-~#+w)LL8=EGrIe>JTL6D=94@^|QnfrX9^~l18^Dd<9A4**S3A%KEr?yE4`{rVs-B zRxUNsiJr2Hx~%xtQdb(vyRy~7-I2wEj0$b>$fv|ADj?!Tl9FF3gE6dWR$}oq%=dsy)%f z7mtm}8LwtYGGkw?Y`e{i=iG6_pfyb`CA@H|`bbpFRj0wL;@mntZjUw1U@R=X>|Zgb z{g`G_ z{gw%988QKgyazpi11mO?5za0PknNx6?18~!z-K#wjFQajinm_<4q4NPqwe`Q|19Ry z?>Q#WL$RK@G=`=ZtcuP1l5N$GTn}4=Sa061nSz!}+`Jtdd75$|hujV`0YJA*E`) zp0XCP9R0+StxZX9Ze=af|Kldq&`_B6ndZ z@CenjsaQ^Aan+`$bD2{DU_^TRgH-7bQv;GZ8-~&LucP}82qpadWNIS}4UU90A|V{a z_%9*ARX;2YiQYoCb&Fn%G~5mo()MMIe#1c(YzM3yinX+=ibW8u=u93!s*7|$K8Or z_j`}$&MKbx;?Zx*)hshz=iFk;R%;*{BWn1nSuI`_<3)v|6KH;&Je!}|OTwQnVGnR| z)gU+2XEOg%Qni=l&kz)0kqGshnp}pqL|5S^Rh@MaXW$_=h7@1EFzp#Qn?QUef|k_B zMNL2eli)}utWi-aMlg3#LHQY>4SXQ*>>bh?Mhe2=8XiJXtQaZpByZe9r( z9Zt$g*p7An}t;tq+DKfOTW{1cLJ1dCug3Q2$~9}pf(E6;Uk{wE-z zb*Oo$b!c^{1pZY4!x9RIif5~5R_6<*fMc>5PnwhHcvm1xnqvmx_S{pgwK(eQ+MH%y zN9IQ^hLy(GRp@M`koPg>cuP&J!gRSr^s3C^Y4^ABnI}8o4`~nHU%UA2+{>Tqj;*2I z!FHwFS)msmbM$W-&1zgpX<)BxT-TEpq8+Mq@J*S;rKzQ$wJmyz(gI#h^s@&UkE`A) zl?=hQjsl!x^NR@)%`r*lw>&ah(*kn38Q3n++02lmF06$gTN>}#7^mUf+UE@)65%Uji~1fbb*gj&rQtR`cpX{ zG$FqLsnvSXwWAukF0L{`*TY@k*9& z%lIq&^MsyGF*hq*|2C*P^84eLB7ok581(F3S1M*s*i zFqovlXc<)p407AM6Iz8JTSz_MGXN{@JB=OA7LvHDFky!3K6#*hcUy@$9mxm!myB{I zbXeR+oO{CH?4)HKgXQ&CqbZlmIDV+bH8fm)$0))aDC>6S`ivPjNbRfKRgI%(D|!S z&ZbJ7nIq*cTO^9tu2O5~Nb$>jVjK!nNXTq8oKag7Z#T!v;MrFBQ{&xzLX6+dOq}Ah z{;Wc*Yf8k0anz90a}cqTIT#(>&Ug_naMbuG(d$h3!;AM5LvD3*M6f^rO8~)yv(YJY z2!lqZ#g#*%q|*vG3W`t&j_x87hTK*s2?LDzrTAe!(eF1z17n#=HQ}sAjtkE$W6Zuh$ zDKXJ{!D2Z1DR=J1f#ytGG3$Z}mXFy@mAq2vY=jWtlI}~=DyNaMT_5Z;dESmm%T=IvGQ5F0f-^n9;siRS#i6PH<_(r@Kx6T(+1%DtJqz6U|PCrfMK3 zrFrWZ?b!K39ES~#i*o@KR<#*zRyvdXXiP@a6nD(L!yB&BkGJi@!h*(^*jwXpYpmob zn9uN)3=6(mHB{d>O?ZF!iaVbJx0BHIE-=9G``V1|;3iWXZ^el~gu1;h8wV)y&Q@9z8&x(CgsV zuHXrq57R325^K+~^wYDy`HGl66^4VU@$uoIX?&@WJmGLG3XT1yQ+3**6Uu<+e#cR! z)7v=!2gp&Zce?d8BB7>}$1|jeTD~|dfTnmDu2SXgrPI(@@OIZvCVH4VZ#=L>n^4rY zW0z{2$7iD!KP7H&yRiyb1Vu#BHoex8Nt!kLHp?{@{J1+-0d(76czltg(PzSNtd;aX zm+tL^S$F1Qi&auM!>F&~TB`3Zcl{<3d=EJhedZcB%M8G&$A0c=7qXBD3Hv0na z{6#i@M;Y@g@4WW>WA0<@pWF;6?pS?36{RvXmZ`G%Xw!Iy#>`!LthiE?e_xzBqQotP znpnPa3Y)jmW>ORmuMjQrz&Euqp_S<(AsGr$LiBVivcRb;K`d=Zc+*w(;(c^yV{MyH zKT)-{z7ILW&wqnUq7L$?eEH@Dxt97$vtG@?{fLbnWWM+C*N~U?;*V@+UHa;6Tkn>r z3!c%st`&~p0$#;8slAe~2zbD%9y<&pHr&~uGu6XukrB~Ky}a~~jD@%!ER8U?Tb~|i z4RgnhFLx5gsd{w*c~a`BwoaVqGl4E=0_z##2Rbs8;?Siw{dC=wU%=Uu_2rghXf-HW zzn{Z|Xtbm-(G||u?zQ)=FlmOM1VlRM4wegg27_(tM*Tj$=N&z1Kh`2VF>BxU+Lcfh z00u9}mwn8?UP*cr#B`}DFi8EO&bi%(wX^B_y-w>Nq@3Sf>Q;^3N(w%8F0aQAJ-2_q z(S6sVBhII0P&M#3JNzx_xu(hy3KstbfKF(I63{QE3 zJ=H5)_=z7LA#pF@qkq`-B+mBm8fXk=){>%zq?8@E!nYVjs`v;JH0LEk<0Nkn6gq3#u-0Yzm$r*(3p93k)Bq zf{SQe2!X(oX*!|jpg{77`$M70d99O)UMvr0;~1AgOY->nnm(hD-7VU+Uk{9h9dfj# z-q5biTh*;WYt<2`savmlx{So7X^HZt>8C)+w9ncid9^$VR+Zrz31*jhEyC`28MQnj$a|w3M-v_y80__Ik1Fbif>)m@+38Di-z11R>fb z;#3{&lP1{cXsMofHRKeHrv~}ib0cg6E=lc|96b^NI`G_b%T6U-K4H?oY;OlCezNPO zz1rRz?bY9D+oHHFVeU{R(Z{u|d30(x&)0OMMCx5rqilkRJ5#<Xe{P1|GnLp1>?&pRsP0ejaov60vG5*ha6(-LUz&DFcHe?J+6%6cdpJe z6e8f53kCy9%f+=g8JTg@(we$()AA0kLA$5esG$3toYwLIX)?$L0Ph%yg*q}2A6)6a zo3*UP1}!jbF=2KpG!)VVJUU7{Bw zfzI5=jvwNEo;oY4u zV+A_)WXAP+9Mw^{TbmEwGR3zjYoz>a(8tcBT>3umV~*sJ_zrb{Hh)2rHJwjHNQrO zJ`y7)&fY0XoC2?ga@#XAe#(YTiB3Eyh+^?9_vr18k zDqT&`eZo8&G@L~Q@~d9Wx11|-i8_c#tA zk_tAv{O?cqqFzPu#uyKs)kdIE4$k3^3x{{ryhMZ3;4LVWzlinkS$~Ulp;e# zT&eNNA5yDAQb}E>xb;jC1WcQ)eo0*S9XgA}WfaafH;!J1ufWBXD!lPLEr21jsNI{7 z%qVPbNw%-2T$nIj_OnvY*gK5%mv0sPatYDZSE<%S(T?B!@O?M8lT`w4PBPy4V0ulU zR4^4@!$$4KR|oGh79&U8sC`KVfIo@xI8v1*NQnzLgi*T+xLdZV**$-G-OwOa{Ia*a zx9aLy7d%GP##%VAoc}A_y$f)+5|1S-=!pW_ zQ!nv$`p3R`@^@ z^1+=Ez$1veli(hh$w1f84S+Ms#>&J&1QXyaG~D(SmgQ&i$sRpvbu?F_y5n(<9!_fJ zhK{d@uZ@351Q zhB=E)ZIpt@d!lZf?~_gHV}olHTkJ@Y{{4$Cl)dU|hG!p&wg}I{K#zviBi;B5NIV7U z-Je5Ca|q|b3s2*N6@NUx>HYgvcZhrcCHefqiqja!U*qvFlipcuydK(G|MsmQfs0;^ z(|O?(gGbq;X^LT2T0%*>XGDw}<$eNkh1zlBYl3H!W}G1kXwrO{+6cE@+V^byB|^wO zEvRvy^W_2T_l<1cV>J$Ko8Bq!!kWb>6C-O(Wfw?0n8NYJns5bu_w1~ROYr3vXX z>`eJGUN1hgmYDwdcFIa#UbIvL{?(LHoV*z?NL;rUx=E|g%5If9$1#Ocq>6(4D^QUM z(gI9Jfr_Iu6+5&IPq@Iq#Q8%V@T3G03{v0^RS%WHa}$_Dw!_npx7ka3q9cm%%nzH* z!Si2GbAhY3yJPtqklv z|MHa3kCW&5`&#<=qko*{(=c7FE}1N6S=a9w65|)Q)BvQDztqThy#0EtrZG~2`_k-7 zBd@!&fd}K*A^3#_fH@`1$Ffn34_#*mtO+b3Jv;R+qAMPbn@NP%oPw(Us^iXO4SBDc z4YYNIIN}UQur4%oi|t?p!H4T~W(CfWJEfuMP`X!H{-8%Q-};OKIVhHTR^QvO&H(}L z{77q-RoBN+E8`x_Bdv(X$kg7BS4i=T9*6Um*M5I&;9K8*I;WXSD#X0ul;l+XM6g2b{X^Sh53+~c;1^qV_3DvzBAiB5hCIjt zqK1Nz0;i4icW6~*SYY|phBIPYNy3}y0_%4oH@BMHF#|oE3_W@*kAt@rT3?!*4<;&w z=!R=V!db*Vifgo8%5-2*Og?EnB3fAs-|NN zCE&?=@544@i;Paav=Ljy3B|iQRWpK02H-G^Qa$gEZzu7wRs<}M^RemcdC%9kEztl} zqK6-y$G1^*%Aa)3geSP}r*Ufw0G(->QDYn!plCz_2YQb`K6kWGF;kMGcFpfiH@psq ze$W(O72I2$hibnG4&ZrAcB?sEe=i@-M_sfb58A5&8^NTxul8CGU)$_>hD5Yv%8zzL zEL^%@-#ltDdx7V^>Wf9m%7xxX+pS|W)ef&%t-{LeES5VCu7jtJUUu7`8%Xu|zurl@zVYFDBJ_EnB}yZ(Qny2@oYh1AK2+3=`(C$R#i zXufY$>2N;YXk)Z7i?EsdK{o)wNsw{jY8)DzDLn=Hg*M<%szL;V_w99q1RX+};J8(m z>AP(TH9~7<(yTk2!8f~z#{XVy7r9Fw$n@%0pn)~;lSyJ~Qqac41KIAq=Plq561Lk3 zrNUdV0JtBaetcp&4au+V5~5@FDKateDSV;SYQ*T~t zNq*fsDBc;`&v@|l!QjtHtAjLwlZ{WU6r(_vrIkYbKx3DTxkJQ4NCtLULE2ZSS~V@dUZ!1{bnd<*>v+RgV-U5E?zi!CL>|#rele_dZ6LC8pnd6QZP-kgK{O!Su~)H3zGkRHfRKcK`7nCh;CO zY5U>jF&)V-7b`re<&o0B&4TVO9Oa+3e(Eu!A9z zlf%<+{9juiuxgP$4P6iY7}UP;D3nj~z~m6c5MFO?*ksxMmW&}B`+2Ks@cu{F_QK~0 z1XIUi2~FAvXAGcKoFYdQX2$9ydiU#Tk%Fi;x@|ANB+nzsu-^~?2B`^h3Y760N7mLx z9+Gqn!Nqp=w70Q{FYvg%I+U^9j;eTebH`Fiz!ep}=z2?!2j6xoade>LYlW*wQ;0-8 z!u?e-NH+z`i@G~oPvYX3?<&%p? z=WAX<_Kafgigh*&T8o)j+a!euL}(zSXvT|@Ei?j~Dw?m*slgqcI6H9#^)S6O^H8_C z+te;IaErA!0@YlKlH(Q9;{y?RM2Q;U87~}uO0%A+4rQO5JT4BtvPuK1lHAcn{aWaL zljC$uEmH7N1A$APQ(3j^P1C0XUVZ?IMsAzY?1*&JoTgC99eA5z<-P#^7itL>7zVKh&^)_7N~*ZsVB;{GEa2hJ7~Pel_#j1U>7dJg|NHwBTI;ud zA68YJ^LwB(=XvHd@2s0JBWbaBLrITYKQWW~!bbW?mtInu6FvRS@`?oN5;M1)pSbT5^XtXmbGLtwxcfz7Sl|OnqgyVRJws)Fv)=uqA+s{>Qky=R-!c zU!W}!{k+_?FL{NUdt(CL^juE^#rhTuFWL_A^z-&W=t_Fd9-H$=sr6_NR$JdL7Ii%>S5l{k68>@;n7aKlToly^8n5(l-*R)Wq{ho3Ecj_?< zjLB2QJNuT07dJn$>^Ya+`LtYDhcIi2-NvLzpKJY6bEUy5F1sYRkp5U1O~3k;eJisG zEWb?p2cv4jJ_ExgyZR4M0j;EZwPh{_Pc|6B$&PDkkjpU+DJ$Tigaam7;e0=bf4E4X zs}q{^Bi2Zw08}5|#{DIxhDIU_Sr=a5OeKtVf-o}CNH9W&1i*|+JI_+#*!RWp9dMyMdx0w?L+hEuhu^mMVN}eV8sG(o*R?;h!Obf z3(i+&?zF5NlLNJPz1%n|JINVOgk0(L?0P82Trsl6TK3?FL(3`y#%emCAgn=Fk=1~At~rep-F zX_R3+Ntk2^8*AzsFFl+SNhigJz9hP2evLQ{udrGY0!X5{kDujZDC>^6*Ue1hz#I** z%5W8U>wLlSEyeWXQ+f&q0Pq{aT^3ZB>gjMmH7?+<|)T3;sQUnHpUh;?w|NUn7F2_=h`X_BViSK}UUa@)5O`qFlZ_rKI*+Rn*gNax!V!eY!Kg8X94~(nhuR1M z2M3q31?S_SlnMJ@d?EeDpjA%8(o-O~*@E)!yVUL0PlvX9vukz>x6kE&^H`#|-SD`i z5JZ6sAS)gxTMee5hDK|XvvVR0?%4xkG1iPWrMBrBizb}*3h_VJU6|aT1w?anLSNCt zCo47eUMeQ8MtLit>TAvCziqOUXZ6HZUeTL--!gB2yh;Vo9~AV~lv*NY^4v11J!JNGtdAL%JjV130`!s$xKoU7|%h;lS)(!*QtO4t>BB0 zUjFx&4tTuAh0TOaj^3Uliwj1ki}$>3uH6=zy}?$QUA*8ot^YW!*}MGx>Z8*J3>mkT z3U-hepNC_c>1;b!V|I>dp9~Db?lf7sKW7XMPkQay#nZGP-Y%ruZZDh6#WUVx5_~KX zqjfJoJ!0HnQ5d*fDyuC})XLp0b&7`nUa5p&y{yoczDhSGOc*3;81xc}+0{?cCe%1a zO~8p7-4J2|66^*yl z8r-*oIrLD>?=(3=06Z1qJ&as*pKLOBwcQgRH4t&0UDXGlBAD%>dUky6ba;bb@#U2i z{cdHScwPPEY9ZiE<=@BwjOIQ_4lo@>4#1@dP`tQzgYi)Eko!>lknd3JP|MbBXO*W1 z!seJ z!AfetVw)Pc639;N1Ys#RU>eY_67|FZ&{*oaCe!0x2w8eWBm-1R0N{})AHSlDqVZ%S zVp=*`*l$}qB6v{A>RRMQ>0)76Hz#HR#(lGUjj>JGKG<; z?ILZZa`tID&(ytghvQUwHL{w0smQ>?!Y2u2h^#7b!!^N|$uB%sW605uUAH}WQ;2*S zAit{fS-f}u{fC}fL1CASAs+CBOhD8rysddBXLqmhvTH!V{8=0#)pn`io_S=hFeB6S zvnS6VTRr`fD|3O@+oELlamZKwZ0@JKIa-9Xf^y}9GwEgwsrN>LOY)OF{5<;Z7`#cw z$b5#ut|n$PTGVxwmXFh$I?;~XwO=xirKyp3N@9OXp?l~@2f(=@q`2rvej5g<^w$O& zXgMfS$_|Gl6yo|gOQrEJD$SnK%9r!G)(B=5C^wvcwG(*HDpp$r^R0E&y~`7^RP8Ua z_>BGp+|vh{huCeY&aF4szCxcsb2H3(9G4Mkv=i+MEio}k`3y<{aIOLU5J-C*H&a

EyBQA>0q4EqKg<0Pjw!*v(CP zO4NCvyHUn>X)Q;~DUQua7Rlh)09lN)JNB|V0W}>fD&y>h^?mciikh)dSzS#{C$FI3 z3zU96g0A$WYjao2G1PF}4t)y5bO!%z2;r+)A5sG4N3IM6SqI}Vc-Yf?B4?7kF1-coqXsK@px#Q?KS*DKP)!TrCi{rCERLJZ za8q0Sf}e{5u)Tnd&cv4m@luel_pzWptO^xtwi-L(|wc47zxXQMUNGe`T zo0&6XSHOUX<7?rZ^ux~d2ltXL`iw;vI9DX`p~Pgj9}7}8&}kupKRv*kpq*#|f-4lC z3PMQhz1A2HNBn#bJFiC?{g5qSM&TWgPOz+sKO0&u`CLuT%WF4f3{Vso>kgS^w{*Vc zO*0PZ_typ>UwoDIDI0zBa>Lfv)_QHgoMssHBOoCQftuj3cna2bDR!^c{y2auftu|k zvR)FLyiorb)N|iw@yB9DV;OC;swKYx3BYkiG-G7BJyAK2VyCCq3o`A*o#~#mhbCbT z^2e?m6Co#l8S2=t_Z9FYo;z}ME5c}sRHv&!I{2=3=cgeM1?%sG0sFQQz;1Vn*I{X{ z{{6SL5>$lnUzqg_FI-xAx=Whim^gQY`ZndI^7qyK&bOt%)0Xp)t)0@cG3gdFX}?n6 z%`Iebc2WC=mRmXdC^~U&bT`A=T_c{aTc)5WBO)T^h1#jyuvo zY*3ZD9=xotgMn3v@D0jQk-XO)jN@!Pe`V*dd{^GZf`x+Ke>OBA0vi1SmXMcNSnk>t z+OAa;kz~OfX6jYC;vJQ;T8Ug+<;s-d{w9K}A4t1o{$&{sa4wf=w~ln}&L&PYv;BGS z;Naljn#uYVqQ+ahGx4o{h+;&>uM{Tu<$*w%g5>+2L+5M(ADUarU1Qf&j^jUDV+$%B z>1G%Y(RCzvMV8U33*7s$x;5AMK3NCK=4}9|=%~z($sI_C109-b0)2+O}2k;oifJFKi-HUT3AP5Bxq^3pl-PuB3j0wFM-FhdJ-klKPf+G)J;It5|j zkkS$gf59AH&%ni{X?qlbt3A_ItmifpNGQy{!q+4PCb)e!upM@~Nx1L>pt3aov RMmRSEs4HtJl_^+;{Vzv9zmNa` literal 9167 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 Date: Wed, 27 Sep 2017 16:27:09 -0500 Subject: [PATCH 037/136] Update construction_datum.dm --- .../helper_datums/construction_datum.dm | 106 ------------------ 1 file changed, 106 deletions(-) diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index a0885ae373..7768a929da 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -1,108 +1,3 @@ -<<<<<<< HEAD -#define FORWARD -1 -#define BACKWARD 1 - -/datum/construction - var/list/steps - var/atom/holder - var/result - var/list/steps_desc - -/datum/construction/New(atom) - ..() - holder = atom - if(!holder) //don't want this without a holder - qdel(src) - set_desc(steps.len) - return - -/datum/construction/proc/next_step() - steps.len-- - if(!steps.len) - spawn_result() - else - set_desc(steps.len) - return - -/datum/construction/proc/action(atom/used_atom,mob/user) - return - -/datum/construction/proc/check_step(atom/used_atom,mob/user) //check last step only - var/valid_step = is_right_key(used_atom) - if(valid_step) - if(custom_action(valid_step, used_atom, user)) - next_step() - return 1 - return 0 - -/datum/construction/proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type. - var/list/L = steps[steps.len] - if(istype(used_atom, L["key"])) - return steps.len - return 0 - -/datum/construction/proc/custom_action(step, used_atom, user) - return 1 - -/datum/construction/proc/check_all_steps(atom/used_atom,mob/user) //check all steps, remove matching one. - for(var/i=1;i<=steps.len;i++) - var/list/L = steps[i]; - if(istype(used_atom, L["key"])) - if(custom_action(i, used_atom, user)) - steps[i]=null;//stupid byond list from list removal... - listclearnulls(steps); - if(!steps.len) - spawn_result() - return 1 - return 0 - - -/datum/construction/proc/spawn_result() - if(result) - new result(get_turf(holder)) - qdel(holder) - return - -/datum/construction/proc/set_desc(index as num) - var/list/step = steps[index] - holder.desc = step["desc"] - return - -/datum/construction/reversible - var/index - -/datum/construction/reversible/New(atom) - ..() - index = steps.len - return - -/datum/construction/reversible/proc/update_index(diff as num) - index+=diff - if(index==0) - spawn_result() - else - set_desc(index) - return - -/datum/construction/reversible/is_right_key(atom/used_atom) // returns index step - var/list/L = steps[index] - if(istype(used_atom, L["key"])) - return FORWARD //to the first step -> forward - else if(L["backkey"] && istype(used_atom, L["backkey"])) - return BACKWARD //to the last step -> backwards - return 0 - -/datum/construction/reversible/check_step(atom/used_atom,mob/user) - var/diff = is_right_key(used_atom) - if(diff) - if(custom_action(index, diff, used_atom, user)) - update_index(diff) - return 1 - return 0 - -/datum/construction/reversible/custom_action(index, diff, used_atom, user) - return 1 -======= #define FORWARD -1 #define BACKWARD 1 @@ -214,4 +109,3 @@ /datum/construction/reversible/custom_action(index, diff, used_atom, user) return 1 ->>>>>>> e632dee... Adds installing cells as part of mech construction and fixes some mech construction bugs. (#30942) From 31a916436260c46e4614809c54bd32d89dda47e1 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 27 Sep 2017 16:27:21 -0500 Subject: [PATCH 038/136] Update combat.dm --- code/game/mecha/combat/combat.dm | 42 -------------------------------- 1 file changed, 42 deletions(-) diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index a8977dd7c1..626c405284 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -1,42 +1,3 @@ -<<<<<<< HEAD -/obj/mecha/combat - force = 30 - internal_damage_threshold = 50 - armor = list(melee = 30, bullet = 30, laser = 15, energy = 20, bomb = 20, bio = 0, rad = 0, fire = 100, acid = 100) - -/obj/mecha/combat/CheckParts(list/parts_list) - ..() - var/obj/item/stock_parts/capacitor/C = locate() in contents - var/obj/item/stock_parts/scanning_module/SM = locate() in contents - step_energy_drain = 20 - (5 * SM.rating) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best - armor["energy"] += (C.rating * 10) //Each level of capacitor protects the mech against emp by 10% - qdel(C) - qdel(SM) - -/obj/mecha/combat/moved_inside(mob/living/carbon/human/H) - if(..()) - if(H.client && H.client.mouse_pointer_icon == initial(H.client.mouse_pointer_icon)) - H.client.mouse_pointer_icon = 'icons/mecha/mecha_mouse.dmi' - return 1 - else - return 0 - -/obj/mecha/combat/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc,mob/user) - if(..()) - if(occupant.client && occupant.client.mouse_pointer_icon == initial(occupant.client.mouse_pointer_icon)) - occupant.client.mouse_pointer_icon = 'icons/mecha/mecha_mouse.dmi' - return 1 - else - return 0 - - -/obj/mecha/combat/go_out() - if(occupant && occupant.client && occupant.client.mouse_pointer_icon == 'icons/mecha/mecha_mouse.dmi') - occupant.client.mouse_pointer_icon = initial(occupant.client.mouse_pointer_icon) - ..() - - -======= /obj/mecha/combat force = 30 internal_damage_threshold = 50 @@ -63,6 +24,3 @@ if(occupant && occupant.client && occupant.client.mouse_pointer_icon == 'icons/mecha/mecha_mouse.dmi') occupant.client.mouse_pointer_icon = initial(occupant.client.mouse_pointer_icon) ..() - - ->>>>>>> e632dee... Adds installing cells as part of mech construction and fixes some mech construction bugs. (#30942) From 68f3b5e719daf2477f68f289d5533f6ece46bfae Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 27 Sep 2017 19:10:26 -0500 Subject: [PATCH 039/136] Update time.dm --- code/__HELPERS/time.dm | 55 ------------------------------------------ 1 file changed, 55 deletions(-) diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 630d87a82a..e3ce12397e 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -1,57 +1,3 @@ -<<<<<<< HEAD -//Returns the world time in english -/proc/worldtime2text() - return gameTimestamp("hh:mm:ss", world.time) - -/proc/time_stamp(format = "hh:mm:ss", show_ds) - var/time_string = time2text(world.timeofday, format) - return show_ds ? "[time_string]:[world.timeofday % 10]" : time_string - -/proc/gameTimestamp(format = "hh:mm:ss", wtime=null) - if(!wtime) - wtime = world.time - return time2text(wtime - GLOB.timezoneOffset + SSticker.gametime_offset - SSticker.round_start_time, format) - -/* Returns 1 if it is the selected month and day */ -/proc/isDay(month, day) - if(isnum(month) && isnum(day)) - var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month - var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day - if(month == MM && day == DD) - return 1 - - // Uncomment this out when debugging! - //else - //return 1 - -//returns timestamp in a sql and ISO 8601 friendly format -/proc/SQLtime(timevar) - if(!timevar) - timevar = world.realtime - return time2text(timevar, "YYYY-MM-DD hh:mm:ss") - - -GLOBAL_VAR_INIT(midnight_rollovers, 0) -GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) -/proc/update_midnight_rollover() - if (world.timeofday < GLOB.rollovercheck_last_timeofday) //TIME IS GOING BACKWARDS! - return GLOB.midnight_rollovers++ - return GLOB.midnight_rollovers - -/proc/weekdayofthemonth() - var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day - switch(DD) - if(8 to 13) - return 2 - if(14 to 20) - return 3 - if(21 to 27) - return 4 - if(28 to INFINITY) - return 5 - else - return 1 -======= //Returns the world time in english /proc/worldtime2text() return gameTimestamp("hh:mm:ss", world.time) @@ -200,4 +146,3 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) day = "1 day" return "[day][hour][minute][second]" ->>>>>>> 74f5a8c... DisplayTimeText mk2 (#30969) From 1ea098b80503e0f57658e4e66b38a240b21c6ca9 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 27 Sep 2017 19:10:48 -0500 Subject: [PATCH 040/136] Update pod.dm --- code/game/machinery/computer/pod.dm | 148 ---------------------------- 1 file changed, 148 deletions(-) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 48103a455f..7cb1304326 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -1,150 +1,3 @@ -<<<<<<< HEAD -/obj/machinery/computer/pod - name = "mass driver launch control" - desc = "A combined blastdoor and mass driver control unit." - var/obj/machinery/mass_driver/connected = null - var/title = "Mass Driver Controls" - var/id = 1 - var/timing = 0 - var/time = 30 - var/range = 4 - - -/obj/machinery/computer/pod/Initialize() - . = ..() - for(var/obj/machinery/mass_driver/M in range(range, src)) - if(M.id == id) - connected = M - - -/obj/machinery/computer/pod/proc/alarm() - if(stat & (NOPOWER|BROKEN)) - return - - if(!connected) - say("Cannot locate mass driver connector. Cancelling firing sequence!") - return - - for(var/obj/machinery/door/poddoor/M in range(range, src)) - if(M.id == id) - M.open() - - sleep(20) - for(var/obj/machinery/mass_driver/M in range(range, src)) - if(M.id == id) - M.power = connected.power - M.drive() - - sleep(50) - for(var/obj/machinery/door/poddoor/M in range(range, src)) - if(M.id == id) - M.close() - -/obj/machinery/computer/pod/attack_hand(mob/user) - if(..()) - return - - var/dat = "" - user.set_machine(src) - if(connected) - var/d2 - if(timing) //door controls do not need timers. - d2 = "Stop Time Launch" - else - d2 = "Initiate Time Launch" - var/second = time % 60 - var/minute = (time - second) / 60 - dat += "


\nTimer System: [d2]\nTime Left: [minute ? "[minute]:" : null][second] - - + +" - var/temp = "" - var/list/L = list( 0.25, 0.5, 1, 2, 4, 8, 16 ) - for(var/t in L) - if(t == connected.power) - temp += "[t] " - else - temp += "[t] " - dat += "
\nPower Level: [temp]
\nFiring Sequence
\nTest Fire Driver
\nToggle Outer Door
" - else - dat += "
\nToggle Outer Door
" - dat += "

Close" - add_fingerprint(usr) - var/datum/browser/popup = new(user, "computer", title, 400, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) - popup.open() - - -/obj/machinery/computer/pod/process() - if(!..()) - return - if(timing) - if(time > 0) - time = round(time) - 1 - else - alarm() - time = 0 - timing = 0 - updateDialog() - - -/obj/machinery/computer/pod/Topic(href, href_list) - if(..()) - return - if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) - usr.set_machine(src) - if(href_list["power"]) - var/t = text2num(href_list["power"]) - t = min(max(0.25, t), 16) - if(connected) - connected.power = t - if(href_list["alarm"]) - alarm() - if(href_list["time"]) - timing = text2num(href_list["time"]) - if(href_list["tp"]) - var/tp = text2num(href_list["tp"]) - time += tp - time = min(max(round(time), 0), 120) - if(href_list["door"]) - for(var/obj/machinery/door/poddoor/M in range(range, src)) - if(M.id == id) - if(M.density) - M.open() - else - M.close() - if(href_list["drive"]) - for(var/obj/machinery/mass_driver/M in range(range, src)) - if(M.id == id) - M.power = connected.power - M.drive() - updateUsrDialog() - - -/obj/machinery/computer/pod/old - name = "\improper DoorMex control console" - title = "Door Controls" - icon_state = "oldcomp" - icon_screen = "library" - icon_keyboard = null - - -/obj/machinery/computer/pod/old/syndicate - name = "\improper ProComp Executive IIc" - desc = "The Syndicate operate on a tight budget. Operates external airlocks." - title = "External Airlock Controls" - req_access = list(ACCESS_SYNDICATE) - -/obj/machinery/computer/pod/old/syndicate/attack_hand(mob/user) - if(!allowed(user)) - to_chat(user, "Access denied.") - return - else - ..() - - -/obj/machinery/computer/pod/old/swf - name = "\improper Magix System IV" - desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorceror's Edition" -======= /obj/machinery/computer/pod name = "mass driver launch control" desc = "A combined blastdoor and mass driver control unit." @@ -288,4 +141,3 @@ /obj/machinery/computer/pod/old/swf name = "\improper Magix System IV" desc = "An arcane artifact that holds much magic. Running E-Knock 2.2: Sorceror's Edition" ->>>>>>> 74f5a8c... DisplayTimeText mk2 (#30969) From f3da8a48a07da1394a9c7e2fcaed9a1be96f90f0 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 27 Sep 2017 19:11:11 -0500 Subject: [PATCH 041/136] Update critter.dm --- .../crates_lockers/crates/critter.dm | 42 +------------------ 1 file changed, 1 insertion(+), 41 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/crates/critter.dm b/code/game/objects/structures/crates_lockers/crates/critter.dm index 579ebd45c7..5261bb5332 100644 --- a/code/game/objects/structures/crates_lockers/crates/critter.dm +++ b/code/game/objects/structures/crates_lockers/crates/critter.dm @@ -1,42 +1,3 @@ -<<<<<<< HEAD -/obj/structure/closet/crate/critter - name = "critter crate" - desc = "A crate designed for safe transport of animals. It has an oxygen tank for safe transport in space." - icon_state = "crittercrate" - horizontal = FALSE - allow_objects = FALSE - breakout_time = 1 - material_drop = /obj/item/stack/sheet/mineral/wood - material_drop_amount = 4 - delivery_icon = "deliverybox" - var/obj/item/tank/internals/emergency_oxygen/tank - -/obj/structure/closet/crate/critter/New() - ..() - tank = new - -/obj/structure/closet/crate/critter/Destroy() - var/turf/T = get_turf(src) - if(tank) - tank.forceMove(T) - tank = null - - return ..() - -/obj/structure/closet/crate/critter/update_icon() - cut_overlays() - if(opened) - add_overlay("crittercrate_door_open") - else - add_overlay("crittercrate_door") - if(manifest) - add_overlay("manifest") - -/obj/structure/closet/crate/critter/return_air() - if(tank) - return tank.air_contents - else -======= /obj/structure/closet/crate/critter name = "critter crate" desc = "A crate designed for safe transport of animals. It has an oxygen tank for safe transport in space." @@ -74,5 +35,4 @@ if(tank) return tank.air_contents else ->>>>>>> 74f5a8c... DisplayTimeText mk2 (#30969) - return loc.return_air() \ No newline at end of file + return loc.return_air() From 388bf09c89ce98443802c8f7d79cd05d5641386b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 27 Sep 2017 22:45:52 -0500 Subject: [PATCH 042/136] Automatic changelog generation for PR #2956 [ci skip] --- html/changelogs/AutoChangeLog-pr-2956.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2956.yml diff --git a/html/changelogs/AutoChangeLog-pr-2956.yml b/html/changelogs/AutoChangeLog-pr-2956.yml new file mode 100644 index 0000000000..4ec2f2aaa0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2956.yml @@ -0,0 +1,5 @@ +author: "GLA Coding" +delete-after: True +changes: + - tweak: "Cells must now be installed in mechs when being constructed, this step is always before the application of internal armor." + - bugfix: "Combat mechs now get stats upgrades from their scanning modules and capacitors" From 612707c999741d8753f5a882767017331da3da7e Mon Sep 17 00:00:00 2001 From: Augustfox <32084312+Augustfox@users.noreply.github.com> Date: Wed, 27 Sep 2017 23:45:15 -0500 Subject: [PATCH 043/136] Alphabetize hair and facial hair in char creation :cl: Reordered hair in a semi-alphabetized list for easier use in character creation. Alphabetized facial hair for easier use in character creation. /:cl: No names or content changed other then order in list. --- .../mob/dead/new_player/sprite_accessories.dm | 849 ++++++++++-------- 1 file changed, 451 insertions(+), 398 deletions(-) diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index 1eb1379dce..03b7fd53ec 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -67,30 +67,317 @@ /datum/sprite_accessory/hair icon = 'icons/mob/human_face.dmi' // default icon for all hairs -/datum/sprite_accessory/hair/short - name = "Short Hair" // try to capatilize the names please~ // try to spell - icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you +//Place in order by major style E.G "Afro, Bun, Ponytail" +//Place different versions under the same style E.G "Bun > Large Bun, Ponytail > Long Ponytail" +//A -/datum/sprite_accessory/hair/shorthair2 - name = "Short Hair 2" - icon_state = "hair_shorthair2" +/datum/sprite_accessory/hair/afro + name = "Afro" // try to capatilize the names please~ // try to spell + icon_state = "hair_afro" // you do not need to define _s or _l sub-states, game automatically does this for you -/datum/sprite_accessory/hair/shorthair3 - name = "Short Hair 3" - icon_state = "hair_shorthair3" +/datum/sprite_accessory/hair/afro2 + name = "Afro 2" + icon_state = "hair_afro2" + +/datum/sprite_accessory/hair/afro_large + name = "Big Afro" + icon_state = "hair_bigafro" + +/datum/sprite_accessory/hair/antenna + name = "Ahoge" + icon_state = "hair_antenna" +//B + +/datum/sprite_accessory/hair/bald + name = "Bald" + icon_state = null + +/datum/sprite_accessory/hair/balding + name = "Balding Hair" + icon_state = "hair_e" + +/datum/sprite_accessory/hair/longbangs + name = "Long Bangs" + icon_state = "hair_lbangs" + +/datum/sprite_accessory/hair/bedhead + name = "Bedhead" + icon_state = "hair_bedhead" + +/datum/sprite_accessory/hair/bedhead2 + name = "Bedhead 2" + icon_state = "hair_bedheadv2" + +/datum/sprite_accessory/hair/bedhead3 + name = "Bedhead 3" + icon_state = "hair_bedheadv3" + +/datum/sprite_accessory/hair/beehive + name = "Beehive" + icon_state = "hair_beehive" + +/datum/sprite_accessory/hair/beehive2 + name = "Beehive 2" + icon_state = "hair_beehivev2" + +/datum/sprite_accessory/hair/bob + name = "Bob" + icon_state = "hair_bobcut" + +/datum/sprite_accessory/hair/bobcurl + name = "Bobcurl" + icon_state = "hair_bobcurl" + +/datum/sprite_accessory/hair/bob + name = "Bob Hair" + icon_state = "hair_bob" + +/datum/sprite_accessory/hair/bob2 + name = "Bob Hair 2" + icon_state = "hair_bob2" + +/datum/sprite_accessory/hair/boddicker + name = "Boddicker" + icon_state = "hair_boddicker" + +/datum/sprite_accessory/hair/bowl + name = "Bowl" + icon_state = "hair_bowlcut" + +/datum/sprite_accessory/hair/braided + name = "Braided" + icon_state = "hair_braided" + +/datum/sprite_accessory/hair/front_braid + name = "Braided front" + icon_state = "hair_braidfront" + +/datum/sprite_accessory/hair/braidtail + name = "Braided Tail" + icon_state = "hair_braidtail" + +/datum/sprite_accessory/hair/lowbraid + name = "Low Braid" + icon_state = "hair_hbraid" + +/datum/sprite_accessory/hair/not_floorlength_braid + name = "High Braid" + icon_state = "hair_braid2" + +/datum/sprite_accessory/hair/shortbraid + name = "Short Braid" + icon_state = "hair_shortbraid" + +/datum/sprite_accessory/hair/braid + name = "Floorlength Braid" + icon_state = "hair_braid" + +/datum/sprite_accessory/hair/business + name = "Business Hair" + icon_state = "hair_business" + +/datum/sprite_accessory/hair/business2 + name = "Business Hair 2" + icon_state = "hair_business2" + +/datum/sprite_accessory/hair/business3 + name = "Business Hair 3" + icon_state = "hair_business3" + +/datum/sprite_accessory/hair/business4 + name = "Business Hair 4" + icon_state = "hair_business4" + +/datum/sprite_accessory/hair/bun + name = "Bun Head" + icon_state = "hair_bun" + +/datum/sprite_accessory/hair/bun2 + name = "Bun Head 2" + icon_state = "hair_bunhead2" + +/datum/sprite_accessory/hair/largebun + name = "Large Bun" + icon_state = "hair_largebun" + +/datum/sprite_accessory/hair/buzz + name = "Buzzcut" + icon_state = "hair_buzzcut" + +//C + +/datum/sprite_accessory/hair/crew + name = "Crewcut" + icon_state = "hair_crewcut" + +/datum/sprite_accessory/hair/combover + name = "Combover" + icon_state = "hair_combover" + +/datum/sprite_accessory/hair/curls + name = "Curls" + icon_state = "hair_curls" + +//D + +/datum/sprite_accessory/hair/devillock + name = "Devil Lock" + icon_state = "hair_devilock" + +/datum/sprite_accessory/hair/dreadlocks + name = "Dreadlocks" + icon_state = "hair_dreads" + +/datum/sprite_accessory/hair/drillhair + name = "Drill Hair" + icon_state = "hair_drillhair" + +//E + +/datum/sprite_accessory/hair/emo + name = "Emo" + icon_state = "hair_emo" + +/datum/sprite_accessory/hair/longemo + name = "Long Emo" + icon_state = "hair_longemo" + +//F + +/datum/sprite_accessory/hair/feather + name = "Feather" + icon_state = "hair_feather" + +/datum/sprite_accessory/hair/sargeant + name = "Flat Top" + icon_state = "hair_sargeant" + +/datum/sprite_accessory/hair/bigflattop + name = "Big Flat Top" + icon_state = "hair_bigflattop" + +/datum/sprite_accessory/hair/fag + name = "Flow Hair" + icon_state = "hair_f" + +/datum/sprite_accessory/hair/longfringe + name = "Long Fringe" + icon_state = "hair_longfringe" + +/datum/sprite_accessory/hair/longestalt + name = "Longer Fringe" + icon_state = "hair_vlongfringe" + +//G + +/datum/sprite_accessory/hair/gelled + name = "Gelled Back" + icon_state = "hair_gelled" + +/datum/sprite_accessory/hair/gentle + name = "Gentle" + icon_state = "hair_gentle" + +//H /datum/sprite_accessory/hair/cut name = "Cut Hair" icon_state = "hair_c" -/datum/sprite_accessory/hair/long - name = "Shoulder-length Hair" - icon_state = "hair_b" +/datum/sprite_accessory/hair/halfbang + name = "Half-banged Hair" + icon_state = "hair_halfbang" + +/datum/sprite_accessory/hair/halfbang2 + name = "Half-banged Hair 2" + icon_state = "hair_halfbang2" + +/datum/sprite_accessory/hair/hedgehog + name = "Hedgehog Hair" + icon_state = "hair_hedgehog" + +/datum/sprite_accessory/hair/hitop + name = "Hitop" + icon_state = "hair_hitop" + +/datum/sprite_accessory/hair/himecut + name = "Hime Cut" + icon_state = "hair_himecut" + +/datum/sprite_accessory/hair/himecut2 + name = "Hime Cut 2" + icon_state = "hair_himecut2" + +/datum/sprite_accessory/hair/himeup + name = "Hime Updo" + icon_state = "hair_himeup" + +//I + +//J + +/datum/sprite_accessory/hair/jensen + name = "Jensen Hair" + icon_state = "hair_jensen" + +//K + +/datum/sprite_accessory/hair/keanu + name = "Keanu Hair" + icon_state = "hair_keanu" + +/datum/sprite_accessory/hair/kusangi + name = "Kusanagi Hair" + icon_state = "hair_kusanagi" + +//L /datum/sprite_accessory/hair/longer name = "Long Hair" icon_state = "hair_vlong" +/datum/sprite_accessory/hair/long + name = "Long Hair 1" + icon_state = "hair_long" + +/datum/sprite_accessory/hair/long2 + name = "Long Hair 2" + icon_state = "hair_long2" + +/datum/sprite_accessory/hair/longest + name = "Very Long Hair" + icon_state = "hair_longest" + +//M + +/datum/sprite_accessory/hair/megaeyebrows + name = "Mega Eyebrows" + icon_state = "hair_megaeyebrows" + +/datum/sprite_accessory/hair/messy + name = "Messy" + icon_state = "hair_messy" + +/datum/sprite_accessory/hair/mohawk + name = "Mohawk" + icon_state = "hair_d" + +/datum/sprite_accessory/hair/reversemohawk + name = "Reverse Mohawk" + icon_state = "hair_reversemohawk" + +//N + +//O + +/datum/sprite_accessory/hair/odango + name = "Odango" + icon_state = "hair_odango" + +/datum/sprite_accessory/hair/ombre + name = "Ombre" + icon_state = "hair_ombre" + /datum/sprite_accessory/hair/over_eye name = "Over Eye" icon_state = "hair_shortovereye" @@ -103,29 +390,39 @@ name = "Very Long Over Eye" icon_state = "hair_longest2" -/datum/sprite_accessory/hair/longest - name = "Very Long Hair" - icon_state = "hair_longest" +//P -/datum/sprite_accessory/hair/longfringe - name = "Long Fringe" - icon_state = "hair_longfringe" +/datum/sprite_accessory/hair/parted + name = "Parted" + icon_state = "hair_parted" -/datum/sprite_accessory/hair/longestalt - name = "Longer Fringe" - icon_state = "hair_vlongfringe" +/datum/sprite_accessory/hair/sidepartlongalt + name = "Long Side Part" + icon_state = "hair_longsidepart" -/datum/sprite_accessory/hair/gentle - name = "Gentle" - icon_state = "hair_gentle" +/datum/sprite_accessory/hair/kagami + name = "Pigtails" + icon_state = "hair_kagami" -/datum/sprite_accessory/hair/halfbang - name = "Half-banged Hair" - icon_state = "hair_halfbang" +/datum/sprite_accessory/hair/pigtail + name = "Pigtails 2" + icon_state = "hair_pigtails" -/datum/sprite_accessory/hair/halfbang2 - name = "Half-banged Hair 2" - icon_state = "hair_halfbang2" +/datum/sprite_accessory/hair/pigtail + name = "Pigtails 3" + icon_state = "hair_pigtails2" + +/datum/sprite_accessory/hair/pixie + name = "Pixie Cut" + icon_state = "hair_pixie" + +/datum/sprite_accessory/hair/pompadour + name = "Pompadour" + icon_state = "hair_pompadour" + +/datum/sprite_accessory/hair/bigpompadour + name = "Big Pompadour" + icon_state = "hair_bigpompadour" /datum/sprite_accessory/hair/ponytail1 name = "Ponytail" @@ -147,6 +444,36 @@ name = "Ponytail 5" icon_state = "hair_ponytail5" +/datum/sprite_accessory/hair/highponytail + name = "High Ponytail" + icon_state = "hair_highponytail" + +/datum/sprite_accessory/hair/longponytail + name = "Long Ponytail" + icon_state = "hair_longstraightponytail" + +//Q + +/datum/sprite_accessory/hair/quiff + name = "Quiff" + icon_state = "hair_quiff" + + +//R + +//S + +/datum/sprite_accessory/hair/oneshoulder + name = "One Shoulder" + icon_state = "hair_oneshoulder" + +/datum/sprite_accessory/hair/tressshoulder + name = "Tress Shoulder" + icon_state = "hair_tressshoulder" + +/datum/sprite_accessory/hair/sidecut + name = "Sidecut" + icon_state = "hair_sidecut" /datum/sprite_accessory/hair/sidetail name = "Side Pony" @@ -164,141 +491,33 @@ name = "Side Pony 4" icon_state = "hair_sidetail4" -/datum/sprite_accessory/hair/oneshoulder - name = "One Shoulder" - icon_state = "hair_oneshoulder" +/datum/sprite_accessory/hair/short + name = "Short Hair" + icon_state = "hair_a" -/datum/sprite_accessory/hair/tressshoulder - name = "Tress Shoulder" - icon_state = "hair_tressshoulder" +/datum/sprite_accessory/hair/shorthair2 + name = "Short Hair 2" + icon_state = "hair_shorthair2" + +/datum/sprite_accessory/hair/shorthair3 + name = "Short Hair 3" + icon_state = "hair_shorthair3" + +/datum/sprite_accessory/hair/long + name = "Shoulder-length Hair" + icon_state = "hair_b" /datum/sprite_accessory/hair/parted - name = "Parted" - icon_state = "hair_parted" + name = "Side Part" + icon_state = "hair_part" -/datum/sprite_accessory/hair/pompadour - name = "Pompadour" - icon_state = "hair_pompadour" +/datum/sprite_accessory/hair/skinhead + name = "Skinhead" + icon_state = "hair_skinhead" -/datum/sprite_accessory/hair/bigpompadour - name = "Big Pompadour" - icon_state = "hair_bigpompadour" - -/datum/sprite_accessory/hair/quiff - name = "Quiff" - icon_state = "hair_quiff" - -/datum/sprite_accessory/hair/bedhead - name = "Bedhead" - icon_state = "hair_bedhead" - -/datum/sprite_accessory/hair/bedhead2 - name = "Bedhead 2" - icon_state = "hair_bedheadv2" - -/datum/sprite_accessory/hair/bedhead3 - name = "Bedhead 3" - icon_state = "hair_bedheadv3" - -/datum/sprite_accessory/hair/messy - name = "Messy" - icon_state = "hair_messy" - -/datum/sprite_accessory/hair/beehive - name = "Beehive" - icon_state = "hair_beehive" - -/datum/sprite_accessory/hair/beehive2 - name = "Beehive 2" - icon_state = "hair_beehivev2" - -/datum/sprite_accessory/hair/bobcurl - name = "Bobcurl" - icon_state = "hair_bobcurl" - -/datum/sprite_accessory/hair/bob - name = "Bob" - icon_state = "hair_bobcut" - -/datum/sprite_accessory/hair/bowl - name = "Bowl" - icon_state = "hair_bowlcut" - -/datum/sprite_accessory/hair/buzz - name = "Buzzcut" - icon_state = "hair_buzzcut" - -/datum/sprite_accessory/hair/crew - name = "Crewcut" - icon_state = "hair_crewcut" - -/datum/sprite_accessory/hair/combover - name = "Combover" - icon_state = "hair_combover" - -/datum/sprite_accessory/hair/devillock - name = "Devil Lock" - icon_state = "hair_devilock" - -/datum/sprite_accessory/hair/dreadlocks - name = "Dreadlocks" - icon_state = "hair_dreads" - -/datum/sprite_accessory/hair/curls - name = "Curls" - icon_state = "hair_curls" - -/datum/sprite_accessory/hair/afro - name = "Afro" - icon_state = "hair_afro" - -/datum/sprite_accessory/hair/afro2 - name = "Afro 2" - icon_state = "hair_afro2" - -/datum/sprite_accessory/hair/afro_large - name = "Big Afro" - icon_state = "hair_bigafro" - -/datum/sprite_accessory/hair/sargeant - name = "Flat Top" - icon_state = "hair_sargeant" - -/datum/sprite_accessory/hair/emo - name = "Emo" - icon_state = "hair_emo" - -/datum/sprite_accessory/hair/longemo - name = "Long Emo" - icon_state = "hair_longemo" - -/datum/sprite_accessory/hair/fag - name = "Flow Hair" - icon_state = "hair_f" - -/datum/sprite_accessory/hair/feather - name = "Feather" - icon_state = "hair_feather" - -/datum/sprite_accessory/hair/hitop - name = "Hitop" - icon_state = "hair_hitop" - -/datum/sprite_accessory/hair/mohawk - name = "Mohawk" - icon_state = "hair_d" - -/datum/sprite_accessory/hair/reversemohawk - name = "Reverse Mohawk" - icon_state = "hair_reversemohawk" - -/datum/sprite_accessory/hair/jensen - name = "Jensen Hair" - icon_state = "hair_jensen" - -/datum/sprite_accessory/hair/gelled - name = "Gelled Back" - icon_state = "hair_gelled" +/datum/sprite_accessory/hair/protagonist + name = "Slightly Long" + icon_state = "hair_protagonist" /datum/sprite_accessory/hair/spiky name = "Spiky" @@ -312,122 +531,6 @@ name = "Spiky 3" icon_state = "hair_spiky2" -/datum/sprite_accessory/hair/protagonist - name = "Slightly Long" - icon_state = "hair_protagonist" - -/datum/sprite_accessory/hair/kusangi - name = "Kusanagi Hair" - icon_state = "hair_kusanagi" - -/datum/sprite_accessory/hair/kagami - name = "Pigtails" - icon_state = "hair_kagami" - -/datum/sprite_accessory/hair/pigtail - name = "Pigtails 2" - icon_state = "hair_pigtails" - -/datum/sprite_accessory/hair/pigtail - name = "Pigtails 3" - icon_state = "hair_pigtails2" - -/datum/sprite_accessory/hair/himecut - name = "Hime Cut" - icon_state = "hair_himecut" - -/datum/sprite_accessory/hair/himecut2 - name = "Hime Cut 2" - icon_state = "hair_himecut2" - -/datum/sprite_accessory/hair/himeup - name = "Hime Updo" - icon_state = "hair_himeup" - -/datum/sprite_accessory/hair/antenna - name = "Ahoge" - icon_state = "hair_antenna" - -/datum/sprite_accessory/hair/front_braid - name = "Braided front" - icon_state = "hair_braidfront" - -/datum/sprite_accessory/hair/lowbraid - name = "Low Braid" - icon_state = "hair_hbraid" - -/datum/sprite_accessory/hair/not_floorlength_braid - name = "High Braid" - icon_state = "hair_braid2" - -/datum/sprite_accessory/hair/shortbraid - name = "Short Braid" - icon_state = "hair_shortbraid" - -/datum/sprite_accessory/hair/braid - name = "Floorlength Braid" - icon_state = "hair_braid" - -/datum/sprite_accessory/hair/odango - name = "Odango" - icon_state = "hair_odango" - -/datum/sprite_accessory/hair/ombre - name = "Ombre" - icon_state = "hair_ombre" - -/datum/sprite_accessory/hair/updo - name = "Updo" - icon_state = "hair_updo" - -/datum/sprite_accessory/hair/skinhead - name = "Skinhead" - icon_state = "hair_skinhead" - -/datum/sprite_accessory/hair/longbangs - name = "Long Bangs" - icon_state = "hair_lbangs" - -/datum/sprite_accessory/hair/balding - name = "Balding Hair" - icon_state = "hair_e" - -/datum/sprite_accessory/hair/bald - name = "Bald" - icon_state = null - -/datum/sprite_accessory/hair/parted - name = "Side Part" - icon_state = "hair_part" - -/datum/sprite_accessory/hair/braided - name = "Braided" - icon_state = "hair_braided" - -/datum/sprite_accessory/hair/bun - name = "Bun Head" - icon_state = "hair_bun" - -/datum/sprite_accessory/hair/bun2 - name = "Bun Head 2" - icon_state = "hair_bunhead2" - -/datum/sprite_accessory/hair/braidtail - name = "Braided Tail" - icon_state = "hair_braidtail" - -/datum/sprite_accessory/hair/bigflattop - name = "Big Flat Top" - icon_state = "hair_bigflattop" - -/datum/sprite_accessory/hair/drillhair - name = "Drill Hair" - icon_state = "hair_drillhair" - -/datum/sprite_accessory/hair/keanu - name = "Keanu Hair" - icon_state = "hair_keanu" - /datum/sprite_accessory/hair/swept name = "Swept Back Hair" icon_state = "hair_swept" @@ -436,73 +539,24 @@ name = "Swept Back Hair 2" icon_state = "hair_swept2" -/datum/sprite_accessory/hair/business - name = "Business Hair" - icon_state = "hair_business" +//T -/datum/sprite_accessory/hair/business2 - name = "Business Hair 2" - icon_state = "hair_business2" +//U -/datum/sprite_accessory/hair/business3 - name = "Business Hair 3" - icon_state = "hair_business3" +/datum/sprite_accessory/hair/updo + name = "Updo" + icon_state = "hair_updo" -/datum/sprite_accessory/hair/business4 - name = "Business Hair 4" - icon_state = "hair_business4" +//V -/datum/sprite_accessory/hair/hedgehog - name = "Hedgehog Hair" - icon_state = "hair_hedgehog" +//W -/datum/sprite_accessory/hair/bob - name = "Bob Hair" - icon_state = "hair_bob" +//X -/datum/sprite_accessory/hair/bob2 - name = "Bob Hair 2" - icon_state = "hair_bob2" +//Y -/datum/sprite_accessory/hair/boddicker - name = "Boddicker" - icon_state = "hair_boddicker" +//Z -/datum/sprite_accessory/hair/long - name = "Long Hair 1" - icon_state = "hair_long" - -/datum/sprite_accessory/hair/long2 - name = "Long Hair 2" - icon_state = "hair_long2" - -/datum/sprite_accessory/hair/pixie - name = "Pixie Cut" - icon_state = "hair_pixie" - -/datum/sprite_accessory/hair/megaeyebrows - name = "Mega Eyebrows" - icon_state = "hair_megaeyebrows" - -/datum/sprite_accessory/hair/highponytail - name = "High Ponytail" - icon_state = "hair_highponytail" - -/datum/sprite_accessory/hair/longponytail - name = "Long Ponytail" - icon_state = "hair_longstraightponytail" - -/datum/sprite_accessory/hair/sidepartlongalt - name = "Long Side Part" - icon_state = "hair_longsidepart" - -/datum/sprite_accessory/hair/sidecut - name = "Sidecut" - icon_state = "hair_sidecut" - -/datum/sprite_accessory/hair/largebun - name = "Large Bun" - icon_state = "hair_largebun" ///////////////////////////// // Facial Hair Definitions // @@ -516,82 +570,81 @@ icon_state = null gender = NEUTER -/datum/sprite_accessory/facial_hair/watson - name = "Watson Mustache" - icon_state = "facial_watson" - -/datum/sprite_accessory/facial_hair/hogan - name = "Hulk Hogan Mustache" - icon_state = "facial_hogan" //-Neek - -/datum/sprite_accessory/facial_hair/vandyke - name = "Van Dyke Mustache" - icon_state = "facial_vandyke" - -/datum/sprite_accessory/facial_hair/chaplin - name = "Square Mustache" - icon_state = "facial_chaplin" - -/datum/sprite_accessory/facial_hair/selleck - name = "Selleck Mustache" - icon_state = "facial_selleck" - -/datum/sprite_accessory/facial_hair/neckbeard - name = "Neckbeard" - icon_state = "facial_neckbeard" - -/datum/sprite_accessory/facial_hair/fullbeard - name = "Full Beard" - icon_state = "facial_fullbeard" - -/datum/sprite_accessory/facial_hair/longbeard - name = "Long Beard" - icon_state = "facial_longbeard" - -/datum/sprite_accessory/facial_hair/vlongbeard - name = "Very Long Beard" - icon_state = "facial_wise" - -/datum/sprite_accessory/facial_hair/elvis - name = "Elvis Sideburns" - icon_state = "facial_elvis" - /datum/sprite_accessory/facial_hair/abe name = "Abraham Lincoln Beard" icon_state = "facial_abe" - + +/datum/sprite_accessory/facial_hair/brokenman + name = "Broken Man" + icon_state = "facial_brokenman" + /datum/sprite_accessory/facial_hair/chinstrap name = "Chinstrap" icon_state = "facial_chin" - + +/datum/sprite_accessory/facial_hair/dwarf + name = "Dwarf Beard" + icon_state = "facial_dwarf" + +/datum/sprite_accessory/facial_hair/elvis + name = "Elvis Sideburns" + icon_state = "facial_elvis" + +/datum/sprite_accessory/facial_hair/fiveoclock + name = "Five o Clock Shadow" + icon_state = "facial_fiveoclock" + +/datum/sprite_accessory/facial_hair/fullbeard + name = "Full Beard" + icon_state = "facial_fullbeard" + +/datum/sprite_accessory/facial_hair/fu + name = "Fu Manchu" + icon_state = "facial_fumanchu" + +/datum/sprite_accessory/facial_hair/gt + name = "Goatee" + icon_state = "facial_gt" + /datum/sprite_accessory/facial_hair/hip name = "Hipster Beard" icon_state = "facial_hip" -/datum/sprite_accessory/facial_hair/gt - name = "Goatee" - icon_state = "facial_gt" - +/datum/sprite_accessory/facial_hair/hogan + name = "Hulk Hogan Mustache" + icon_state = "facial_hogan" //-Neek + /datum/sprite_accessory/facial_hair/jensen name = "Jensen Beard" icon_state = "facial_jensen" - -/datum/sprite_accessory/facial_hair/dwarf - name = "Dwarf Beard" - icon_state = "facial_dwarf" - -/datum/sprite_accessory/facial_hair/fiveoclock - name = "Five o Clock Shadow" - icon_state = "facial_fiveoclock" - -/datum/sprite_accessory/facial_hair/fu - name = "Fu Manchu" - icon_state = "facial_fumanchu" - -/datum/sprite_accessory/facial_hair/brokenman - name = "Broken Man" - icon_state = "facial_brokenman" - + +/datum/sprite_accessory/facial_hair/longbeard + name = "Long Beard" + icon_state = "facial_longbeard" + +/datum/sprite_accessory/facial_hair/neckbeard + name = "Neckbeard" + icon_state = "facial_neckbeard" + +/datum/sprite_accessory/facial_hair/selleck + name = "Selleck Mustache" + icon_state = "facial_selleck" + +/datum/sprite_accessory/facial_hair/chaplin + name = "Square Mustache" + icon_state = "facial_chaplin" + +/datum/sprite_accessory/facial_hair/vandyke + name = "Van Dyke Mustache" + icon_state = "facial_vandyke" + +/datum/sprite_accessory/facial_hair/vlongbeard + name = "Very Long Beard" + icon_state = "facial_wise" + +/datum/sprite_accessory/facial_hair/watson + name = "Watson Mustache" + icon_state = "facial_watson" /////////////////////////// // Underwear Definitions // From 4f281e5ea1a41a481eccdb8a318fac5e2642178a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 28 Sep 2017 07:56:26 -0500 Subject: [PATCH 044/136] [MIRROR] Blackbox stat for internet midis (#2964) * Blackbox stat for internet midis * Blackbox stat for internet midis --- code/modules/admin/verbs/playsound.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 8f90995e82..61df0cb8d1 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -92,6 +92,7 @@ pitch = pick(0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 1.1, 1.2, 1.4, 1.6, 2.0, 2.5) to_chat(src, "You feel the Honkmother messing with your song...") + SSblackbox.add_details("played_url", web_sound_input) log_admin("[key_name(src)] played web sound: [web_sound_input]") message_admins("[key_name(src)] played web sound: [web_sound_input]") else From 2d48a0cf50f79f1da5b4e70dcf4a03bded51a290 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 28 Sep 2017 07:59:57 -0500 Subject: [PATCH 045/136] [MIRROR] Makes borg modules and human species easily spawnable by admins from the mob spawn menu. (#2967) * Makes borg modules and human species easily spawnable by admins from the mob spawn menu. * Makes borg modules and human species easily spawnable by admins from the mob spawn menu. --- code/game/gamemodes/antag_spawner.dm | 4 +- code/modules/mob/living/carbon/human/human.dm | 121 ++++++++++++++++++ .../modules/mob/living/silicon/robot/robot.dm | 41 +++++- code/modules/projectiles/projectile/magic.dm | 4 +- 4 files changed, 159 insertions(+), 11 deletions(-) diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 64b405bbd5..3b5b862559 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -203,9 +203,9 @@ var/mob/living/silicon/robot/R switch(borg_to_spawn) if("Medical") - R = new /mob/living/silicon/robot/syndicate/medical(T) + R = new /mob/living/silicon/robot/modules/syndicate/medical(T) else - R = new /mob/living/silicon/robot/syndicate(T) //Assault borg by default + R = new /mob/living/silicon/robot/modules/syndicate(T) //Assault borg by default var/brainfirstname = pick(GLOB.first_names_male) if(prob(50)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 917242609e..d66e6f808a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -941,3 +941,124 @@ riding_datum.unequip_buckle_inhands(M) riding_datum.restore_position(M) . = ..(M, force) + +/mob/living/carbon/human/species + var/race = null + +/mob/living/carbon/human/species/Initialize() + . = ..() + set_species(race) + +/mob/living/carbon/human/species/abductor + race = /datum/species/abductor + +/mob/living/carbon/human/species/android + race = /datum/species/android + +/mob/living/carbon/human/species/angel + race = /datum/species/angel + +/mob/living/carbon/human/species/corporate + race = /datum/species/corporate + +/mob/living/carbon/human/species/fly + race = /datum/species/fly + +/mob/living/carbon/human/species/golem + race = /datum/species/golem + +/mob/living/carbon/human/species/golem/random + race = /datum/species/golem/random + +/mob/living/carbon/human/species/golem/adamantine + race = /datum/species/golem/adamantine + +/mob/living/carbon/human/species/golem/plasma + race = /datum/species/golem/plasma + +/mob/living/carbon/human/species/golem/diamond + race = /datum/species/golem/diamond + +/mob/living/carbon/human/species/golem/gold + race = /datum/species/golem/gold + +/mob/living/carbon/human/species/golem/silver + race = /datum/species/golem/silver + +/mob/living/carbon/human/species/golem/plasteel + race = /datum/species/golem/plasteel + +/mob/living/carbon/human/species/golem/titanium + race = /datum/species/golem/titanium + +/mob/living/carbon/human/species/golem/plastitanium + race = /datum/species/golem/plastitanium + +/mob/living/carbon/human/species/golem/alien_alloy + race = /datum/species/golem/alloy + +/mob/living/carbon/human/species/golem/wood + race = /datum/species/golem/wood + +/mob/living/carbon/human/species/golem/uranium + race = /datum/species/golem/uranium + +/mob/living/carbon/human/species/golem/sand + race = /datum/species/golem/sand + +/mob/living/carbon/human/species/golem/glass + race = /datum/species/golem/glass + +/mob/living/carbon/human/species/golem/bluespace + race = /datum/species/golem/bluespace + +/mob/living/carbon/human/species/golem/bananium + race = /datum/species/golem/bananium + +/mob/living/carbon/human/species/golem/blood_cult + race = /datum/species/golem/runic + +/mob/living/carbon/human/species/golem/cloth + race = /datum/species/golem/cloth + +/mob/living/carbon/human/species/golem/plastic + race = /datum/species/golem/plastic + +/mob/living/carbon/human/species/jelly + race = /datum/species/jelly + +/mob/living/carbon/human/species/jelly/slime + race = /datum/species/jelly/slime + +/mob/living/carbon/human/species/lizard + race = /datum/species/lizard + +/mob/living/carbon/human/species/lizard/ashwalker + race = /datum/species/lizard/ashwalker + +/mob/living/carbon/human/species/plasma + race = /datum/species/plasmaman + +/mob/living/carbon/human/species/pod + race = /datum/species/pod + +/mob/living/carbon/human/species/shadow + race = /datum/species/shadow + +/mob/living/carbon/human/species/skeleton + race = /datum/species/skeleton + +/mob/living/carbon/human/species/synth + race = /datum/species/synth + +/mob/living/carbon/human/species/synth/military + race = /datum/species/synth/military + +/mob/living/carbon/human/species/zombie + race = /datum/species/zombie + +/mob/living/carbon/human/species/zombie/infectious + race = /datum/species/zombie/infectious + +/mob/living/carbon/human/species/zombie/krokodil_addict + race = /datum/species/krokodil_addict \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 01baf578ee..e264f00cf1 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -810,7 +810,35 @@ cell = null qdel(src) -/mob/living/silicon/robot/syndicate +/mob/living/silicon/robot/modules + var/set_module = null + +/mob/living/silicon/robot/modules/Initialize() + . = ..() + module.transform_to(set_module) + +/mob/living/silicon/robot/modules/standard + set_module = /obj/item/robot_module/standard + +/mob/living/silicon/robot/modules/medical + set_module = /obj/item/robot_module/medical + +/mob/living/silicon/robot/modules/engineering + set_module = /obj/item/robot_module/engineering + +/mob/living/silicon/robot/modules/security + set_module = /obj/item/robot_module/security + +/mob/living/silicon/robot/modules/peacekeeper + set_module = /obj/item/robot_module/peacekeeper + +/mob/living/silicon/robot/modules/miner + set_module = /obj/item/robot_module/miner + +/mob/living/silicon/robot/modules/janitor + set_module = /obj/item/robot_module/janitor + +/mob/living/silicon/robot/modules/syndicate icon_state = "syndie_bloodhound" faction = list("syndicate") bubble_icon = "syndibot" @@ -822,25 +850,24 @@ You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \ Your cyborg LMG will slowly produce ammunition from your power supply, and your operative pinpointer will find and locate fellow nuclear operatives. \ Help the operatives secure the disk at all costs!" - var/set_module = /obj/item/robot_module/syndicate + set_module = /obj/item/robot_module/syndicate -/mob/living/silicon/robot/syndicate/Initialize() +/mob/living/silicon/robot/modules/syndicate/Initialize() . = ..() cell.maxcharge = 25000 cell.charge = 25000 radio = new /obj/item/device/radio/borg/syndicate(src) - module.transform_to(set_module) laws = new /datum/ai_laws/syndicate_override() addtimer(CALLBACK(src, .proc/show_playstyle), 5) -/mob/living/silicon/robot/syndicate/proc/show_playstyle() +/mob/living/silicon/robot/modules/syndicate/proc/show_playstyle() if(playstyle_string) to_chat(src, playstyle_string) -/mob/living/silicon/robot/syndicate/ResetModule() +/mob/living/silicon/robot/modules/syndicate/ResetModule() return -/mob/living/silicon/robot/syndicate/medical +/mob/living/silicon/robot/modules/syndicate/medical icon_state = "syndi-medi" playstyle_string = "You are a Syndicate medical cyborg!
\ You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \ diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 27284a1712..8c4f80b772 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -139,9 +139,9 @@ if("syndiborg") var/path if(prob(50)) - path = /mob/living/silicon/robot/syndicate + path = /mob/living/silicon/robot/modules/syndicate else - path = /mob/living/silicon/robot/syndicate/medical + path = /mob/living/silicon/robot/modules/syndicate/medical new_mob = new path(M.loc) if("drone") new_mob = new /mob/living/simple_animal/drone/polymorphed(M.loc) From 97b8a6ed3b5dc218087058771d60f7664cb01f2e Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 26 Sep 2017 16:27:23 -0400 Subject: [PATCH 046/136] Removes some spawns --- .../hostile/megafauna/megafauna.dm | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 5f45d47494..a80340c28a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -144,44 +144,42 @@ return TRUE /proc/UnlockMedal(medal,client/player) - + set waitfor = FALSE if(!player || !medal) return if(global.medal_hub && global.medal_pass && global.medals_enabled) - spawn() - var/result = world.SetMedal(medal, player, global.medal_hub, global.medal_pass) - if(isnull(result)) - global.medals_enabled = FALSE - log_game("MEDAL ERROR: Could not contact hub to award medal:[medal] player:[player.ckey]") - message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!") - else if (result) - to_chat(player, "Achievement unlocked: [medal]!") + var/result = world.SetMedal(medal, player, global.medal_hub, global.medal_pass) + if(isnull(result)) + global.medals_enabled = FALSE + log_game("MEDAL ERROR: Could not contact hub to award medal:[medal] player:[player.ckey]") + message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!") + else if (result) + to_chat(player, "Achievement unlocked: [medal]!") /proc/SetScore(score,client/player,increment,force) - + set waitfor = FALSE if(!score || !player) return if(global.medal_hub && global.medal_pass && global.medals_enabled) - spawn() - var/list/oldscore = GetScore(score,player,1) + var/list/oldscore = GetScore(score,player,1) - if(increment) - if(!oldscore[score]) - oldscore[score] = 1 - else - oldscore[score] = (text2num(oldscore[score]) + 1) + if(increment) + if(!oldscore[score]) + oldscore[score] = 1 else - oldscore[score] = force + oldscore[score] = (text2num(oldscore[score]) + 1) + else + oldscore[score] = force - var/newscoreparam = list2params(oldscore) + var/newscoreparam = list2params(oldscore) - var/result = world.SetScores(player.ckey, newscoreparam, global.medal_hub, global.medal_pass) + var/result = world.SetScores(player.ckey, newscoreparam, global.medal_hub, global.medal_pass) - if(isnull(result)) - global.medals_enabled = FALSE - log_game("SCORE ERROR: Could not contact hub to set score. Score:[score] player:[player.ckey]") - message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!") + if(isnull(result)) + global.medals_enabled = FALSE + log_game("SCORE ERROR: Could not contact hub to set score. Score:[score] player:[player.ckey]") + message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!") /proc/GetScore(score,client/player,returnlist) From 659c92a0d6dc0a7e9b41bab40eb925f44f9b1077 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 26 Sep 2017 16:53:47 -0400 Subject: [PATCH 048/136] Fixes SSqueak not returning ..() --- code/controllers/subsystem/squeak.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/controllers/subsystem/squeak.dm b/code/controllers/subsystem/squeak.dm index 16b722c71b..964d970e2b 100644 --- a/code/controllers/subsystem/squeak.dm +++ b/code/controllers/subsystem/squeak.dm @@ -11,6 +11,7 @@ SUBSYSTEM_DEF(squeak) /datum/controller/subsystem/squeak/Initialize(timeofday) trigger_migration(config.mice_roundstart) + return ..() /datum/controller/subsystem/squeak/proc/trigger_migration(num_mice=10) if(!num_mice) From 91c1a78af9bdf9f00e68f402eb50eb1ada727b03 Mon Sep 17 00:00:00 2001 From: AutomaticFrenzy <31360629+AutomaticFrenzy@users.noreply.github.com> Date: Thu, 28 Sep 2017 11:24:12 -0400 Subject: [PATCH 050/136] Fixed duplicate definition (#31048) --- code/game/objects/items/stacks/sheets/sheet_types.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index f1bb4c3772..6303da132c 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -390,7 +390,6 @@ GLOBAL_LIST_INIT(plastic_recipes, list( singular_name = "plastic sheet" icon_state = "sheet-plastic" throwforce = 7 - origin_tech = "materials=1" origin_tech = "materials=1;biotech=1" merge_type = /obj/item/stack/sheet/plastic From 602e1e6bbfef0471956ed90460714f9435b3b4a9 Mon Sep 17 00:00:00 2001 From: Y0SH1M4S73R Date: Thu, 28 Sep 2017 07:03:34 -0400 Subject: [PATCH 052/136] AFK players count as dead for the assassinate objective (#31046) --- code/game/gamemodes/objective.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 75ed90d712..c00328243a 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -121,7 +121,7 @@ return target /datum/objective/assassinate/check_completion() - return !target || !considered_alive(target) + return !considered_alive(target) || considered_afk(target) /datum/objective/assassinate/update_explanation_text() ..() From 6fca708b33abd009393ec8671e84b4c72f9fb36f Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Thu, 28 Sep 2017 05:24:34 -0500 Subject: [PATCH 054/136] Advanced camera consoles use a list for z lock rather than a single z level (#30661) * Refactor Abductor Console * Station lock --- .../miniantags/abduction/machinery/camera.dm | 2 +- code/game/machinery/computer/camera_advanced.dm | 12 +++++++++--- code/modules/shuttle/navigation_computer.dm | 5 ++--- code/modules/shuttle/syndicate.dm | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm index eb4e4f8211..fd9ca0a658 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm @@ -9,7 +9,7 @@ var/datum/action/innate/vest_disguise_swap/vest_disguise_action = new var/datum/action/innate/set_droppoint/set_droppoint_action = new var/obj/machinery/abductor/console/console - z_lock = ZLEVEL_STATION_PRIMARY + station_lock_override = TRUE icon = 'icons/obj/abductor.dmi' icon_state = "camera" diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 3d5b8f026b..711ed6e55b 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -3,7 +3,8 @@ desc = "Used to access the various cameras on the station." icon_screen = "cameras" icon_keyboard = "security_key" - var/z_lock = null // Lock use to this zlevel + var/list/z_lock = list() // Lock use to these z levels + var/station_lock_override = FALSE var/mob/camera/aiEye/remote/eyeobj var/mob/living/current_user = null var/list/networks = list("SS13") @@ -13,6 +14,11 @@ light_color = LIGHT_COLOR_RED +/obj/machinery/computer/camera_advanced/Initialize() + . = ..() + if(station_lock_override) + z_lock = GLOB.station_z_levels.Copy() + /obj/machinery/computer/camera_advanced/syndie icon_keyboard = "syndie_key" @@ -76,7 +82,7 @@ if(!eyeobj.eye_initialized) var/camera_location for(var/obj/machinery/camera/C in GLOB.cameranet.cameras) - if(!C.can_use() || z_lock && C.z != z_lock) + if(!C.can_use() || z_lock.len && !(C.z in z_lock)) continue if(C.network & networks) camera_location = get_turf(C) @@ -201,7 +207,7 @@ var/list/L = list() for (var/obj/machinery/camera/cam in GLOB.cameranet.cameras) - if(origin.z_lock && cam.z != origin.z_lock) + if(origin.z_lock.len && !(cam.z in origin.z_lock)) continue L.Add(cam) diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index 9199e5eb14..65669d8251 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -1,7 +1,6 @@ /obj/machinery/computer/camera_advanced/shuttle_docker name = "navigation computer" desc = "Used to designate a precise transit location for a spacecraft." - z_lock = ZLEVEL_STATION_PRIMARY jump_action = null var/datum/action/innate/shuttledocker_rotate/rotate_action = new var/datum/action/innate/shuttledocker_place/place_action = new @@ -133,7 +132,7 @@ if(!V) continue var/obj/docking_port/stationary/S = V - if(z_lock && (S.z != z_lock)) + if(z_lock.len && !(S.z in z_lock)) continue if((S.id == shuttlePortId) || jumpto_ports[S.id]) continue @@ -222,7 +221,7 @@ if(!V) continue var/obj/docking_port/stationary/S = V - if(console.z_lock && (S.z != console.z_lock)) + if(console.z_lock.len && !(S.z in console.z_lock)) continue if(console.jumpto_ports[S.id]) L[S.name] = S diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 1c3d416fd0..ac1339d33e 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -47,8 +47,8 @@ desc = "Used to designate a precise transit location for the syndicate shuttle." icon_screen = "syndishuttle" icon_keyboard = "syndie_key" - z_lock = ZLEVEL_STATION_PRIMARY shuttleId = "syndicate" + station_lock_override = TRUE shuttlePortId = "syndicate_custom" shuttlePortName = "custom location" jumpto_ports = list("syndicate_ne" = 1, "syndicate_nw" = 1, "syndicate_n" = 1, "syndicate_se" = 1, "syndicate_sw" = 1, "syndicate_s" = 1) From 8f600788f4338764ac550ab8120dc842521ee917 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 27 Sep 2017 21:47:20 -0400 Subject: [PATCH 056/136] Back and inhands for air tanks. --- code/game/objects/items/tanks/tank_types.dm | 187 ++++++++++++++++++ icons/mob/back.dmi | Bin 92468 -> 93358 bytes .../mob/inhands/equipment/tanks_lefthand.dmi | Bin 1774 -> 1919 bytes .../mob/inhands/equipment/tanks_righthand.dmi | Bin 1743 -> 1846 bytes 4 files changed, 187 insertions(+) diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 71a2c51dca..3dfa3581f4 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /* Types of tanks! * Contains: * Oxygen @@ -181,3 +182,189 @@ name = "double emergency oxygen tank" icon_state = "emergency_engi" volume = 10 +======= +/* Types of tanks! + * Contains: + * Oxygen + * Anesthetic + * Air + * Plasma + * Emergency Oxygen + */ + +/* + * Oxygen + */ +/obj/item/tank/internals/oxygen + name = "oxygen tank" + desc = "A tank of oxygen." + icon_state = "oxygen" + distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE + force = 10 + dog_fashion = /datum/dog_fashion/back + + +/obj/item/tank/internals/oxygen/New() + ..() + air_contents.assert_gas("o2") + air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + + +/obj/item/tank/internals/oxygen/yellow + desc = "A tank of oxygen, this one is yellow." + icon_state = "oxygen_f" + dog_fashion = null + +/obj/item/tank/internals/oxygen/red + desc = "A tank of oxygen, this one is red." + icon_state = "oxygen_fr" + dog_fashion = null + + +/* + * Anesthetic + */ +/obj/item/tank/internals/anesthetic + name = "anesthetic tank" + desc = "A tank with an N2O/O2 gas mix." + icon_state = "anesthetic" + item_state = "an_tank" + force = 10 + +/obj/item/tank/internals/anesthetic/New() + ..() + air_contents.assert_gases("o2", "n2o") + air_contents.gases["o2"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD + air_contents.gases["n2o"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD + return + +/* + * Air + */ +/obj/item/tank/internals/air + name = "air tank" + desc = "Mixed anyone?" + icon_state = "air" + item_state = "air" + force = 10 + dog_fashion = /datum/dog_fashion/back + +/obj/item/tank/internals/air/New() + ..() + air_contents.assert_gases("o2","n2") + air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD + air_contents.gases["n2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD + return + + +/* + * Plasma + */ +/obj/item/tank/internals/plasma + name = "plasma tank" + desc = "Contains dangerous plasma. Do not inhale. Warning: extremely flammable." + icon_state = "plasma" + flags_1 = CONDUCT_1 + slot_flags = null //they have no straps! + force = 8 + + +/obj/item/tank/internals/plasma/New() + ..() + air_contents.assert_gas("plasma") + air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + +/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/flamethrower)) + var/obj/item/flamethrower/F = W + if ((!F.status)||(F.ptank)) + return + if(!user.transferItemToLoc(src, F)) + return + src.master = F + F.ptank = src + F.update_icon() + else + return ..() + +/obj/item/tank/internals/plasma/full/New() + ..() + air_contents.assert_gas("plasma") + air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + + +/* + * Plasmaman Plasma Tank + */ + +/obj/item/tank/internals/plasmaman + name = "plasma internals tank" + desc = "A tank of plasma gas designed specifically for use as internals, particularly for plasma-based lifeforms. If you're not a Plasmaman, you probably shouldn't use this." + icon_state = "plasmaman_tank" + item_state = "plasmaman_tank" + force = 10 + distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE + +/obj/item/tank/internals/plasmaman/New() + ..() + air_contents.assert_gas("plasma") + air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + +/obj/item/tank/internals/plasmaman/full/New() + ..() + air_contents.assert_gas("plasma") + air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + + +/obj/item/tank/internals/plasmaman/belt + icon_state = "plasmaman_tank_belt" + item_state = "plasmaman_tank_belt" + slot_flags = SLOT_BELT + force = 5 + volume = 6 + w_class = WEIGHT_CLASS_SMALL //thanks i forgot this + +/obj/item/tank/internals/plasmaman/belt/full/New() + ..() + air_contents.assert_gas("plasma") + air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + + + +/* + * Emergency Oxygen + */ +/obj/item/tank/internals/emergency_oxygen + name = "emergency oxygen tank" + desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it." + icon_state = "emergency" + flags_1 = CONDUCT_1 + slot_flags = SLOT_BELT + w_class = WEIGHT_CLASS_SMALL + force = 4 + distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE + volume = 3 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011) + + +/obj/item/tank/internals/emergency_oxygen/New() + ..() + air_contents.assert_gas("o2") + air_contents.gases["o2"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + +/obj/item/tank/internals/emergency_oxygen/engi + name = "extended-capacity emergency oxygen tank" + icon_state = "emergency_engi" + volume = 6 + +/obj/item/tank/internals/emergency_oxygen/double + name = "double emergency oxygen tank" + icon_state = "emergency_engi" + volume = 10 +>>>>>>> 46bed07... Merge pull request #31077 from RandomMarine/itsairmanbitchandimbringingthepain diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 06699662c052e9f67c173e79ca76bf783f7b3e26..064fedb3df037e591229c51fbe09c4167b627dda 100644 GIT binary patch literal 93358 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

1&>Y!`v`^6%o#tr zj=g?A^zz%w);jNN8s85$_?&!=q_vp}?ssjnXPm#4&Im8IXvpRm%N>-|d6`N#I4CsN za+>A4Qb`eW>i6=3=uihc_u~M&&BCjzGlKBCC|O@dM`=WsAzCx8BuX7CF$^}9R?p=2Au3=KJ zW|C9lH$g7Vtddys2fg&2 zk=ZBt*^O22WkT2A#`OHmj-If59bA!b<$dl-gXDE-7m*Y!$IDffq-=f79V2@~d4cDsA%aHSm>Z){;uufPamCZS)n~5@a4>VvT7#+Z60hhr+Yj0=aTi0qa zdS=*9M%UI{QP*~scOaarH^o212K*mHI7@pc3tx6EFdqTe?Hkeob{5oe5&t7`0FM7y zTXO-TC<4o7?ibf>HjoAfVPM*T9E37}23ao4a$c5DmShw~>+|Q&pP|cgPNa)S0c1H# zVGybyEz5EgN3kqOkRuBqD?t`e0G6M9c001BXsh7r>gvh^j5EmPD>r+YnKlXlnE;?T LvIOvzc^xMJ+jfs_ literal 0 HcmV?d00001 From bc0868983ab27eaea5e8a66c3906cb2ca00eff2e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 27 Sep 2017 11:49:50 -0500 Subject: [PATCH 021/136] Automatic changelog generation for PR #2953 [ci skip] --- html/changelogs/AutoChangeLog-pr-2953.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2953.yml diff --git a/html/changelogs/AutoChangeLog-pr-2953.yml b/html/changelogs/AutoChangeLog-pr-2953.yml new file mode 100644 index 0000000000..db1399b5b0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2953.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - bugfix: "Syndicate MMIs will now properly transfer their laws to newly-constructed AIs" From ebdea5382b3d0e750256d79e22d8d67001478faa Mon Sep 17 00:00:00 2001 From: AnturK Date: Tue, 26 Sep 2017 21:16:49 +0200 Subject: [PATCH 022/136] Here it is. --- code/game/gamemodes/wizard/soulstone.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index ae7143d5a2..aae0261320 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -119,7 +119,7 @@ ////////////////////////////Proc for moving soul in and out off stone////////////////////////////////////// -/obj/item/device/soulstone/proc/transfer_soul(choice as text, target, mob/user). +/obj/item/device/soulstone/proc/transfer_soul(choice as text, target, mob/user) switch(choice) if("FORCE") if(!iscarbon(target)) //TODO: Add sacrifice stoning for non-organics, just because you have no body doesnt mean you dont have a soul From d2149124b74a71ce58bc9a32214dad56af7bbce1 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 27 Sep 2017 15:10:01 -0500 Subject: [PATCH 024/136] Update mobs.dm --- code/__HELPERS/mobs.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index cb64f3fb22..ed855c33b9 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -465,13 +465,17 @@ Proc for attack log creation, because really why not if(H.dna && istype(H.dna.species, species_datum)) . = TRUE -/proc/spawn_atom_to_turf(spawn_type, target, amount, admin_spawn=FALSE) +/proc/spawn_atom_to_turf(spawn_type, target, amount, admin_spawn=FALSE, list/extra_args) var/turf/T = get_turf(target) if(!T) CRASH("attempt to spawn atom type: [spawn_type] in nullspace") - for(var/j in 1 to amount) - var/atom/X = new spawn_type(T) + var/list/new_args = list(T) + if(extra_args) + new_args += extra_args + + for(var/j in 1 to amount) + var/atom/X = new spawn_type(arglist(new_args)) X.admin_spawned = admin_spawn /proc/spawn_and_random_walk(spawn_type, target, amount, walk_chance=100, max_walk=3, always_max_walk=FALSE, admin_spawn=FALSE) From 2163132c52e7335854a0ca4c6b547e15e053f4fa Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 27 Sep 2017 15:10:59 -0500 Subject: [PATCH 025/136] Update ballistic.dm --- code/modules/projectiles/guns/ballistic.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index e607ec0571..3bc26df8ba 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -137,11 +137,15 @@ boolets += magazine.ammo_count() return boolets +#define BRAINS_BLOWN_THROW_RANGE 3 +#define BRAINS_BLOWN_THROW_SPEED 1 /obj/item/gun/ballistic/suicide_act(mob/user) - if (chambered && chambered.BB && can_trigger_gun(user) && !chambered.BB.nodamage) + var/obj/item/organ/brain/B = user.getorganslot("brain") + if (B && chambered && chambered.BB && can_trigger_gun(user) && !chambered.BB.nodamage) user.visible_message("[user] is putting the barrel of [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!") sleep(25) if(user.is_holding(src)) + var/turf/T = get_turf(user) process_fire(user, user, 0, zone_override = "head") user.visible_message("[user] blows [user.p_their()] brain[user.p_s()] out with [src]!") var/turf/target = get_ranged_target_turf(user, turn(user.dir, 180), BRAINS_BLOWN_THROW_RANGE) @@ -162,8 +166,8 @@ user.visible_message("[user] is pretending to blow [user.p_their()] brain[user.p_s()] out with [src]! It looks like [user.p_theyre()] trying to commit suicide!") playsound(loc, 'sound/weapons/empty.ogg', 50, 1, -1) return (OXYLOSS) - - +#undef BRAINS_BLOWN_THROW_SPEED +#undef BRAINS_BLOWN_THROW_RANGE /obj/item/gun/ballistic/proc/sawoff(mob/user) if(sawn_state == SAWN_OFF) From 2e133c0b2c38e1625383cff39a8c6967bf171b16 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 27 Sep 2017 15:12:22 -0500 Subject: [PATCH 026/136] Update ears.dm --- code/modules/clothing/ears/ears.dm | 56 ++---------------------------- 1 file changed, 3 insertions(+), 53 deletions(-) diff --git a/code/modules/clothing/ears/ears.dm b/code/modules/clothing/ears/ears.dm index 412aa0f940..9d5433663e 100644 --- a/code/modules/clothing/ears/ears.dm +++ b/code/modules/clothing/ears/ears.dm @@ -1,12 +1,10 @@ -<<<<<<< HEAD - //Ears: currently only used for headsets and earmuffs /obj/item/clothing/ears name = "ears" w_class = WEIGHT_CLASS_TINY throwforce = 0 slot_flags = SLOT_EARS - resistance_flags = 0 + resistance_flags = NONE /obj/item/clothing/ears/earmuffs name = "earmuffs" @@ -16,7 +14,7 @@ strip_delay = 15 equip_delay_other = 25 resistance_flags = FLAMMABLE - flags_2 = BANG_PROTECT_2|HEALS_EARS_2 + flags_2 = BANG_PROTECT_2|HEALS_EARS_2 /obj/item/clothing/ears/headphones name = "headphones" @@ -44,52 +42,4 @@ H.update_inv_ears() H.update_inv_neck() H.update_inv_head() - to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") -======= - -//Ears: currently only used for headsets and earmuffs -/obj/item/clothing/ears - name = "ears" - w_class = WEIGHT_CLASS_TINY - throwforce = 0 - slot_flags = SLOT_EARS - resistance_flags = NONE - -/obj/item/clothing/ears/earmuffs - name = "earmuffs" - desc = "Protects your hearing from loud noises, and quiet ones as well." - icon_state = "earmuffs" - item_state = "earmuffs" - strip_delay = 15 - equip_delay_other = 25 - resistance_flags = FLAMMABLE - flags_2 = BANG_PROTECT_2|HEALS_EARS_2 - -/obj/item/clothing/ears/headphones - name = "headphones" - desc = "Unce unce unce unce. Boop!" - icon = 'icons/obj/clothing/accessories.dmi' - icon_state = "headphones" - item_state = "headphones" - slot_flags = SLOT_EARS | SLOT_HEAD | SLOT_NECK //Fluff item, put it whereever you want! - actions_types = list(/datum/action/item_action/toggle_headphones) - var/headphones_on = FALSE - -/obj/item/clothing/ears/headphones/Initialize() - . = ..() - update_icon() - -/obj/item/clothing/ears/headphones/update_icon() - icon_state = "[initial(icon_state)]_[headphones_on? "on" : "off"]" - item_state = "[initial(item_state)]_[headphones_on? "on" : "off"]" - -/obj/item/clothing/ears/headphones/proc/toggle(owner) - headphones_on = !headphones_on - update_icon() - var/mob/living/carbon/human/H = owner - if(istype(H)) - H.update_inv_ears() - H.update_inv_neck() - H.update_inv_head() - to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") ->>>>>>> 5fbc6c2... Makes a flags var use NONE instead of 0 + to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") From 0387f81ed5ade2114eb4beabdc75ab6780a53e93 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 27 Sep 2017 15:16:05 -0500 Subject: [PATCH 027/136] Update ticker.dm --- code/controllers/subsystem/ticker.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index e7333966f9..8b2f2af208 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -274,7 +274,6 @@ SUBSYSTEM_DEF(ticker) if(epi) explosion(epi, 0, 256, 512, 0, TRUE, TRUE, 0, TRUE) -<<<<<<< HEAD //Plus it provides an easy way to make cinematics for other events. Just use this as a template /datum/controller/subsystem/ticker/proc/station_explosion_cinematic(station_missed=0, override = null, atom/bomb = null) if( cinematic ) @@ -411,9 +410,7 @@ SUBSYSTEM_DEF(ticker) M.notransform = FALSE if(actually_blew_up && !isnull(killz) && M.stat != DEAD && M.z == killz) M.gib() - -======= ->>>>>>> 1304e83... Refactors cinematics. (#30888) + /datum/controller/subsystem/ticker/proc/create_characters() for(var/mob/dead/new_player/player in GLOB.player_list) if(player.ready == PLAYER_READY_TO_PLAY && player.mind) From f71c3d6614777d7eab2563a2a65f8590599975ca Mon Sep 17 00:00:00 2001 From: Robustin Date: Wed, 27 Sep 2017 16:27:41 -0400 Subject: [PATCH 028/136] Revheads are now stealthier/harder to metagame (#30957) * stealthier revs * Stealthiest Revheads * Update revolution.dm --- code/game/gamemodes/revolution/revolution.dm | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 8384892044..4ada75bb05 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -154,8 +154,7 @@ var/obj/item/device/assembly/flash/T = new(mob) - var/obj/item/toy/crayon/spraycan/R = new(mob) - var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob) + var/obj/item/organ/cyberimp/eyes/hud/security/S = new(mob) var/list/slots = list ( "backpack" = slot_in_backpack, @@ -163,13 +162,8 @@ "right pocket" = slot_r_store ) var/where = mob.equip_in_one_of_slots(T, slots) - var/where2 = mob.equip_in_one_of_slots(C, slots) - mob.equip_in_one_of_slots(R,slots) - - if (!where2) - to_chat(mob, "The Syndicate were unfortunately unable to get you a chameleon security HUD.") - else - to_chat(mob, "The chameleon security HUD in your [where2] will help you keep track of who is mindshield-implanted, and unable to be recruited.") + S.Insert(mob, special = FALSE, drop_if_replaced = FALSE) + to_chat(mob, "Your eyes have been implanted with a cybernetic security HUD which will help you keep track of who is mindshield-implanted, and therefore unable to be recruited.") if (!where) to_chat(mob, "The Syndicate were unfortunately unable to get you a flash.") From e58d05202bdf219a4ba8a9a00b20896f1c9b2765 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 27 Sep 2017 15:31:26 -0500 Subject: [PATCH 030/136] Automatic changelog generation for PR #2918 [ci skip] --- html/changelogs/AutoChangeLog-pr-2918.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2918.yml diff --git a/html/changelogs/AutoChangeLog-pr-2918.yml b/html/changelogs/AutoChangeLog-pr-2918.yml new file mode 100644 index 0000000000..3f67bc015e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2918.yml @@ -0,0 +1,4 @@ +author: "JJRcop" +delete-after: True +changes: + - rscadd: "Suiciding with a ballistic gun now actually blows your brain out." From 69fa79f97492ba2ff838db0f742fe7f920962589 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 27 Sep 2017 15:33:42 -0500 Subject: [PATCH 031/136] Update ticker.dm --- code/controllers/subsystem/ticker.dm | 137 --------------------------- 1 file changed, 137 deletions(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 8b2f2af208..b3b2b02091 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -273,143 +273,6 @@ SUBSYSTEM_DEF(ticker) qdel(bomb) if(epi) explosion(epi, 0, 256, 512, 0, TRUE, TRUE, 0, TRUE) - -//Plus it provides an easy way to make cinematics for other events. Just use this as a template -/datum/controller/subsystem/ticker/proc/station_explosion_cinematic(station_missed=0, override = null, atom/bomb = null) - if( cinematic ) - return //already a cinematic in progress! - - for (var/datum/html_interface/hi in GLOB.html_interfaces) - hi.closeAll() - SStgui.close_all_uis() - - //Turn off the shuttles, there's no escape now - if(!station_missed && bomb) - SSshuttle.registerHostileEnvironment(src) - SSshuttle.lockdown = TRUE - - //initialise our cinematic screen object - cinematic = new /obj/screen{icon='icons/effects/station_explosion.dmi';icon_state="station_intact";layer=21;mouse_opacity = MOUSE_OPACITY_TRANSPARENT;screen_loc="1,0";}(src) - - for(var/mob/M in GLOB.mob_list) - M.notransform = TRUE //stop everything moving - if(M.client) - M.client.screen += cinematic //show every client the cinematic - - var/actually_blew_up = TRUE - //Now animate the cinematic - switch(station_missed) - if(NUKE_NEAR_MISS) //nuke was nearby but (mostly) missed - if(mode && !override ) - override = mode.name - switch( override ) - if("nuclear emergency") //Nuke wasn't on station when it blew up - flick("intro_nuke",cinematic) - sleep(35) - SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) - station_explosion_detonation(bomb) - flick("station_intact_fade_red",cinematic) - cinematic.icon_state = "summary_nukefail" - if("cult") - cinematic.icon_state = null - flick("intro_cult",cinematic) - sleep(25) - SEND_SOUND(world, sound('sound/magic/enter_blood.ogg')) - sleep(28) - SEND_SOUND(world, sound('sound/machines/terminal_off.ogg')) - sleep(20) - flick("station_corrupted",cinematic) - SEND_SOUND(world, sound('sound/effects/ghost.ogg')) - actually_blew_up = FALSE - if("fake") //The round isn't over, we're just freaking people out for fun - flick("intro_nuke",cinematic) - sleep(35) - SEND_SOUND(world, sound('sound/items/bikehorn.ogg')) - flick("summary_selfdes",cinematic) - actually_blew_up = FALSE - else - flick("intro_nuke",cinematic) - sleep(35) - SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) - station_explosion_detonation(bomb) - - - if(NUKE_MISS_STATION || NUKE_SYNDICATE_BASE) //nuke was nowhere nearby //TODO: a really distant explosion animation - sleep(50) - SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) - station_explosion_detonation(bomb) - actually_blew_up = station_missed == NUKE_SYNDICATE_BASE //don't kill everyone on station if it detonated off station - else //station was destroyed - if( mode && !override ) - override = mode.name - switch( override ) - if("nuclear emergency") //Nuke Ops successfully bombed the station - flick("intro_nuke",cinematic) - sleep(35) - flick("station_explode_fade_red",cinematic) - SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) - station_explosion_detonation(bomb) - cinematic.icon_state = "summary_nukewin" - if("AI malfunction") //Malf (screen,explosion,summary) - flick("intro_malf",cinematic) - sleep(76) - flick("station_explode_fade_red",cinematic) - SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) - station_explosion_detonation(bomb) //TODO: If we ever decide to actually detonate the vault bomb - cinematic.icon_state = "summary_malf" - if("blob") //Station nuked (nuke,explosion,summary) - flick("intro_nuke",cinematic) - sleep(35) - flick("station_explode_fade_red",cinematic) - SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) - station_explosion_detonation(bomb) //TODO: no idea what this case could be - cinematic.icon_state = "summary_selfdes" - if("cult") //Station nuked (nuke,explosion,summary) - flick("intro_nuke",cinematic) - sleep(35) - flick("station_explode_fade_red",cinematic) - SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) - station_explosion_detonation(bomb) //TODO: no idea what this case could be - cinematic.icon_state = "summary_cult" - if("no_core") //Nuke failed to detonate as it had no core - flick("intro_nuke",cinematic) - sleep(35) - flick("station_intact",cinematic) - SEND_SOUND(world, sound('sound/ambience/signal.ogg')) - addtimer(CALLBACK(src, .proc/finish_cinematic, null, FALSE), 100) - return //Faster exit, since nothing happened - else //Station nuked (nuke,explosion,summary) - flick("intro_nuke",cinematic) - sleep(35) - flick("station_explode_fade_red", cinematic) - SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) - station_explosion_detonation(bomb) - cinematic.icon_state = "summary_selfdes" - //If its actually the end of the round, wait for it to end. - //Otherwise if its a verb it will continue on afterwards. - - var/bombloc = null - if(actually_blew_up) - if(bomb && bomb.loc) - bombloc = bomb.z - else if(!station_missed) - bombloc = ZLEVEL_STATION_PRIMARY - - if(mode) - mode.explosion_in_progress = 0 - to_chat(world, "The station was destoyed by the nuclear blast!") - mode.station_was_nuked = (station_missed<2) //station_missed==1 is a draw. the station becomes irradiated and needs to be evacuated. - - addtimer(CALLBACK(src, .proc/finish_cinematic, bombloc, actually_blew_up), 300) - -/datum/controller/subsystem/ticker/proc/finish_cinematic(killz, actually_blew_up) - if(cinematic) - qdel(cinematic) //end the cinematic - cinematic = null - for(var/mob/M in GLOB.mob_list) - M.notransform = FALSE - if(actually_blew_up && !isnull(killz) && M.stat != DEAD && M.z == killz) - M.gib() /datum/controller/subsystem/ticker/proc/create_characters() for(var/mob/dead/new_player/player in GLOB.player_list) From fa92394e4e829156fcd69caabe592f874870a027 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Tue, 26 Sep 2017 15:43:01 -0400 Subject: [PATCH 032/136] DisplayTimeText for round time on login --- code/modules/mob/dead/new_player/login.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index 4de3b1d4dd..1e3561c8a0 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -32,10 +32,10 @@ new_player_panel() client.playtitlemusic() if(SSticker.current_state < GAME_STATE_SETTING_UP) - var/tl = round(SSticker.GetTimeLeft(), 1)/10 + var/tl = SSticker.GetTimeLeft() var/postfix - if(tl >= 0) - postfix = "in about [tl] seconds" + if(tl > 0) + postfix = "in about [DisplayTimeText(tl)]" else postfix = "soon" to_chat(src, "Please set up your character and select \"Ready\". The game will start [postfix].") From 9b2f07335ac6b95a50fd60f9a1d9f10595c726d8 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Tue, 26 Sep 2017 14:34:39 -0400 Subject: [PATCH 034/136] Makes the mining vendor give more verbose feedback --- code/modules/mining/machine_vending.dm | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index b48f5faf0a..8ae3632d34 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -8,6 +8,7 @@ density = TRUE anchored = TRUE circuit = /obj/item/circuitboard/machine/mining_equipment_vendor + var/icon_deny = "mining-deny" var/obj/item/card/id/inserted_id var/list/prize_list = list( //if you add something to this, please, for the love of god, use tabs and not spaces. new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10), @@ -108,6 +109,7 @@ if(href_list["choice"]) if(istype(inserted_id)) if(href_list["choice"] == "eject") + to_chat(usr, "You eject the ID from [src]'s card slot.") inserted_id.loc = loc inserted_id.verb_pickup() inserted_id = null @@ -118,20 +120,31 @@ return I.loc = src inserted_id = I - else to_chat(usr, "No valid ID.") + to_chat(usr, "You insert the ID into [src]'s card slot.") + else + to_chat(usr, "Error: No valid ID!") + flick(icon_deny, src) if(href_list["purchase"]) if(istype(inserted_id)) var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) if (!prize || !(prize in prize_list)) + to_chat(usr, "Error: Invalid choice!") + flick(icon_deny, src) return if(prize.cost > inserted_id.mining_points) + to_chat(usr, "Error: Insufficent points for [prize.equipment_name]!") + flick(icon_deny, src) else inserted_id.mining_points -= prize.cost + to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") new prize.equipment_path(src.loc) SSblackbox.add_details("mining_equipment_bought", "[src.type]|[prize.equipment_path]") // Add src.type to keep track of free golem purchases // separately. + else + to_chat(usr, "Error: Please insert a valid ID!") + flick(icon_deny, src) updateUsrDialog() return @@ -146,6 +159,7 @@ return C.loc = src inserted_id = C + to_chat(usr, "You insert the ID into [src]'s card slot.") interact(user) return if(default_deconstruction_screwdriver(user, "mining-open", "mining", I)) From ab28e2facbcf0cc8b4fb1dea7f9162cf969c71ef Mon Sep 17 00:00:00 2001 From: RandomMarine Date: Mon, 25 Sep 2017 19:25:06 -0700 Subject: [PATCH 036/136] Air tanks get their own sprite, plus reset fix. --- code/game/objects/items/tanks/tank_types.dm | 186 ++++++++++++++++++++ code/game/objects/items/tanks/tanks.dm | 2 +- icons/obj/tank.dmi | Bin 9167 -> 9054 bytes 3 files changed, 187 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 71a2c51dca..58133568ba 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /* Types of tanks! * Contains: * Oxygen @@ -181,3 +182,188 @@ name = "double emergency oxygen tank" icon_state = "emergency_engi" volume = 10 +======= +/* Types of tanks! + * Contains: + * Oxygen + * Anesthetic + * Air + * Plasma + * Emergency Oxygen + */ + +/* + * Oxygen + */ +/obj/item/tank/internals/oxygen + name = "oxygen tank" + desc = "A tank of oxygen." + icon_state = "oxygen" + distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE + force = 10 + dog_fashion = /datum/dog_fashion/back + + +/obj/item/tank/internals/oxygen/New() + ..() + air_contents.assert_gas("o2") + air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + + +/obj/item/tank/internals/oxygen/yellow + desc = "A tank of oxygen, this one is yellow." + icon_state = "oxygen_f" + dog_fashion = null + +/obj/item/tank/internals/oxygen/red + desc = "A tank of oxygen, this one is red." + icon_state = "oxygen_fr" + dog_fashion = null + + +/* + * Anesthetic + */ +/obj/item/tank/internals/anesthetic + name = "anesthetic tank" + desc = "A tank with an N2O/O2 gas mix." + icon_state = "anesthetic" + item_state = "an_tank" + force = 10 + +/obj/item/tank/internals/anesthetic/New() + ..() + air_contents.assert_gases("o2", "n2o") + air_contents.gases["o2"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD + air_contents.gases["n2o"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD + return + +/* + * Air + */ +/obj/item/tank/internals/air + name = "air tank" + desc = "Mixed anyone?" + icon_state = "air" + force = 10 + dog_fashion = /datum/dog_fashion/back + +/obj/item/tank/internals/air/New() + ..() + air_contents.assert_gases("o2","n2") + air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD + air_contents.gases["n2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD + return + + +/* + * Plasma + */ +/obj/item/tank/internals/plasma + name = "plasma tank" + desc = "Contains dangerous plasma. Do not inhale. Warning: extremely flammable." + icon_state = "plasma" + flags_1 = CONDUCT_1 + slot_flags = null //they have no straps! + force = 8 + + +/obj/item/tank/internals/plasma/New() + ..() + air_contents.assert_gas("plasma") + air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + +/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/flamethrower)) + var/obj/item/flamethrower/F = W + if ((!F.status)||(F.ptank)) + return + if(!user.transferItemToLoc(src, F)) + return + src.master = F + F.ptank = src + F.update_icon() + else + return ..() + +/obj/item/tank/internals/plasma/full/New() + ..() + air_contents.assert_gas("plasma") + air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + + +/* + * Plasmaman Plasma Tank + */ + +/obj/item/tank/internals/plasmaman + name = "plasma internals tank" + desc = "A tank of plasma gas designed specifically for use as internals, particularly for plasma-based lifeforms. If you're not a Plasmaman, you probably shouldn't use this." + icon_state = "plasmaman_tank" + item_state = "plasmaman_tank" + force = 10 + distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE + +/obj/item/tank/internals/plasmaman/New() + ..() + air_contents.assert_gas("plasma") + air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + +/obj/item/tank/internals/plasmaman/full/New() + ..() + air_contents.assert_gas("plasma") + air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + + +/obj/item/tank/internals/plasmaman/belt + icon_state = "plasmaman_tank_belt" + item_state = "plasmaman_tank_belt" + slot_flags = SLOT_BELT + force = 5 + volume = 6 + w_class = WEIGHT_CLASS_SMALL //thanks i forgot this + +/obj/item/tank/internals/plasmaman/belt/full/New() + ..() + air_contents.assert_gas("plasma") + air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + + + +/* + * Emergency Oxygen + */ +/obj/item/tank/internals/emergency_oxygen + name = "emergency oxygen tank" + desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it." + icon_state = "emergency" + flags_1 = CONDUCT_1 + slot_flags = SLOT_BELT + w_class = WEIGHT_CLASS_SMALL + force = 4 + distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE + volume = 3 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011) + + +/obj/item/tank/internals/emergency_oxygen/New() + ..() + air_contents.assert_gas("o2") + air_contents.gases["o2"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + return + +/obj/item/tank/internals/emergency_oxygen/engi + name = "extended-capacity emergency oxygen tank" + icon_state = "emergency_engi" + volume = 6 + +/obj/item/tank/internals/emergency_oxygen/double + name = "double emergency oxygen tank" + icon_state = "emergency_engi" + volume = 10 +>>>>>>> 98ed3d0... Air tanks get their own sprite + reset fix diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index dd2ea47dc4..7628617923 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -177,7 +177,7 @@ if("pressure") var/pressure = params["pressure"] if(pressure == "reset") - pressure = TANK_DEFAULT_RELEASE_PRESSURE + pressure = initial(distribute_pressure) . = TRUE else if(pressure == "min") pressure = TANK_MIN_RELEASE_PRESSURE diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi index 8e41c003a4376de09ff19f8fcd9f6010ddd59e51..f5ce551e7f39dbf37acfe4af0ab1c1bfaf1df6d7 100644 GIT binary patch literal 9054 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 i?b|AUFtpLc+7<77;Dj#-PP(TW7QCRL6WB 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૔-Q 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%0Dc3Vs$##gIa2snpVsD`0;o>*9Y z7W_RYl<)oL1vSM__rgA|wRjMVsh>Uq{jH{_xq%bkNiwmg-0+rO4({vf&qk9~DScVR z2w(@d^ts0nvUfNtRn+9a z`0LLIp4-xhr|C&^W=dh-{{Q2Daue`r_!=DT0@!}P_-~Wb@LzeNRXV;_O&^QI1e;JR z=btYX95KgB9SH4N^-@|rpFGgT$<52N2O*P3C39xyhs&HG!BWk8rC^rCr$k1x&@ttE zTdYt00fQ$Jc?bl{$|2=mh+Mra!Pe)sn3jQ=QKT?CGDcU zt*sa^LeZrULdeL-49C|1olr>r)tG&))7B?om_U4$BV+-U1gRO#S2Y$mv_e%R{8-mzM8{ud5pRI z2b#ytQv|h~M8Gw4^u>2Sy60;iJ)029I)~Ss0ZA|-^D^4wxDWn+mO?or^zK+y2TJfp zhM!0Th*?O5*0r?q?c^i`K1qStf$lb&tG3?_bzNUhEamq?E+d<8kK?;c_#ZHTUE7mL zNAdw-F3$V+Wg9;CUyUnhULJY8w+E_;Sar!q?w*l``zq1#0Sv3N@V(XndeL8X=x3iPG*1dl#uBIELNW5y=u>+a&c*a3 z5hs$gRlj(0ViBPf@yOpICN?M3w$kBVXv|tqj3%=t3@O|j67o%4^K}Ym>nv6E#c%g3 z{`>86u;C31phc?$(Y|>E>@2!}x8^;Cs*Ye;=G4>W6!59JvHNUn0<1I+A0*uw2j3*7 zj=%&cz?J`8z`VZ-A&Z1O^Mp!1?^UA@MrNoT1kQn@*_Y%Z2I?#!5a5Bvi|o17Kasr7 z>a9pf_em6n_QHbz7jwCF&h~%jd>$I@3j((kf62o@l>gDAN17$Z0sTcW=@*+Bk@-yG zAI__B#&A8438&Vl5;hm%Qj+1JWjX4fu`%8WlU|Ea*P9;d0%DykunG*O}H-I@Nz3@#zO26oz zwoa4R(wT*U6Q=wnAWh8}j2gjNIy$<5P8?rA{U&DPxz)K711#6t_@NrbH^#t}r3b1Z zHa6vqbWv=-!93^q_z@I^j~t}mELP20pBOiCurKL91sUf=fCVNxG?byz8|a&60h64X z0t~WND{E^85?qk{pNp6Zer%cv=lbym6Owed-Sa8wN%&qy9(Lfx$0;(=i&PJqBd2S% zm+c`-UCrJkvxQwb%6H!iZW&8I@5C<&jDABBgp*Q`R{@$5IQL=$lO-z~UvHDp@1nH< z##0iduLI3x{E!wzjCiBf*L{Fx5F_TYt5o060K^tj^Uz=kNVpL|+_cyzVp!I&vTKID z5pZt4^Oh2MZLq4(MnEE(38mUhC#)!>Ak67u(5{|?BT#|NJx7ppDH8gi_(6KAbr zaMsMpAoc8dydvyGkyo6Aki)LQuh=*GF=~)|V|LzVje%G%mbHQF`Q5y{JlV$_l*y|v z4wA7B?@`Rf_fX7o!e68mFsl`q=QTF!Ya*{g>!6E`5Z|v~ZyVY625$5?#$DtUGuCTq zSfI{8hJQZwY#g`VZ7M&5>OtFxC+&VG8#RCC%+zlnmilW&IfY$GAX^8)5rt9^Ky7m! z@@==f?0doYZFc)TAvz(R6v^01j<*EXI)dUF$#s3X#rpXkm+v95$5KK%`~w(;&=82Q zP@0@Sxb1=E2Ih?!;svc)4cZfmpvs#TbxeDyN&I2%lQbR#;^68za3(bvv%y`)o=-h$ z{tE|!M!Iek$esM@F0}pdYy7$0xZL)7(>?LSo%<7={U4u^7_fbEPJuqvLusYiT0H|V z`A9FnLl*>^(togfbGnQTi>k%b^nQh4`JzF*H$bsIG9sc*njtI| zW3n-@d;my%(lMVLH^>&QCduW-{=L+gO$D&(d%U zNaeu_`1Y9nVUdq$V(1RLg)8sK1+1{!R05-@U-`P{0yaLXsKXS|HJV1$lb7QDHaDfv z!3Dn|FBLo7%p}gpMi!84R_uz#S3hE<$H3V0O@g`-8Mv{TsXj)R=1p0-?M;JRhkw5x z^(6NDoo%EHqIQR&PkMF=jTR^duR$bzR#{@N5Z?9mjcIQ#t7d$26W~s)R_my{zy)94 zUBR?pWzo%!hAFs>BQ($UA%=RWv93dU_kns+mSNIwt`f`Fac&6oJsug?{`g>pV;^Rt7@W#Yz;D~XLL&CPzO zdn16tEOfq;U4cp9Ad_TwimC|JDDKRGYZJXnGSsW@oRlJKM1Pc?oxJ9}@Z>`0TZHf( z>f$7fEFG69rYdaV!Q-(iIzcpA8S->dU&5cRz*VZI(M@s26XSnb#AcXsjNPF{SCn)i zn}SQZ6?bPCwf7=+!&MKUf=eUO$M!k(My6Y%kw|g=K5F#=x@Lz&qmQ#Qj?}52UkT# zlw)cL6^;|$wC$RdgMx)mN3IW;L1$ox$2&RMn?*j?o=!NDPG33u$Eqo5j4P%(i`0cO zroa$$gBbL@d!Ofu*2!kojP@;CYXpU5D~rr_T7^OV|Kx#t9RUwqQaO-=mG${i(JU_5 z8Nx{Ef{$<9IDFrTiHtfrI_T)uAdmeu_l_8bmlC<@-)Ik-)!;E}!++YS4ghy1W6POv_L0x>& zrRCfo#fNsZGxPBco17@Ve%+R6Z?DN&V+Eu}wP}?Ttu`p_9esYJ>2G#XtiQ{3EH}t} z`Pd@~Gd@0GP@uyG?!5o&*AI-@ppIIiQbAaDEl3nhU1L+1{6_zpAk_ESWheLi6&-jL;bxs{{{v4J3)}yB(6xeWS#iw)RA3a?H{(C z#`x2-)$4^km8=<;@8JZ>)+?6wk^gA$xy8ggg4}4x3iMThoZdy0vw;i(MRO67=~WVw zg+{mJ8Jva=l|P7}I_q+x^wS^|Q9z+^x(Z05(Nv;&=EN_DVX0n7Qi;$2;RoY7yWjeBf@jMN_tW22@9Ocg6U_(~xAok{@W+%es zjA<#L_T|2j5AWW+3xO>3KVJrE`t1E)*(M&Io~xtP!nzF}lsMz#BbOW8AZOOb){eK< zWiO<#+NZvJ;N!_8KI>+Yev|xT`B$7(v!BB%iFwYzrk9fvl65zq^?rMBScG2@?B2k{ z_)16{x<)~1<$6arn;pvS{pX1d*tDb6#RX>60DT*9?eXr-m~9?oa%Vr3^@RpVZom-N zB-0-i3X?*DZ&uJmDJ^~&>H8&Wu4@Us>eOphwm&T$L)Y}yrP!Fyxm}x#jEk+8>`tth zB(7cYYIcG=Jvdi`EKSTQzRkOpjgWf0i2v9VL3&s;>nDoQ;d7kXn?U-8{Qei9K;#Si z*7qk$q<@`CVy(MN6*v-_7At8PoX@kd?(&4euSov2Yfe#7)dK08j?$CDFV6N0bA>;( zH_1o!#?D&4IqQ6ny@x``LQ!T30*F_I+O!;uDx|EF`c}Dl`Df2#>~-#H3|)W>21!gW zzl9)2jo_k(tl&ia-FAxRgqv?BkZC>DT;Uw135p7J2Lh1zAPY6m1=qZJ!TY@%rV|&7 zRwnsaC-7o&59c1Nku^)30J>~;MqVp0?*9X+6aSae zH^hS^UrxV1pr6ZPJ^A?Wmk=d-Wvzb#9PJ(1EBLGDQDmUh1vtN#>L}QBpSRU*Twk!U zSF@$J)S}i9w~UXG5;W+kT9coITZWLKU%Yf1E(5AE>yvDc5`Qr1eqQL5w)@c5wl1I|dh0Iq5ogP02q067f#6Y^_8$1!%_e8`1obr^{;ycK- zlmA`!>Wno6oOdOmY(Ew{xw9Ip5>QC&ia1! zC84*o&J_lxUhUQ z_tV+4npGttO^?FEb53&Nt)?)e*!VIWUQ<3uEuC_#r3hy5?Tc1opVx9`AI&~}?z6={ zPJNq;CptVm0v}h``CRrET{V+41q4@5BlD3CCRKc<>^&8*MP@c1QIpS~ClQ@J(_ODD zVh>mw!Yv&c-%pzBAQnBzx)d#5n|>%e6y$h1NM)enn>_M*2@Hb1M?1c{p|nYStF_K` zUjSOuN#CASN>b*~-l^E;5KCehj}WuC|D_@c$8I**<$Z5xOqZ24@BfHeOm{I}l~=HD zb7N=RZeEJ|F`;ge4_g0qy^E2BB+e}TV0iqa{LA-FmuCl&Ad7MqKqA-&x?}(Qe}qIn zgY=K9qfNMNZVU?{2}$L5AeUrkSoO{TMhoUn?G_X&i4*#agoK2Oac5dS@earWEIJdB zY@8$L&V4G0w2b~*lOg5xL96rK*H!zht$ak(S9;PEor#h@22?<&M&jV}tnjXRWnVyA zDdT=R{9tWAO7_)sdyw-ee0QaF7rg5!ixhlBjX?!}t;>J}y`lqG;p|vUaCojZ#!#JO z@^+xet1h1?^DE(fQPI2Otj(W3-~;CNg2>d_kK0j(!^6WZtB%K?y$rF)SB=AckQ{O6 zK2yk7(g1+_7=EUT&iVbkyQk-!n@<=17oYj05Z}aF`{Vdl!3!5H%B}*1JJ`#iL{L#_S^$+|4lyoTM9o)~KeY@tWa}oop7%ID~ zdUKx^HbK8_Zd(3hED|c85sp5xlwpZ20|%CmYA)siiXQ(2YTw9LEoGxz=Z`K{hTwe98B56AKkgZ;CJ za@n>F3Gidh_i-U7l2o4(QZPJITa41JcE>f39aB~-F$6c{QzHpc5;PIu5{53dL5Qg- zVkVd9{}mh}8d1XlDPh5?LJ|N7*;WF)QO%7W60fVfTfB!otD>R;;7edFR@c$lv7Zr5O?w z-#&f%_dVo`c^6{oaDw>cX7~*VJ-cnWBqY_ql9L45Pj*+))`c`iaAmV&ImBCSSWQjy z!D$H(8cDtejt~i@&Bfom8BbtX9PRCwc%}gKbFV+E5(|zdxIRxpFX^ReDPD1rl$^rV z?%$C?UL}(AX(2EN9xtJ!31k^O#A2%h&Zm8 z8>B{HRA(2#ZGIH7kKB`&m92PRXPL`RvaIx;6})IMUDa3`cl68eM_l{8|IioK*G6|5 zr{^`bR&1I8mR8~1rpwOP&4A1+aofs@BLlBkE-GK}(9@2v zJ6ZzO@fJZW!Gl?+su$^wej-S1$9=*G$1@o)8`NvrEe*J58Ta*=CHm5|7b*k$7o^755n0Blif-AQc0Hp z`Bp9+gmiy0!Jtdh{6kQz|I$uoVS)9##xr+>0Q7)7=);`az=t$f%5wMpU$=*@f5X|@ ziWO)Y>GKAaMflfAo8A9(vmNEhL(A?i(48le`~{-;spB?~zoQk2NDEvkAA=2Tz9waP zHj$DOaTb)4Vm6-D-QJ#ER7Bl)IM9b8UWT;%*e%M*8Lr1-L<8$9f4pj5QiB+m5*XwA zwbl>r-W_NiETWTs4wci>qX25F!C4A%Sdd6ikUT?vF-SS%fyi8uJY{*-HX9`D?h``n z!6{9NqKI}1fe(`VK8RbYYV%VZu)Ou*1WJdq?Y=6E)P*mFz z37nl4>Vx5Ez{kYFVE>TY;$#!4q%rwVz62{L_dj2O(e}_|K#j5=`}Ln0`SJ3zko&dZ zi988rd8sJr+$t!Mm%_ES^l&nwEzPxRwhu?_>3Of$+cS%k`) zJO?P7N4ye%aR4z;^WY$9;21E&(&31zUPJ)kO+}!*L-)ljO5(xpT`e1kh4T7DyJuh#V%#4usBn4D&OMkb8&VXypB_RZx#3ou64$KQBo{w2np?q@EE~bNy~|q{@Ne zco@e;Gykd^BEX*5yO6K^VGqi2HN}0Xr6A7rlqXKQ?^#^O4yj-yYV!U@d~tLWKE?e#>G}syf!uR`xnZ#(iQyaSWYfD-0WHL^PqnWj%L~q z{cm`WiG)Z>7OuPZB;#LRF%?G25N$3DUfPu#+?gH}4_!oEq|gX{h&Ze?7YrOWD&797Zz4>`oeReO1+RfaSGi=>nAIoyMRS7S z(Vl37beRFrwg!l8S{BkO;$^UDDMxgnG1l3g-XKnGub&49QM9u`-+E07=Nb%iXMj|BPg+ke`rEbzh-Zj-o^pbGDP>@1L3BI*g@Y(R;WU92 z$Bjv56KmyKZ#BjNCq<#<%Fe~jIbWV8Os`YZg;W|EP%W!xr zqR6fM6Z08^;rMtbxrBMd&}uUjIlO@S(5Z;8@Q5)qLBL|6m`6;EuEu^gV6Yo-A93Q| z%d*uv1S%kabcs5yEYDMcsPQaQ0&DC(k!sID>rps@Gk;(9TIx_;3F8KM~iSVo=Gn&*)p7dpTjC)sp{JekpYHsr~JJkMTKETVw=(5`Uk?}Ki5FRu8YmD zUb0v7&|dv>64)+`*&dz+YmX6_*uc@8T|Kyw3xFpO<1&8r^79?s+z2f2lov*ODGUS` z@HE-mu~QmEXEMJl7TB3S_4D&9v0s$~TzGOlhdN-1f2X2C4iZ>+8qcr!iu-X9p-lk) zgSanXPqJC4*V-&`$CNR00>ll3H3`n9Qx9VdE404^B`SHE#w$K)_<#)2n?g7~w;qg2 z$a7wsZ1(+Qpfm;ZJ6f*NCVr`w$nm7~)(TJoNl+4CBhRT3EV}aGCh1Dac=)-Owu}Tm zZula1MmHzQmh2_$rq|l!>=1<`ue?^oS{Nxj=DnoIoc|1K?>z@o29-EGClG8%cfDeV z#3HS^(T+cjZq4sR*H3@KysqMwbZRsd#l|3PkJY%ASZn7`PGs^E#3rqtTKJ&hnwKMz zkJh6*<7=HBdHCye_?C@I9Pa-w%>89pR8bo?3=bdzf*{f@Ac7zuAf1v5NOyOKNH+@7 zAtK!%-3^k`9ZGkDbjQHVyld|Jxu4_setz$-mxDR>>@~AzueJ8xYhBm1&g(pNn}2E$ zEYVRNXpZSdGD64k-bU;6pK*Eu{}K>s3Hw=08@p=ERo zj9d_thae$-FImtUf(Fb?s)tuMVnqGAd_~PmeM+JS9$NwXPa#tzN>SuivY{!ze6=rh zhq)`@Kgfsu3n-z5>E53_ zE9SVGi|P-v!#?|E29VF!Wbxg3&YGW{6E?mlC&!48_a&OUr7TRj;AT*BEJ^vYtCfu~ zLaZ$c3Jc%e0xN(N0zA+`%(d4qAiWz-=eA}Z(Pko8AW+iTSi84bYB1YZIHed3#t?_e z2$c7nExzBYlj}?h-wGM?^-txqQ$a3G#B@ks{Vy^!iG65gTv;2vgPZY#<^S7|6i5J8 zs~13`Joy^hCcirs;n~T7AHNg%<1OI8vc;cBBzqZ%Os!G&%*PGm_A%6r2yOd`8)lyI zQC@N@`5Ry7iLX5?9rXJ*zAyhhGS}3B^S@sc64-vRjn&t!diFf>ElDfEGfeLn7kfPp z*H=eRUZ|NF1~Z3e#|#7+w9YC?IW?z)6V0Zdu2FRcg&)Wr1c(HSyx>xKST&2{yXe5^ z`tDV89wH0ZSX}Cgp~dlAcFg;|Z(795y#0r6PoK(EZca3~ViGV{v*Y6j;`quVi$X)+ zIy9W`CZ*2a{0#c*!5KjfO=8g`E))V!p7jSj4et5-fr&S>E-K2aU_I937uMEx zP0n8Ja*@aL3_(&p@;s|gk<eHl0%qWSz%hEKy_LRq@u}nf8sZJ z_33Qe_R#P1sj7+!slU}zQL5>U2$unv9p3k|b3y_EK;C2P$2n{%CHbHpj|{crY?)xX z@|oGz=F1mqW$ifU$^P?rnS|PH<$`hW3={Dw=+Ns-MsIK9op>&YK;r)`N=zk{#ic?U zZ@Rc9Bq*LX489d|>7_^wA4T2OgDyB@WZ9w30v)M2o&e*McGeivhDOor0wT#3U--is zUCc^=6#7@i3$Y6%K+D(}PLk`;E=@Rd4qnJ{s!0YmJ)oR~Kqx7_pCm)hIAj)6P4Gz- zQ2Xs@cU)fMKq~uTe*EE?-{Zb4F6yEGGh%TtG+yG~578ET0R%e;69h#xeePWl*Fp6R{JNyd`Syuu!$;o1chIc2Z`M3GkE(b6&Bp8~Xk-2VB)0Q81R|40b? z46zPp%M^s#!Cb_FAw6_U-kuYvLz6-(OYs{Y3-_dsC*WAv;uNPMagC*H+8q$1JN<>S zg+4znVm@mQW8hM&3|so4e{-XI46!r)8Tija{LsW1R`bw;mV?kC6+jCm8}u5pgs%6s zOMl*w=4?Eq*n4i~C=#27b1;kYoY52jY&y?28M6QmEtLn{&`Ac2v@%tIY+(?rUxBo` zG~}o-xVS-`jo3x`z&A%vjFy7CW)?H6P=YJ~z)J-%4%GkOKGvFi#P{J>$PK?bW@n`|9UigS@5afV;QAm zsyXY+nBy^ld=%H$!|ppPDdU1Kv4mx1KRy%qHPu_fdQxoix|TP^o&nEjY6RghQuRat z;|=8$t-`juxR#Ic2%u!wsQdj2eNUGHv-&AvO2V!#$+iA%0OrGVM@p) z@a2jBk1uaK_wi|HSQtJz`=Ji`*?EPgh+}|e(4`3^jeNM4V5G^=`MWoT=W#lbtjnSi z4kh0cBE~%zQLJS77aD*V$d?))-x$`Q!I+86g(M>@l41%0{7*JK*MS%9_lcF5}176Z4NT$f{%wC*R@p#Tswef)2wi57;XS?fwPT|cgZuBME0{P=O$!o$fqI*B0*Z9n`c0_*FL^Qj+NGfq%*+uj z{T~)UE8?{SK9!)BSBBR<%|gRl5*TBO5Aq;_4{g7;Uz!r>D98~h<@mm%__EJ+Rp9}2 z+>s=uRgRdJ=eXP{*vK4ja6eE`gOut{Q+vQ;>IuHWQSVU-oI)v-hxhD`1M= z1|=lu$Qym)g!uYhz7Y`R45s0};a0+f5uokGk}Ac-37eo;RUp6+UyC!thMO)_@IJ$9 zS9JBB2#3!f{gurV$l)cspy~$b09Chq={TXw@pfH2bkHo!N4t1p-Y_}2m}bA&(H{xa zGtU);FJcZC0%qGD7hc!Dy3ehH%P6SXkd^CG@+<$t_pHZ|AsV-xc_muU^CndHwuy_j zCmVAD2PIwQiNyGJT0_ZGAJODhF%6tn4pKynPTb^r4q#+r25wI-wu| z+ILk)iqksG2%!|%D0A)Sao&w=klCE0u7}>`-WV?PtsTeYd{}boT%iH(6guQ$m-cAd zG#v}9%@?2c2Yr!JI@{42Hh@zOIge~huzl$qiHFiQqp~avhe;0UQH@}&$pwOiv)Aqk zSPhxyZ{rm=vh(0xDTHyI~qzg_6bKvjj z-YkI03+8_GrdFGW+)NDV*!<`JV6{Pa&HqrDP=~Zh_!|nt|I+#^16Lfj=Id;6uigLA z^~u^pv?_ljY(0&fR?ivuuX6@!YRq>8(NQNRyV{#4 z9Q-F8VY?D+sDSIm$dE0-i1B;Ge_}jf83ND~!_SXj>WyI1@SVaa(QuWyRHsoh zylh%S9gPDNQl>35Es9HbGF545n6$ooR!|w&{a&Bq;z}EJ_Zv0!-vz~k8<#t8J~Lh-u{IE^&`dvCqf#ZmdbQ+pPS-b5R8HM}&V#acm#)8GruomC)G?_as=>t(kbu z$mR{!jBlwo(i+pVrJ@(R!Rg;BC_Fe1BhUTkgij^P$oOSRlo7|kSA2Df@d2dNUl4Uq z#PbsCH_W+nH5zN}MKBGb&|&G#RA%3GQSsBK$OBkg+MmLjT_q3>OOOs|1AW$!DtKFY z0+(&L*m;o;EsmLL#FDFjd}>?V-EA4k(Q`qXlCv>ENQDQPZl^+V%>;YdNz{SL@=Rn( zNKg6Y(Dm#3=8vK+IWIu;O(HVGP$mcT+SSw^3#n+ET9eCQX(Wwdu}@PArB1REbtXmc z-A>T&^qWPW;x&6W!ZtkvTp3@x7_2bRPppU;F$!2B!uDA$XSR?CZzT3{MUWs^BvY#a z6>Nc;_uZnbPq9m^7RDTc6ubteX^)}@;W+JtN2_cKlW5V?1Nxa6_qKI%7_sc0kst~LA%!!hYETHbp5u}=RD-3Z}?+r@NdYQAPWPF0ageV=?$m16}x zT~5r^_TMSDiI0D~!{H99c`h^Za}6{2)^apmU0vFMJovPT`{fToB0B zot_91Io|9tjx1RK^b+bHuL793oT@7Pj|h{X-&|1nCx1L>3#N1BcQbo2szG%>-F5DF zMr#V?k8v8|?9SKi6CjbgwMD9@BfKlS>E9nOKJy2wR3{Po&!(QW@9Y2?pmgRkUuF4J z0rmOUX7u~aH{#u)rd_Z?Tsh1WUo=wi>KZW4WEZn|=)mWD z(pwNi5K^NlHww^*W6_xRF}(JBYLt8* zAz}zNv2rQ{Rr?MbgOzNZQ3nyZMoIaeh5&tV# zh2^`QY^epD>4=J#EG%&r;*87Q?EC)??S0{HPiM14>McqN8X7<@1=y&FM26jl*N@k@583~$lh#2?@b7?L!pGfl+9dfGqyrvBk3X&MY&8Ov zhrHf}c7IU_lkIe=GRTe3l1~>WW^;RcecAgs z{wWOvNxbHQGmmfE=~8 z13E=p4{8v3fEdML8RvRGUXTlaD6E;Sj){o9 zVOtqq9-QxQ8{(DY4o#o*Sq{LLPfYPXYO?J9@lsVwTpZQ=psMf9*at<4a@PanuHd>G z*s)zEQzsZ0ZETqLmqo+3HYHzY7IM4-6RGPlO%GTfSnyqd$Q+_1L^K1G3=bg8?q$Kb z;<#wRtc#%ndl3gBA}ftaDT*ezi)_O2FZS9PbnxO&@gbVs14mf7^&(K z4j1*i=Yy=m`HgQrdGa4+5?Iu(_0K+~kn16qQsmHbRo?DxdO~>T>@`;IvPy)L6l`{RHMJjrFrB+k^9iK`8 zKUlmXAj%8&@rV|(j0U$bgPU%BM6Vg=Z`)m^v|m1Cz;@{_8cJN_b}7__rm`DqOdihR zeK^E~Ht(70nlzXU|}l3Wkw#=q{!V zjL2SGcq(9CQv@q&{EpSoYC3PKDu}Oo}&k9Q#&K!97#&C)VP^69Fn)sxpyED6n5=pNTVvBDdaqd^#Ha zXd!}S|N0a9h05y35mUGNM}-C_w3dMD<>dTa0x-ycYd`|MI>Z(g6`h=!(GBUU;|=CA zC4Rd8_MAP%DWRqyMNtOo{g{eb&EK-Ol>Xmw(e~e1c&tQ^A3U9`CK_;>Z^zLO1`WQ> z;_MSw-HPj2qBUIo*hLfTzFjfveoE6QxQSgy^+b2DK}Fl1dgeN8o4TA=;g4RvyK4-< zdWQ1$9h2lc)aTEQ-* z_IS9UH(3$&q2ZYv&ha{|X)U$u0Xv5e`S@9`puGEs#AZn0aiW+SQSd8~Ly!W3&(F`V z5#kivW{<$G*+H{)^fh@|V_La~nFJVeZKz{p0B_&JDRp%~Wzzw2z3>SL0{4oUAssR_ zzCSk&TtO^mcez!N{MX~;WElwevXL)oWe7W_FA%VDG4LD1*?aG~5Do+W&wdXF31maI_%nH8fiCWV_vb-xzrhv9rY+(v ziZxc=l~*8l^oZqAyT}@>LGk8mJH=AIUcKEA*8N@2fR@jENV4GE_NTwM-!!Zb#GNhl zLd&zV#IW)3`T(o+M-cW!a^eH_A6W~LpFlgn8rf9eokZ;_{mGeaBxy0IC!i=4=rT2d zCnJpD4iC25*Lc*o+i95{CZ5*LQv_lV{CI6d=0Nxdb_u!#u@R$5(LUojn%$6S z3id~hY{6OT^-hq5-53!&Tv)i!yfK#IZa-S^=m{1UR=KVt7i^PJ)Vk82;!cpC;{4cQ zSd_buwPDfZ_U?Bm-NNi0U?UJK^3;B8=#mLLbVLKKrw{Y$x)E_;TLydJSS^-b- z@#iG$>`E&o@MX81rSN65S!U-{d7VvHsvrz>bk#ASQ;nM?oCgTy1@N0XPcn>9WF;ld z2!J{+9V=^;6cds)8y~-@Z#@o4TmApnpLmjmD+I}6O*ngO;HiEvf5G2L_iJM~%oGwZ z#iIG?URpA`2k$i?q@fE*Ld^PPyY784?P2h^t7D+-!;jrK35)>e>o=y>y@}ji<|ST< zPw#g0zas5(mfR#Y*1!Nnrjn8)H6Ck!=c^>pcb6Mz{H_N}I`=$6LsMk`@mhd3ph5tz z>=zpuw!TpFA`7)r>C5!^B!BNd(8kg0*-lGIM36BbSYz<>MBp{8(9$ia@}PlSaFz^@ zb*$%%j5B0E8q|PnJ-%@=-K>_Wsi_nIcpyKMfQ~*I76p9bUJ)cBWn1RQy?IoE#&FZ~ zp8LLS!B2}~lE0n)T&)PqqCZI4`rgwAH2WYOyw6B}4})bUOAN9i&o5!zJUklDpFe*l zEKCI$kP8p{vY-kK+Xxed@VdM|+mFwDJ6Lb`8)TPLEo!sF<4hUpcC=egtXUbj)#cMX zF}xb4A!04HHw=DPPnv>W3008sQh)5YqM5`gd?j*GqX%8j1-CN`6VrGk={H73MvPXR zng562u(FH@-^l(tvWL7SeUhuA1-sRa_zZ01%LJ_LI>tkq@|nT}9u z7LoqGozynomdEO8l!EyDGmZv&uN<0m5zyMU zoyRj!>9mq%yxKM#0DuSjQ|Uv9l;iac|B zzTEryPC1)q=vOoc%8m!pmoZd8qhM;T$lStWo|(qMd4H>{C&jTie%t71cABo?6(xnU z0>=!GivY~tE_(M7uvKR<<9lbzS0)Dpq1Bz?4WL;l*B695 zIeukm-P}@V^-wLNfC-Oi1PD=qdk!dz_*TS*7?KkgmD}egS`+4)s!oOcHi4sY(buE2 z3Tzx&9u@x`T^L(rczCf_`pX(D0)_$bC(tb2G^90!w(|YBXMrFGTd+Efqm3A1YsT3* z0tls#ARK@O8C^nf7PH8n-qt(TZe`m2u~>SeAcQ!1W#|pfR6logpZ>7X4Z6WP)A3Ha zq@3w7>799^zJ-Q|?1yAdDS7Z3PUAp7b6WU`l>~IKPS|CmzW?~~oI0JSw|=3uU8W#P zd79+1s1TR8hJQHOwfSA!t@Mh7tG9DsJ@Lkd;2d1|wMbiBl3;z^KPM614FUYAI&2ZG z6V-#;=Ts${<&(?WZ7PBqdSAG9Mzag&uk>Z!u3kCfxh=p!?!ZUDc6{GXVoPR5RgcjiFHlpw~G*X6Gk5eNz;c?bzX-<3+BBE%xy?uFU zA!}DlJ$)xUT0PtSnrCqS$JOyl4DdiP?iavhS>=!L%RBUMJET}4As-T*`zd@o_~{UI zI58v(p`F)|*`zB3N)3C)HC8C_JNl?j{r_DC6=L zNDZ*3kZ}*jCkhq>G|*{qSuiA6sM$K?d;_MP=z!H$IA;qOkI036;-UpgZ_DVuN}W#JEL`=z6e637F1YY_6iIUKZiVs!$LYVyOjyo7W+pC^%rxd*eYd8pI{!Uz zOtf?_J%+QVV6o2!9N z|0`8y0gbOTDv-vhG}&m@6v3 zB2m3bklY8%Bs396b$k`WQZZp=U2zuYpqZmtRlIr?_mYVL5-|kPU&nhPGLr8ro+$64%Q0;aaWa zyTVBY8Xxx3S>PpRrY`807Us*0=%G|Bv1e{3#Zdd`ST0;v>o zCW+1{#pF9*bG#gkp9ceQ8hRe_#?{ILo+UV=d{P!l2Vms1tARD_QYvZtxEwDpY5I@~ zZ%93^sXj4*m#MDAJA7zDEzfLYkLGppv_5|r2Id%~cGRH(!aBYE7J)mv;WH%0@gTev z6mk_@gU7%N@IwjDIN9ee?Pz} zBXJxj^JDXd z`&4V7Kr)}gZTqo@ND~rJk@agmoTbuYgd7OTJTG)LIGb^-8)jX`z5@a^xtbLQS~V7r zfmibt1boeRc*$9n4j|u}@}A1Uq4p8b!lLUrHCNHm;bHm1yR*McH%BTf&Y+b!mS#c6 z*WcMr`E>oJ$4RHl^-Bio)5Lq3O?kto8feF9+!*nCxL96zUVdOyBHF(X>*^^)Y1Msm zo=rlwjN9(Lr7q)>@CSVnp8or2!5>g4*yDEDtDtxRabQgTA);_J+X7X69}dKGFcaGp zE(d&(;AVPN{PuS?d6rk8v6KuHDg?wVRR4~74U$Q!_r%ANhYS1qW*lxf_9qIup(RQh z_5FKCNJw=);#2Q9L(HJRewwMs6${TC!*QJ1>x$78ml{sj)fL2y3sm%+O-~LS&m)^k znL<0sC#6|=|7xU=$44*`d^D;lhmjfJPF#C)<3!&@Pw??>=gP7BO4PXX!3bN(8jsgm zblc5q`YfX){9OIJx5U}feSP<-E5QWM^{0qUE5hIQCUk*{bNJlir$^KME3OZvn0?rU zQT)tOI=y3{iub3Rw4ywzKatHtgFxRh9Tfe5;~~Y3Aw@1E-?O>lQ#+XSp|C~NX4KTp zxyg)=>3v5&f7_zxDG8GtS8-jFsW56?phW!jUPQ!+QEu^93Q4I*X{&8Yg5XhgRmeGO+d}VOSk`6%C)ta=5XE7_f=2v zV_`zTNLX2Qb{UIaEO^osN>Psp=)>yi?G@Orlq&{9zoawXh&dc+^OSOcCuZftc9g(D zbZFXd)&+zV32k^(6cI>))96-VCyOJnNH`$1bzV1y2X6e-3JdKwI7*9W26i9T?QceW z{oxM_{vAZBP8_L5yBOzg;Ve%Cd*{ECDK&TF&ekaI|Mw7)ZAD5pNbQY?zvQN#!vb8w zYYXWp9XP|z-njaIsR*RN+w84b^_(r?dfWMBOhNpKhYklqGCW9| z3Zh(?47@H5MAhx06FxrwW_RxAZuE(H-^1A-gR*j6j4B5z zoG@6=zr+ZV0z-#8zmKwMn?0yM`o*eGT0pvaB_;#ir~KMQ)WfdUiCHZ_azJt9K52RT zy-^GKyS?uJtoqL)^%7*y63p@WF($UjPnVJ3Efc|;u)KD(~ z$x%YqOniS5{aRk}cfRjR&P>2t54W|79#w3FW{m*PBdP)3f>5xO1NCEPW0Qvdnvz{M z1w}V*CdKow{}kfC2e7ok>t+HI2e$2YKj|G&)&{ZtmG<_=vq2UVvCXZmxi&nIL&?sQ zpb7ELjZM%sde>6@q@g)#tKf6%1mqEpwt>h0ea0eLQc^n?xoNnj!$JhKH~STc4|8yMc!<{y#0euV=!5{nW`$8_14~ZjKY30^f`yaA|JqHjbAT* zM#E52QK74LGb5k(I~#eq9wK^Ai=@j{FVQeQ^2G~ZUpHAYsljWT*u*JZico^dvqmVIf`;(tV{%vDOtPy^dDTF;0p6s6*tV@m1G=3C%=Ug( z?7rSK)%s=3#XT43!Yt(k5#(g*mrGCxO761m=c^8q4te5i+(aMea8h1}MX5kvZNiRK zlfKNfrMX&b0>H@RJ4Ql6LJvUsxzf+c41!7x+o`K}Z!Z2SPL%2LLOS9UMX;C*R`S0| z{W%{K#e;z8)7u7zCAK~K+<6oDQZk~YMd)y^q=Gm(x%a9f7I{^X6IGdRgSdLEkmV?) z;pZBl>7je^RV05Tm6yd@f;d~@rHFdZKmLWe8EKD@NB{Xqbfql+F+H|`I(YbSfHnt> zX!$?99qwOG%u#H5nJhxZO%**o}7!xT#$$fn=QVRI&OA&E^c8&0;v| z^Mz|kd@s1jUjWf}cTdlhrysb8!F92q$CzHeM1dFzg7_1}XFnXMJ{b%raiCRJV#cDc zfzCLNDDgiqasv2-=PzE+v9TffEZaI+XZa4l`!_jwNpBmn6P`K#077KefIS7@?Pbe_ z*{LU3F=Xi30p=TIl2zbvoCMBs0dmCqwW6+&*IpbcjBrc+@WM&=l(?6*dJ-d%wihNon3Q7NJWpxfg$wG=R8VW9bdq5 z`jF23y4~K;2er;K^!WMq@UOT1A}Xwaey`i5sQYYKe|M^m>w+sC&t|^PpLqTJ_%oJ% zCj5}(m@)cEL&4A4HkyAXB^qVoCMI-Bx^_TUZ$R@0Xr~G2yuo>DZn}X6G|)f4fey>F zF|@@xTM|H6_bj5<=qA%JDK&MU#o_GH)$MXa^{y;n$N@t_8(c|0vOmWZ91lpacBIga z4StK1fexfKO+atP=lY?sZ3vhce-+NY;Y7gGGW>JrsxZ~{eWv^N+A4DnPfo}eh_Wq+ zGU1(qYE~M=*=|e$WzX@V)SYI_M5({Xi2!#NOB*LcR6q1chhJ7UyA)Gc#e>i{cnPxE z;&_o0zsq&-kn*LFjjS#Jn3_m8$d(FB5L1QdM~Q{ZO}`W`_`t=$rjpy(NUAN!SyxJx z3|UP*1@%$68YvN~RT-7vi-?-<9MlXVeT%z%$yEkcH>^8mpw}Tb|MoR(Km2p%M|&}2 z4jLDH5kqvFXtuncio(r|@KP9SkLAkxKJ_&*L%pZKOx;jx4&lZuUdAlKP!g`xK#~b! ze6FKIE}gWUpDQ7*m9!jG=#VsG{U?6!z0D8p?m1N{{6Bm*#kJ=Ht)XaF^DiHb;$7Zl z5kcut)z&|@HOK!&kd!6BrhTH#9D1FfZQ6BkvRL67?m`2u=lI~>)e#y z{gOvJL*9{l;oWiGKUn8KzUUSJb^-oW(W4Rt7YHOx*qfMw=Z(b(-!c11uyuumDx-=t0?jdD}5QmQ3)4;rrB z7h~jWuS`D%1E2`gUcG$TR9N{3vBZSD@bIcY^wq`teLM=Dlz6E^{cuG(|=PhKkN+@bur}JI1`7q__0ja!*61DC4>I?ym^bOJTqng72 z4O_)X<+(MOQAzC63s;Wyg?P+(f;`92n3z7$A~vrwe3C1y-~(s>>XS4+CzEutC8Jqd z1kh*zYI7j%mFrtl(yljh+ybLh|H#N=0fZMA>9GoS4E>L4A61`xZy!5aR@e5HTQ@;B zYF}67%za%eclvUGZgQCCP{T*of-u;DO(YL!b{KUp&g>CpDx|?4Xaxw20?&M%QsBXT zsy4}zQ_U?wNW{+@K1wE$;9N!)z-jT&{&FuLuakPR)|Mz(Cj7n_EASAEwcNRmf!T?5 z^r~??5Ttq~xMeS>n48=3AG5_Y5z_1(h0Q))p%e)$-H`D?*L8AoY7G(4@x_h~HUXoC zWk;8qF0-vnzJ)71vF+5d3}mraKZ%b42@oLVfmFvwHv7AO{Dsu+w4C6~t?q<QZ% zVs}sY+){Hmkn@WG28O+^&#&ZUaA_kHIr{)Lz_~9wPlHJNLA6w%Ri&Li%nb+iWHp1n7(UY*VYx;8AI!AH@bBlWAJHOM0*<DDh_ea7Y(^iNlM!=0Gy`OynLLb!V}&frv)v!seX61}xpgAd-B&jVAns;UK5 zHwIPHz>@)~K*chqwi?!`6`Qbdzx7?<^C&v3OAZUQusiqMnPOxry412qhDJ0h&OC9o zJFLdz3~TjZ&ftkjke1KgS8U4a8<$Lws2C3J3^1u11Fkbj0MOyQmx?8#y`80-wg#o*X63lJl)w_>^!x!S7 zaQF0{{bhyvSKs)o3Vil&^JKhQQ3?bG57a_@gjvMW{g~MTyo9Llj_(*^`ZgjK_OycW zRzfPL?W>?&Y$kJ}3sV$hKQ;%}c@-Tyf9US4lf?Wq`aO2slTwE^zV^q&XNNxkW0~ne z$NJwWq-_qcKR_a8k3}TiYqUU=IEz+{IJ+3TJCAIdc=dy^OC)riAb_@qvBUXo`gW64 z1S`$(8%cwoFJ|d#!E6Sma1}QWsvM;k?1T>>>gUk#>*#d5Q@Dxgt+kbELC(}B0t29b z^gQ!XWn!p%;w_mYvFh=`V9?{;r(gp;*8wDzjtgUNeeHDF4YlE4X2(y)`_(t@Yr=<8@(JJF4txeb~7&ZgRKyxxVbUXGV~{iy^VLvkGN< zGd(i9{e$f5AySYp3+S_z0rqJi1pkz*jA7q)h={g25F|ZtSb7gK)g0U(LSZ0wF zyrU;9k;RXE*)DY07~tRH(^=mC+!40Bdh_L_ zNM5n0?^hmI=5869HOEZrcSEe>2}vF|WqKsqK?b1B8_h0n>>t(_9S{~gq3?FjK)boy z_x8%d;AGd=SBvq2dz7)b+cip6}XMSLn2RCclT8jO?Y?#qMXY3_xu7yg$@D z$$D?H2wdMT{HmvOIAvbih7aM6Rr?K)>sZvFg0qUcS!CJrhMX`!!cR((h6d zh;&D`n{spNb684F9tovQ|G|;|*R%obtKwfHvCIzlLY>0@5 ze>k58IV=3))0e{XmX*r-8N~jh)477Rbv*W-m-?Ah+GF7b{(p7uKfRSXz36x6Du}kvsGEQ>W_xr1J(C;-pc?0CTq`<1N)xfaP zYs3sQuxd;|^Pz{FDbccz#P8NJ0I8MIMvdYBLFK9UncGy z=1URp)lP@2DsuxMltRtjL0Ll|=GffpDxceDRSX+5!FB1kJ@1guknD`P?3oz{gJ<<@ z{b65D&L*|fsB@-Po6k4kWMhrZjjpRn@h)sFtrUejbOIY1l!k2$VT3tn+(}9e2%9X_ z(_lCGS@iz>F8(L1r+^S2f33eU%+44&s)JWs=Xo!M<7O{d{d??Koo< zfy1;h=o>~i;w(wXf5IaH!)bcQ=pmo9JV3~&Id6;D%6foZmr6PpIo;IiLHz63rkz(B zq!y-Ej1k##IQkBrJ<7vP`)TH;-#>Q|+wLP=zgo?-u?Fl(8#=bhrirc)uXsiqtv1%x zQ#1oOL)8p_>&^2Vixg3(Mh}Nx*Y)}v5fczniWa{341zSJHT3)1f5*7r1d{D!KQz4z z(U;sNp|_`?!B-Z`^>#BmeGe|o+f*M_E237<~|u@ff>gC*0Ciek2+9)P_Fr?lZ9Wymg;LFExLDt zv^Deh30a}dd8 z%+scPZ)DM9d9A&=?(0ud%?=v0y@}dCP$ic-rr~etiX&;JSXPD`P{_gJc*hNS#$FoV z6Z>G=`6Q-R@u6fG%zn~0Qx$nWjbC{9!Vg(&fpU>Oof6o~!&o5^ez;h!O@)Wwq-&3| z**`|d*vl4Vm20g-1Q~wcsJF=3OygE&!)h>l8I?O77&__PjkEhl^QhslRM9t$v_^kx z%Hvw!xMA7K>G`Fqwh!u6Ci+9R?p|#ry6X9~prM{~QSu?1Lc%|+Oc~7-`&5FfC`PFqK;196UHHY}AIo(FnrB}rF1^_+ zc>TLLU}SAgSur(ky)Yj-=D(5Afv1Twv%3UVwSOQz+quUV#z6Eh576a&%VrOlE=Pz% zM%e?9HLtf-7vb^M3{3hgfetCvM|_=4s#1lJOwZx2hu{)_l?exmet;ZqVxblRmFBHc`pdP}HVhDW^ zO7nPkNn~=S(V0R~@hpkiE9RP^=Q$6J%ep@9c2KkOIv$gim~zdJp*X2)ky=DihLv=7 zX60b&Lqa!?mYnYTW8WPuQzgqo8#_5Mo0#k+6l(Rv(!vC4@vfYo4(l6YKcoVoBOp6x64yG&@WM+ zR-;@mcvqx#!N1<=+?dPMT7G>iu _~s%Ch0oBLdZ%Oz4Wi-K_=o3MmHwXcNgs+G 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�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 diff --git a/icons/mob/inhands/equipment/tanks_lefthand.dmi b/icons/mob/inhands/equipment/tanks_lefthand.dmi index a317e1080cd5a9eaf8278a4a0700264e6ce792c6..71a2dee4169bc08bfb936277a4752841124fa49c 100644 GIT binary patch delta 1817 zcmV+!2j=+h4gU@yiBL{Q4GJ0x0000DNk~Le0002s0002M2m=5B04iUf<&hyx3B<(2 z_E1Ffabb~nGk^Z5+noRa00DGTPE!Ct=GbNc005_YR9JLGWpiV4X>fFDZ*Bkpc$}5d zJr2S!3>Yhnlp_?X?ll1Kp4kjd`t>m!GBq2e3)CD^&TwF^Xi+)J{$U^ z1e0N$Byg9cyABX6WHS5NDo;4jpPeK}i#{IUJmpJ?PMKf46m?s@KKlebt&J-r)*_Ms z00sF;L_t(|ob83UU*UWH@D@_T@2Ndy|EsM5Qb716qhv`rI+YunpctkmP8v9?%6T?~@@&!pX|S*yooV{N&PyBM_kn_UmyO?`?* zB9EBIhY_3t0WqC%dZ=a}D z8mW+x`Jq9(QB$NvO04?{wc6U6kunO>$@aT*v=6fE$&ep1UL`>~@e|T^dut+_Yfqsb zw~e*!Q{Kg(!5^*Ns!7yi^Bg7p@eC5#oT;Wh#Ws=0R?cdm$X)rN!=ZYJ>JI%!>3^@_ zHP^E_W6jgY6x*jwnpvjSuvY5YhMFKsJ{3Fy(jKjFT* zP*Z5}R*~}a8Ed7k-NxJb>XX#2VSBcj&CxYUsu?uBt9tZrYPaxrd+E^MnfIeJzjOK< zmfsER@9z(XopRa#mma}*lTVr7Ir{s1@34E`dC!B-MYoFFhx>c>rySn5KlN+*efyIR z@7x~%0000000000007|AF@NV8qx~hz$f&3cHfSMF&9yr)HDu*sZ!pNq=BiU!Rn3*EJXKU_S4biM+1owu z4&1kotTg!JW^*sEKVI~uAFujSKS&|vaDUh{CHAKMcah>`bJfqX(tnrApZZciXrYTk z?n%a8$;sx_9&AogjkO0&Lee4oBo3*j^6TH}rkGNjJ;U#DE{=S*Hk;q&@k~!aua2YriB!k)i5#Lj zO{d*tP=MpyxH`8k%70#XIhE9MCzSTtSvBm7$j-~3=ju$&P`!#xH^{Ur5 zK9y#Jx;Bl_M%902ZDc{74H`4Z^E=z0swQ1UiC<9i}pDCI%R2}@O>Mq&<00000 z000000002+MeswbY4W?Nzt%=z< zxbAQn+ec>>P4AE&u!+X7g5i%-bW3*;Tv~o&Z2|xQ;4k1mN*Gl;*3g{000000NkvXX Hu0mjf$}6Fi delta 1671 zcmV;226*}Z4(<&hiBL{Q4GJ0x0000DNk~Le0002M0002M2m=5B0A&K4HIX4r3HDG# z@^N9r#Ke(zGkfFDZ*Bkpc$`yK zaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+ zzoIfdHBX6)GbOXA7^I7fGp#5wHx4|AJ15XA#J9BgdoY``gwYjD!um3;pXcmiKzB(2cO!uivAzv*Nq%JSYW zVB9`ZbANXS0000004_u~RN-ic`o~cmK7!PUuhb6pk0T-e5+Mo_sUV06ING89Q51`0 zc7MG<&;2YBais4^j&@g*hWLv+k<8~a>PHK5m1H)bCsK*8J*-KyjI3EQ{lzMoC&c<< zMXl0Eg%x!g*tC_JG|f_CeYvJqNreZp{|Be_g?}V@pig63TdN^EUH(muMJuejuM1^u zv6}k~K<e|+t^<{$PdXuM_&&5@2@_8~CAerYI{`TXQnzpSbO9um_nU8<3 zpnrNSJodk%e?yzD8TQ{#;QQt#v=?#coAZb^U8B8-r}PH^000000002S__%yO)c;)g zaru6zf6oWz`=S14?q{hb-*;vAT}?5;{e{Bf&(xk}SxV;nw(NdbQ@Q} zxa=M`c`?$J#%QIkZK)aishZu}YRY0TKv7P5e_^QYy}gm$(>1Ec&SU?({T=-?9Dkhs z%Np%PJn8*~!2SUM000000001*Pm%8j@G0{B06s^)e?46WpHGnQ=azgwT-$-T6M0pU z8GP)K?^jh$=KD77DG^m(<;41~pjK&Q{}q|<%k}E&&bWvz+5fkapNAFs){^g&+Ea5* z?$p;{T$DZoSd&CbdwP2JYUmPgtAC>4-=J{i``hse!Y{R=JBQ~qebS|ogoM6IyfBXQ%Plv<4 zo8mG-)XlU%usi5ov_m*)zCV64#81&-|9u~Q|6LY;kL34<_xOv{G{|G{G=J#-Jb_&M zz?M9T)&BpV;MN!4DT&qo`w6~M|FU7dU1I?N00000000000Nen34EZ$zN;TUaLS^?R z$NrCN={h(<=Y-z=6Z?F>O(eClQg=)IF70rH;{D-ZNm7aIo}xL`O{1~y3v>FpZd~uFoedFcq6+f=#GHu z(oA&(I6{t#jFH_FE)wlU+$}k~W55w|wa19+kF{|bHCC=1^$|Idp1#bReOAS@fe`-(KfIQz<+?l>vPxf(4{@r z^~)<;KyJ*}CJ^RBA{KWuj|21Cw#U=pdLhr<`gCMxn{wlk2{dgIk*thIXn37i&9NT# z&>T-E*IpZLe5&mO=zrQYA`zqCyO6Io#Y0~I*!_3aV-4!sH0CMfM{C?+;rHKF`)C6I z0000000000fX{$6+vbPfLGgI7zwMVU>5u)QE18A2@fXHtW1V#)!AvIu^Zj6dYnfo@ z^A-u-1Cs6jjO`brA59}>+=Nw_4~bZE^8Ka5-}RyOi`96D?ND(H(zWr3YDWKS^3f#& zRhO+Rg!h>sQ=TuJjkm@ua!%kpMffSbP?`~p{y9bO`IO@2$akzw007`i@E_L0PG^$6 R>CFHD002ovPDHLkV1f=rOBnzF diff --git a/icons/mob/inhands/equipment/tanks_righthand.dmi b/icons/mob/inhands/equipment/tanks_righthand.dmi index c7959994419f9f59fee7cf0cb463d10e17854ce8..c8626f1f8bb93d9df0ffc1d7822bd26ffb7ff07b 100644 GIT binary patch delta 1748 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 Date: Wed, 27 Sep 2017 21:30:48 -0400 Subject: [PATCH 057/136] GetAllContents performance increase (#31027) --- code/__HELPERS/unsorted.dm | 28 ++++++---------------------- code/game/turfs/turf.dm | 2 +- 2 files changed, 7 insertions(+), 23 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index a20cad1cf2..c2398982c2 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -502,28 +502,12 @@ Turf and target are separate in case you want to teleport some distance from a t var/y=arcsin(x/sqrt(1+x*x)) return y -/atom/proc/GetAllContents(list/ignore_typecache) - var/list/processing_list = list(src) - var/list/assembled = list() - if(ignore_typecache) //If there's a typecache, use it. - while(processing_list.len) - var/atom/A = processing_list[1] - processing_list -= A - if(ignore_typecache[A.type]) - continue - processing_list |= (A.contents - assembled) - assembled |= A - - else //If there's none, only make this check once for performance. - while(processing_list.len) - var/atom/A = processing_list[1] - processing_list -= A - - processing_list |= (A.contents - assembled) - - assembled |= A - - return assembled +/atom/proc/GetAllContents(list/output=list()) + . = output + output += src + for(var/i in 1 to contents.len) + var/atom/thing = contents[i] + thing.GetAllContents(output) //Step-towards method of determining whether one atom can see another. Similar to viewers() /proc/can_see(atom/source, atom/target, length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate. diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 0b8fbb3844..5bb90f618b 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -444,7 +444,7 @@ /turf/proc/empty(turf_type=/turf/open/space, baseturf_type, list/ignore_typecache, forceop = FALSE) // Remove all atoms except observers, landmarks, docking ports var/static/list/ignored_atoms = typecacheof(list(/mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object)) - var/list/allowed_contents = typecache_filter_list_reverse(GetAllContents(ignore_typecache), ignored_atoms) + var/list/allowed_contents = typecache_filter_list_reverse(GetAllContents(), ignored_atoms | ignore_typecache) allowed_contents -= src for(var/i in 1 to allowed_contents.len) var/thing = allowed_contents[i] From a3c7a3fe11f0c57ba8d82afc111efd4e3d015737 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Thu, 28 Sep 2017 12:07:23 -0400 Subject: [PATCH 059/136] Self replacement fix (#30834) --- code/game/objects/items/eightball.dm | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index d8be420a08..15c6bcd4b1 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -38,10 +38,14 @@ /obj/item/toy/eightball/Initialize(mapload) . = ..() - if(prob(1)) - new /obj/item/toy/eightball/haunted(get_turf(src)) + if(MakeHaunted()) return INITIALIZE_HINT_QDEL +/obj/item/toy/eightball/proc/MakeHaunted() + . = prob(1) + if(.) + new /obj/item/toy/eightball/haunted(loc) + /obj/item/toy/eightball/attack_self(mob/user) if(shaking) return @@ -105,6 +109,9 @@ GLOB.poi_list -= src . = ..() +/obj/item/toy/eightball/haunted/MakeHaunted() + return FALSE + /obj/item/toy/eightball/haunted/attack_ghost(mob/user) if(!shaking) to_chat(user, "[src] is not currently being shaken.") From 7dfa8d998c693bc4e9b46c15b71b80557a172633 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 28 Sep 2017 11:21:54 -0500 Subject: [PATCH 061/136] Automatic changelog generation for PR #2960 [ci skip] --- html/changelogs/AutoChangeLog-pr-2960.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2960.yml diff --git a/html/changelogs/AutoChangeLog-pr-2960.yml b/html/changelogs/AutoChangeLog-pr-2960.yml new file mode 100644 index 0000000000..905ec4764f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2960.yml @@ -0,0 +1,4 @@ +author: "Robustin" +delete-after: True +changes: + - tweak: "Revheads no longer spawn with chameleon glasses or a spraycan, instead they will start with a cybernetic security HUD implanted into their eyes." From 553daf4a0ca29adfcf31b4d60c8e82464a1cc378 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 28 Sep 2017 11:22:12 -0500 Subject: [PATCH 062/136] Automatic changelog generation for PR #2963 [ci skip] --- html/changelogs/AutoChangeLog-pr-2963.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2963.yml diff --git a/html/changelogs/AutoChangeLog-pr-2963.yml b/html/changelogs/AutoChangeLog-pr-2963.yml new file mode 100644 index 0000000000..056e7a17fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2963.yml @@ -0,0 +1,4 @@ +author: "ShizCalev" +delete-after: True +changes: + - tweak: "The mining vendor will now provide more verbose feedback about your interactions." From d0d785fa79610f5512ef7f108cc95176edfe03d0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 28 Sep 2017 11:29:13 -0500 Subject: [PATCH 063/136] Automatic changelog generation for PR #2968 [ci skip] --- html/changelogs/AutoChangeLog-pr-2968.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2968.yml diff --git a/html/changelogs/AutoChangeLog-pr-2968.yml b/html/changelogs/AutoChangeLog-pr-2968.yml new file mode 100644 index 0000000000..8ece28e6e9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2968.yml @@ -0,0 +1,5 @@ +author: "Augustfox" +delete-after: True +changes: + - tweak: "Reordered hair in a semi-alphabetized list for easier use in character creation." + - tweak: "Alphabetized facial hair for easier use in character creation." From 9b5a2f7490e6871c03e9d2b396d9f6e0215d18f0 Mon Sep 17 00:00:00 2001 From: XDTM Date: Thu, 28 Sep 2017 23:01:41 +0200 Subject: [PATCH 064/136] Adds action buttons for spiders, refactors action code, nurse spiders can set a hereditary directive for their children to follow --- code/datums/action.dm | 30 +- code/game/objects/effects/spiders.dm | 4 + .../browserassets/css/browserOutput.css | 2 + .../carbon/alien/humanoid/alien_powers.dm | 39 ++- code/modules/mob/living/carbon/carbon.dm | 17 - .../mob/living/carbon/carbon_defines.dm | 1 - code/modules/mob/living/carbon/life.dm | 5 +- code/modules/mob/living/living.dm | 16 + code/modules/mob/living/living_defines.dm | 2 + .../simple_animal/hostile/giant_spider.dm | 294 +++++++++++++----- code/modules/spells/spell.dm | 30 +- icons/effects/wrap_target.dmi | Bin 0 -> 599 bytes icons/mob/actions/actions_animal.dmi | Bin 0 -> 3715 bytes 13 files changed, 302 insertions(+), 138 deletions(-) create mode 100644 icons/effects/wrap_target.dmi create mode 100644 icons/mob/actions/actions_animal.dmi diff --git a/code/datums/action.dm b/code/datums/action.dm index ca71a7cbec..a65294fa40 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -485,7 +485,7 @@ /datum/action/spell_action/New(Target) ..() - var/obj/effect/proc_holder/spell/S = target + var/obj/effect/proc_holder/S = target S.action = src name = S.name desc = S.desc @@ -495,36 +495,40 @@ button.name = name /datum/action/spell_action/Destroy() - var/obj/effect/proc_holder/spell/S = target + var/obj/effect/proc_holder/S = target S.action = null return ..() /datum/action/spell_action/Trigger() if(!..()) - return 0 + return FALSE if(target) - var/obj/effect/proc_holder/spell = target - spell.Click() - return 1 + var/obj/effect/proc_holder/S = target + S.Click() + return TRUE /datum/action/spell_action/IsAvailable() if(!target) - return 0 - var/obj/effect/proc_holder/spell/spell = target - if(owner) - return spell.can_cast(owner) - return 0 + return FALSE + return TRUE +/datum/action/spell_action/spell/IsAvailable() + if(!target) + return FALSE + var/obj/effect/proc_holder/spell/S = target + if(owner) + return S.can_cast(owner) + return FALSE /datum/action/spell_action/alien /datum/action/spell_action/alien/IsAvailable() if(!target) - return 0 + return FALSE var/obj/effect/proc_holder/alien/ab = target if(owner) return ab.cost_check(ab.check_turf,owner,1) - return 0 + return FALSE diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 7a0faed690..6722ffd89b 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -52,6 +52,7 @@ icon_state = "eggs" var/amount_grown = 0 var/player_spiders = 0 + var/directive = "" //Message from the mother var/poison_type = "toxin" var/poison_per_bite = 5 var/list/faction = list("spiders") @@ -71,6 +72,7 @@ S.poison_type = poison_type S.poison_per_bite = poison_per_bite S.faction = faction.Copy() + S.directive = directive if(player_spiders) S.player_spiders = 1 qdel(src) @@ -87,6 +89,7 @@ var/obj/machinery/atmospherics/components/unary/vent_pump/entry_vent var/travelling_in_vent = 0 var/player_spiders = 0 + var/directive = "" //Message from the mother var/poison_type = "toxin" var/poison_per_bite = 5 var/list/faction = list("spiders") @@ -192,6 +195,7 @@ S.poison_per_bite = poison_per_bite S.poison_type = poison_type S.faction = faction.Copy() + S.directive = directive if(player_spiders) S.playable_spider = TRUE notify_ghosts("Spider [S.name] can be controlled", null, enter_link="(Click to play)", source=S, action=NOTIFY_ATTACK) diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index fa2c5d056c..f6810d0b05 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -353,6 +353,8 @@ h1.alert, h2.alert {color: #000000;} .borer {color: #543354; font-style: italic;} .changeling {color: #800080; font-style: italic;} +.spider {color: #4d004d;} + .interface {color: #330033;} .sans {font-family: "Comic Sans MS", cursive, sans-serif;} diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index e6a5f58d69..1390028282 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -10,15 +10,15 @@ Doesn't work on other aliens/AI.*/ name = "Alien Power" panel = "Alien" var/plasma_cost = 0 - var/check_turf = 0 - var/has_action = 1 - var/datum/action/spell_action/alien/action = null - var/action_icon = 'icons/mob/actions/actions_xeno.dmi' - var/action_icon_state = "spell_default" - var/action_background_icon_state = "bg_alien" + var/check_turf = FALSE + has_action = TRUE + datum/action/spell_action/alien/action + action_icon = 'icons/mob/actions/actions_xeno.dmi' + action_icon_state = "spell_default" + action_background_icon_state = "bg_alien" -/obj/effect/proc_holder/alien/New() - ..() +/obj/effect/proc_holder/alien/Initialize() + . = ..() action = new(src) /obj/effect/proc_holder/alien/Click() @@ -30,15 +30,20 @@ Doesn't work on other aliens/AI.*/ user.adjustPlasma(-plasma_cost) return 1 -/obj/effect/proc_holder/alien/proc/on_gain(mob/living/carbon/user) +/obj/effect/proc_holder/alien/on_gain(mob/living/carbon/user) return -/obj/effect/proc_holder/alien/proc/on_lose(mob/living/carbon/user) +/obj/effect/proc_holder/alien/on_lose(mob/living/carbon/user) return -/obj/effect/proc_holder/alien/proc/fire(mob/living/carbon/user) +/obj/effect/proc_holder/alien/fire(mob/living/carbon/user) return 1 +/obj/effect/proc_holder/alien/get_panel_text() + . = ..() + if(plasma_cost > 0) + return "[plasma_cost]" + /obj/effect/proc_holder/alien/proc/cost_check(check_turf=0,mob/living/carbon/user,silent = 0) if(user.stat) if(!silent) @@ -168,7 +173,6 @@ Doesn't work on other aliens/AI.*/ if(user.getPlasma() > A.plasma_cost && A.corrode(O)) user.adjustPlasma(-A.plasma_cost) - /obj/effect/proc_holder/alien/neurotoxin name = "Spit Neurotoxin" desc = "Spits neurotoxin at someone, paralyzing them for a short time." @@ -179,7 +183,7 @@ Doesn't work on other aliens/AI.*/ var/message if(active) message = "You empty your neurotoxin gland." - remove_ranged_ability(user,message) + remove_ranged_ability(message) else message = "You prepare your neurotoxin gland. Left-click to fire at a target!" add_ranged_ability(user, message, TRUE) @@ -193,7 +197,7 @@ Doesn't work on other aliens/AI.*/ return var/p_cost = 50 if(!iscarbon(ranged_ability_user) || ranged_ability_user.lying || ranged_ability_user.stat) - remove_ranged_ability(ranged_ability_user) + remove_ranged_ability() return var/mob/living/carbon/user = ranged_ability_user @@ -219,8 +223,7 @@ Doesn't work on other aliens/AI.*/ return TRUE /obj/effect/proc_holder/alien/neurotoxin/on_lose(mob/living/carbon/user) - if(user.ranged_ability == src) - user.ranged_ability = null + remove_ranged_ability() /obj/effect/proc_holder/alien/neurotoxin/add_ranged_ability(mob/living/user, msg) ..() @@ -328,7 +331,3 @@ Doesn't work on other aliens/AI.*/ return 1 return 0 - - -/proc/cmp_abilities_cost(obj/effect/proc_holder/alien/a, obj/effect/proc_holder/alien/b) - return b.plasma_cost - a.plasma_cost diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index aa72ebfa9f..80c6d836a0 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -425,23 +425,6 @@ var/turf/target = get_turf(loc) I.throw_at(target,I.throw_range,I.throw_speed,src) -/mob/living/carbon/proc/AddAbility(obj/effect/proc_holder/alien/A) - abilities.Add(A) - A.on_gain(src) - if(A.has_action) - A.action.Grant(src) - sortInsert(abilities, /proc/cmp_abilities_cost, 0) - -/mob/living/carbon/proc/RemoveAbility(obj/effect/proc_holder/alien/A) - abilities.Remove(A) - A.on_lose(src) - if(A.action) - A.action.Remove(src) - -/mob/living/carbon/proc/add_abilities_to_panel() - for(var/obj/effect/proc_holder/alien/A in abilities) - statpanel("[A.panel]",A.plasma_cost > 0?"([A.plasma_cost])":"",A) - /mob/living/carbon/Stat() ..() if(statpanel("Status")) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 8e9f66de31..45c10c6ae9 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -35,7 +35,6 @@ has_limbs = 1 var/obj/item/reagent_containers/food/snacks/meat/slab/type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab - var/list/obj/effect/proc_holder/alien/abilities = list() var/gib_type = /obj/effect/decal/cleanable/blood/gibs var/rotate_on_lying = 1 diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index b2e88e278a..47458b01d2 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -412,8 +412,9 @@ liver_failure() else liver.failing = FALSE - - if(((!(NOLIVER in dna.species.species_traits)) && (!liver))) + else + if((dna && dna.species && (NOLIVER in dna.species.species_traits))) + return liver_failure() /mob/living/carbon/proc/undergoing_liver_failure() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 649e19ba29..1cf99e8d9e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -982,3 +982,19 @@ client.move_delay = world.time + movement_delay() lying_prev = lying return canmove + +/mob/living/proc/AddAbility(obj/effect/proc_holder/A) + abilities.Add(A) + A.on_gain(src) + if(A.has_action) + A.action.Grant(src) + +/mob/living/proc/RemoveAbility(obj/effect/proc_holder/A) + abilities.Remove(A) + A.on_lose(src) + if(A.action) + A.action.Remove(src) + +/mob/living/proc/add_abilities_to_panel() + for(var/obj/effect/proc_holder/A in abilities) + statpanel("[A.panel]",A.get_panel_text(),A) \ No newline at end of file diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index f32ca97b09..36b8c62cca 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -77,3 +77,5 @@ var/datum/language/selected_default_language var/last_words //used for database logging + + var/list/obj/effect/proc_holder/abilities = list() diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 6ae5fe0622..f6a7c7c54a 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -48,7 +48,21 @@ see_in_dark = 4 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE var/playable_spider = FALSE +<<<<<<< HEAD devourable = TRUE +======= + var/datum/action/innate/spider/lay_web/lay_web + var/directive = "" //Message passed down to children, to relay the creator's orders + +/mob/living/simple_animal/hostile/poison/giant_spider/Initialize() + . = ..() + lay_web = new + lay_web.Grant(src) + +/mob/living/simple_animal/hostile/poison/giant_spider/Destroy() + QDEL_NULL(lay_web) + return ..() +>>>>>>> 152c890... Adds action buttons for spiders, refactors action code, nurse spiders can set a hereditary directive for their children to follow (#30572) /mob/living/simple_animal/hostile/poison/giant_spider/Topic(href, href_list) if(href_list["activate"]) @@ -56,6 +70,12 @@ if(istype(ghost) && playable_spider) humanize_spider(ghost) +/mob/living/simple_animal/hostile/poison/giant_spider/Login() + ..() + if(directive) + to_chat(src, "Your mother left you a directive! Follow it at all costs.") + to_chat(src, "[directive]") + /mob/living/simple_animal/hostile/poison/giant_spider/attack_ghost(mob/user) if(!humanize_spider(user)) return ..() @@ -87,8 +107,26 @@ poison_per_bite = 3 var/atom/movable/cocoon_target var/fed = 0 + var/obj/effect/proc_holder/wrap/wrap + var/datum/action/innate/spider/lay_eggs/lay_eggs + var/datum/action/innate/spider/set_directive/set_directive var/static/list/consumed_mobs = list() //the tags of mobs that have been consumed by nurse spiders to lay eggs +/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Initialize() + . = ..() + wrap = new + AddAbility(wrap) + lay_eggs = new + lay_eggs.Grant(src) + set_directive = new + set_directive.Grant(src) + +/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Destroy() + RemoveAbility(wrap) + QDEL_NULL(lay_eggs) + QDEL_NULL(set_directive) + return ..() + //hunters have the most poison and move the fastest, so they can find prey /mob/living/simple_animal/hostile/poison/giant_spider/hunter desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes." @@ -162,6 +200,9 @@ letmetalkpls = new letmetalkpls.Grant(src) +/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Destroy() + QDEL_NULL(letmetalkpls) + return ..() /mob/living/simple_animal/hostile/poison/giant_spider/ice //spiders dont usually like tempatures of 140 kelvin who knew name = "giant ice spider" @@ -225,11 +266,11 @@ //second, spin a sticky spiderweb on this tile var/obj/structure/spider/stickyweb/W = locate() in get_turf(src) if(!W) - Web() + lay_web.Activate() else //third, lay an egg cluster there if(fed) - LayEggs() + lay_eggs.Activate() else //fourthly, cocoon any nearby items so those pesky pinkskins can't use them for(var/obj/O in can_see) @@ -247,62 +288,28 @@ else if(busy == MOVING_TO_TARGET && cocoon_target) if(get_dist(src, cocoon_target) <= 1) - Wrap() + cocoon() else busy = SPIDER_IDLE stop_automated_movement = FALSE -/mob/living/simple_animal/hostile/poison/giant_spider/verb/Web() - set name = "Lay Web" - set category = "Spider" - set desc = "Spread a sticky web to slow down prey." - - var/T = src.loc - - if(stat == DEAD) - return - if(busy != SPINNING_WEB) - busy = SPINNING_WEB - src.visible_message("\the [src] begins to secrete a sticky substance.") - stop_automated_movement = 1 - if(do_after(src, 40, target = T)) - if(busy == SPINNING_WEB && src.loc == T) - new /obj/structure/spider/stickyweb(T) - busy = SPIDER_IDLE - stop_automated_movement = FALSE - - -/mob/living/simple_animal/hostile/poison/giant_spider/nurse/verb/Wrap() - set name = "Wrap" - set category = "Spider" - set desc = "Wrap up prey to feast upon and objects for safe keeping." - - if(stat == DEAD) - return - if(!cocoon_target) - var/list/choices = list() - for(var/mob/living/L in view(1,src)) - if(L == src || L.anchored) - continue - if(istype(L, /mob/living/simple_animal/hostile/poison/giant_spider)) - continue - if(Adjacent(L)) - choices += L - for(var/obj/O in src.loc) - if(O.anchored) - continue - if(Adjacent(O)) - choices += O - var/temp_input = input(src,"What do you wish to cocoon?") in null|choices - if(temp_input && !cocoon_target) - cocoon_target = temp_input - - if(stat != DEAD && cocoon_target && Adjacent(cocoon_target) && !cocoon_target.anchored) +/mob/living/simple_animal/hostile/poison/giant_spider/nurse/proc/cocoon() + if(stat != DEAD && cocoon_target && !cocoon_target.anchored) + if(cocoon_target == src) + to_chat(src, "You can't wrap yourself!") + return + if(istype(cocoon_target, /mob/living/simple_animal/hostile/poison/giant_spider)) + to_chat(src, "You can't wrap other spiders!") + return + if(!Adjacent(cocoon_target)) + to_chat(src, "You can't reach [cocoon_target]!") + return if(busy == SPINNING_COCOON) + to_chat(src, "You're already spinning a cocoon!") return //we're already doing this, don't cancel out or anything busy = SPINNING_COCOON - visible_message("\the [src] begins to secrete a sticky substance around \the [cocoon_target].") + visible_message("[src] begins to secrete a sticky substance around [cocoon_target].","You begin wrapping [cocoon_target] into a cocoon.") stop_automated_movement = TRUE walk(src,0) if(do_after(src, 50, target = cocoon_target)) @@ -313,7 +320,8 @@ if(L.blood_volume && (L.stat != DEAD || !consumed_mobs[L.tag])) //if they're not dead, you can consume them anyway consumed_mobs[L.tag] = TRUE fed++ - visible_message("\the [src] sticks a proboscis into \the [L] and sucks a viscous substance out.") + lay_eggs.UpdateButtonIcon(TRUE) + visible_message("[src] sticks a proboscis into [L] and sucks a viscous substance out.","You suck the nutriment out of [L], feeding you enough to lay a cluster of eggs.") L.death() //you just ate them, they're dead. else to_chat(src, "[L] cannot sate your hunger!") @@ -325,35 +333,155 @@ busy = SPIDER_IDLE stop_automated_movement = FALSE -/mob/living/simple_animal/hostile/poison/giant_spider/nurse/verb/LayEggs() - set name = "Lay Eggs" - set category = "Spider" - set desc = "Lay a clutch of eggs, but you must wrap a creature for feeding first." +/datum/action/innate/spider + icon_icon = 'icons/mob/actions/actions_animal.dmi' + background_icon_state = "bg_alien" - var/obj/structure/spider/eggcluster/E = locate() in get_turf(src) - if(stat == DEAD) +/datum/action/innate/spider/lay_web + name = "Spin Web" + desc = "Spin a web to slow down potential prey." + check_flags = AB_CHECK_CONSCIOUS + button_icon_state = "lay_web" + +/datum/action/innate/spider/lay_web/Activate() + if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) return + var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner + + if(!isturf(S.loc)) + return + var/turf/T = get_turf(S) + + var/obj/structure/spider/stickyweb/W = locate() in T + if(W) + to_chat(S, "There's already a web here!") + return + + if(S.busy != SPINNING_WEB) + S.busy = SPINNING_WEB + S.visible_message("[S] begins to secrete a sticky substance.","You begin to lay a web.") + S.stop_automated_movement = TRUE + if(do_after(S, 40, target = T)) + if(S.busy == SPINNING_WEB && S.loc == T) + new /obj/structure/spider/stickyweb(T) + S.busy = SPIDER_IDLE + S.stop_automated_movement = FALSE + else + to_chat(S, "You're already spinning a web!") + +/obj/effect/proc_holder/wrap + name = "Wrap" + panel = "Spider" + active = FALSE + datum/action/spell_action/action = null + desc = "Wrap something or someone in a cocoon. If it's a living being, you'll also consume them, allowing you to lay eggs." + ranged_mousepointer = 'icons/effects/wrap_target.dmi' + action_icon = 'icons/mob/actions/actions_animal.dmi' + action_icon_state = "wrap_0" + action_background_icon_state = "bg_alien" + +/obj/effect/proc_holder/wrap/Initialize() + . = ..() + action = new(src) + +/obj/effect/proc_holder/wrap/update_icon() + action.button_icon_state = "wrap_[active]" + action.UpdateButtonIcon() + +/obj/effect/proc_holder/wrap/Click() + if(!istype(usr, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) + return TRUE + var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/user = usr + activate(user) + return TRUE + +/obj/effect/proc_holder/wrap/proc/activate(mob/living/user) + var/message + if(active) + message = "You no longer prepare to wrap something in a cocoon." + remove_ranged_ability(message) + else + message = "You prepare to wrap something in a cocoon. Left-click your target to start wrapping!" + add_ranged_ability(user, message, TRUE) + return 1 + +/obj/effect/proc_holder/wrap/InterceptClickOn(mob/living/caller, params, atom/target) + if(..()) + return + if(ranged_ability_user.incapacitated() || !istype(ranged_ability_user, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) + remove_ranged_ability() + return + + var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/user = ranged_ability_user + + if(user.Adjacent(target) && (ismob(target) || isobj(target))) + var/atom/movable/target_atom = target + if(target_atom.anchored) + return + user.cocoon_target = target_atom + INVOKE_ASYNC(user, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/.proc/cocoon) + remove_ranged_ability() + return TRUE + +/obj/effect/proc_holder/wrap/on_lose(mob/living/carbon/user) + remove_ranged_ability() + +/datum/action/innate/spider/lay_eggs + name = "Lay Eggs" + desc = "Lay a cluster of eggs, which will soon grow into more spiders. You must wrap a living being to do this." + check_flags = AB_CHECK_CONSCIOUS + button_icon_state = "lay_eggs" + +/datum/action/innate/spider/lay_eggs/IsAvailable() + if(..()) + if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) + return 0 + var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner + if(S.fed) + return 1 + return 0 + +/datum/action/innate/spider/lay_eggs/Activate() + if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) + return + var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner + + var/obj/structure/spider/eggcluster/E = locate() in get_turf(S) if(E) - to_chat(src, "There is already a cluster of eggs here!") - else if(!fed) - to_chat(src, "You are too hungry to do this!") - else if(busy != LAYING_EGGS) - busy = LAYING_EGGS - src.visible_message("\the [src] begins to lay a cluster of eggs.") - stop_automated_movement = 1 - if(do_after(src, 50, target = src.loc)) - if(busy == LAYING_EGGS) - E = locate() in get_turf(src) - if(!E) - var/obj/structure/spider/eggcluster/C = new /obj/structure/spider/eggcluster(src.loc) - if(ckey) - C.player_spiders = 1 - C.poison_type = poison_type - C.poison_per_bite = poison_per_bite - C.faction = faction.Copy() - fed-- - busy = SPIDER_IDLE - stop_automated_movement = FALSE + to_chat(S, "There is already a cluster of eggs here!") + else if(!S.fed) + to_chat(S, "You are too hungry to do this!") + else if(S.busy != LAYING_EGGS) + S.busy = LAYING_EGGS + S.visible_message("[S] begins to lay a cluster of eggs.","You begin to lay a cluster of eggs.") + S.stop_automated_movement = TRUE + if(do_after(S, 50, target = get_turf(S))) + if(S.busy == LAYING_EGGS) + E = locate() in get_turf(S) + if(!E || !isturf(S.loc)) + var/obj/structure/spider/eggcluster/C = new /obj/structure/spider/eggcluster(get_turf(S)) + if(S.ckey) + C.player_spiders = TRUE + C.directive = S.directive + C.poison_type = S.poison_type + C.poison_per_bite = S.poison_per_bite + C.faction = S.faction.Copy() + S.fed-- + UpdateButtonIcon(TRUE) + S.busy = SPIDER_IDLE + S.stop_automated_movement = FALSE + +/datum/action/innate/spider/set_directive + name = "Set Directive" + desc = "Set a directive for your children to follow." + check_flags = AB_CHECK_CONSCIOUS + button_icon_state = "directive" + +/datum/action/innate/spider/set_directive/Activate() + if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse)) + return + var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner + S.directive = stripped_input(S, "Enter the new directive", "Create directive", "[S.directive]", MAX_MESSAGE_LEN) /mob/living/simple_animal/hostile/poison/giant_spider/Login() . = ..() @@ -365,7 +493,8 @@ /datum/action/innate/spider/comm name = "Command" - button_icon_state = "cult_comms" + desc = "Send a command to all living spiders." + button_icon_state = "command" /datum/action/innate/spider/comm/IsAvailable() if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife)) @@ -373,19 +502,22 @@ return TRUE /datum/action/innate/spider/comm/Trigger() - var/input = stripped_input(usr, "Input a message for your legions to follow.", "Command", "") + var/input = stripped_input(owner, "Input a command for your legions to follow.", "Command", "") if(QDELETED(src) || !input || !IsAvailable()) return FALSE - spider_command(usr, input) + spider_command(owner, input) return TRUE /datum/action/innate/spider/comm/proc/spider_command(mob/living/user, message) if(!message) return var/my_message - my_message = "COMMAND FROM SPIDER QUEEN: [message]" + my_message = "Command from [user]: [message]" for(var/mob/living/simple_animal/hostile/poison/giant_spider/M in GLOB.spidermobs) to_chat(M, my_message) + for(var/M in GLOB.dead_mob_list) + var/link = FOLLOW_LINK(M, user) + to_chat(M, "[link] [my_message]") log_talk(user, "SPIDERCOMMAND: [key_name(user)] : [message]",LOGSAY) /mob/living/simple_animal/hostile/poison/giant_spider/handle_temperature_damage() diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 3cb56becf8..d3008625cf 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -8,6 +8,28 @@ var/ranged_mousepointer var/mob/living/ranged_ability_user var/ranged_clickcd_override = -1 + var/has_action = TRUE + var/datum/action/spell_action/action = null + var/action_icon = 'icons/mob/actions/actions_spells.dmi' + var/action_icon_state = "spell_default" + var/action_background_icon_state = "bg_spell" + +/obj/effect/proc_holder/Initialize() + . = ..() + if(has_action) + action = new(src) + +/obj/effect/proc_holder/proc/on_gain(mob/living/user) + return + +/obj/effect/proc_holder/proc/on_lose(mob/living/user) + return + +/obj/effect/proc_holder/proc/fire(mob/living/user) + return TRUE + +/obj/effect/proc_holder/proc/get_panel_text() + return "" GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for the badmin verb for now @@ -118,10 +140,10 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th var/critfailchance = 0 var/centcom_cancast = 1 //Whether or not the spell should be allowed on z2 - var/action_icon = 'icons/mob/actions/actions_spells.dmi' - var/action_icon_state = "spell_default" - var/action_background_icon_state = "bg_spell" - var/datum/action/spell_action/action + action_icon = 'icons/mob/actions/actions_spells.dmi' + action_icon_state = "spell_default" + action_background_icon_state = "bg_spell" + datum/action/spell_action/spell/action /obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell diff --git a/icons/effects/wrap_target.dmi b/icons/effects/wrap_target.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2e9a338c9ec23cc661af9298a9cd025367471991 GIT binary patch literal 599 zcmV-d0;v6oP)qPPdPJ>v%MQdqIDP^eXMp2j@0Q#v@dgmK0KEEXfzpqO9#r@j;F9vA)zZjtI|6+o+|4Zom lznGxz{}K=Me~Bmi|2MAsB*>D-4DSE{002ovPDHLkV1fu=DlY&4 literal 0 HcmV?d00001 diff --git a/icons/mob/actions/actions_animal.dmi b/icons/mob/actions/actions_animal.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1dcf7590cd0fabdb06af0c2c6c488bce9fc6f0cb GIT binary patch literal 3715 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 QQzc-icU!ko+a>P*0J=i=h5!Hn literal 0 HcmV?d00001 From 3fe37eb41b6e8c83716007617aedf058d6a5f0a4 Mon Sep 17 00:00:00 2001 From: Robustin Date: Thu, 28 Sep 2017 22:40:13 -0400 Subject: [PATCH 065/136] Secure containers give more hints, no RNG, for hacking (#30864) * Automatic changelog generation for PR #30056 [ci skip] * Delete AutoChangeLog-pr-30056.yml * Removes bad RNG * More instructions * gud grammer * Right parenthesis * Update secure.dm * Update secure.dm * Update secure.dm * less explicit --- code/game/objects/items/storage/secure.dm | 28 +++++++++++------------ 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 6620ec5265..ef65f2dac3 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -28,31 +28,29 @@ /obj/item/storage/secure/examine(mob/user) ..() - to_chat(user, text("The service panel is [src.open ? "open" : "closed"].")) + to_chat(user, text("The service panel is currently [open ? "unscrewed" : "screwed shut"].")) /obj/item/storage/secure/attackby(obj/item/W, mob/user, params) if(locked) if (istype(W, /obj/item/screwdriver)) - if (do_after(user, 20*W.toolspeed, target = src)) - src.open =! src.open - user.show_message("You [open ? "open" : "close"] the service panel.", 1) + if (do_after(user, 20*W.toolspeed, target = user)) + open =! open + to_chat(user, "You [open ? "open" : "close"] the service panel.") return - if ((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking)) - user.show_message("Now attempting to reset internal memory, please hold.", 1) - src.l_hacking = 1 - if (do_after(usr, 100*W.toolspeed, target = src)) - if (prob(33)) - src.l_setshort = 1 + if (istype(W, /obj/item/wirecutters) || istype(W, /obj/item/card/emag)) + to_chat(user, "[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be pulsed.") + if ((istype(W, /obj/item/device/multitool)) && (!l_hacking)) + if(src.open == 1) + to_chat(user, "Now attempting to reset internal memory, please hold.") + src.l_hacking = 1 + if (do_after(usr, 400*W.toolspeed, target = user)) + to_chat(user, "Internal memory reset - lock has been disengaged.") src.l_set = 0 - user.show_message("Internal memory reset. Please give it a few seconds to reinitialize.", 1) - sleep(80) - src.l_setshort = 0 src.l_hacking = 0 else - user.show_message("Unable to reset internal memory.", 1) src.l_hacking = 0 else - src.l_hacking = 0 + to_chat(user, "You must unscrew the service panel before you can pulse the wiring.") return //At this point you have exhausted all the special things to do when locked // ... but it's still locked. From 367fcc9974595427fe4a51fb0bc9d3dc704d1225 Mon Sep 17 00:00:00 2001 From: oranges Date: Fri, 29 Sep 2017 15:41:34 +1300 Subject: [PATCH 067/136] Merge pull request #30985 from tgstation/Cyberboss-patch-5 Fixes frozen PDAs in the game logs --- code/game/objects/items/devices/PDA/PDA.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index eb521d8510..59299fb9d6 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -538,7 +538,7 @@ GLOBAL_LIST_EMPTY(PDAs) P.show_recieved_message(msg,src) if(!multiple) show_to_ghosts(user,msg) - log_talk(user,"[key_name(user)] (PDA: [name]) sent \"[message]\" to [key_name(P,null,TRUE)]",LOGPDA) + log_talk(user,"[key_name(user)] (PDA: [initial(name)]) sent \"[message]\" to [key_name(P,null,TRUE)]",LOGPDA) else if(!multiple) to_chat(user, "ERROR: Server isn't responding.") @@ -548,7 +548,7 @@ GLOBAL_LIST_EMPTY(PDAs) if(multiple) show_to_sender(last_sucessful_msg,1) show_to_ghosts(user,last_sucessful_msg,1) - log_talk(user,"[user] (PDA: [name]) sent \"[message]\" to Everyone",LOGPDA) + log_talk(user,"[user] (PDA: [initial(name)]) sent \"[message]\" to Everyone",LOGPDA) /obj/item/device/pda/proc/show_to_sender(datum/data_pda_msg/msg,multiple = 0) tnote += "→ To [multiple ? "Everyone" : msg.recipient]:
[msg.message][msg.get_photo_ref()]
" From c6c6f67d03cbc8bb57d1fa1b850f9fe69b4762e4 Mon Sep 17 00:00:00 2001 From: Tungsten Date: Thu, 28 Sep 2017 22:43:22 -0400 Subject: [PATCH 069/136] Applying PDA overhaul Upstream (#30613) * Applying PDA overhaul Upstream Yeet? * Used lordpidey's change Like this? * The build failed so I'm changing it back * Update PDA.dm * Update PDA.dm * Make the settings visible only on the main screen mode 0 is the hub, and the hub is the main menu. I think it'd be a lot more convenient for players to always have these options on the main menu if they need them. Makes it really easy to swap colors and fonts at the beginning of the round. I can put it in a settings menu if everyone really thinks it's necessary, but then someone would have to help me actually make the damn icons show up. * Update PDA.dm * Update PDA.dm * Wait, I'm an idiot. I was editing the wrong thing. * Here's your switch statements boi * Declare font_index at the "Toggle_Font" code I declared it exactly where it's relevant, but I think this looks unclean. I also redefined it which I actually needed to do. * Replaced it where it was cuz the build broke * Make the color changer a picker instead of a field An attempt * Made these defines @optimumtact @Cyberboss Like this? --- code/game/objects/items/devices/PDA/PDA.dm | 35 ++++++++++++++++++++- icons/pda_icons/pda_atmos.png | Bin 224 -> 2851 bytes icons/pda_icons/pda_back.png | Bin 219 -> 2846 bytes icons/pda_icons/pda_bell.png | Bin 226 -> 2857 bytes icons/pda_icons/pda_blank.png | Bin 189 -> 106 bytes icons/pda_icons/pda_boom.png | Bin 241 -> 2895 bytes icons/pda_icons/pda_bucket.png | Bin 220 -> 2844 bytes icons/pda_icons/pda_chatroom.png | Bin 223 -> 2855 bytes icons/pda_icons/pda_cleanbot.png | Bin 183 -> 2880 bytes icons/pda_icons/pda_color.png | Bin 0 -> 198 bytes icons/pda_icons/pda_crate.png | Bin 234 -> 2859 bytes icons/pda_icons/pda_cuffs.png | Bin 225 -> 2852 bytes icons/pda_icons/pda_dronephone.png | Bin 244 -> 2864 bytes icons/pda_icons/pda_eject.png | Bin 226 -> 133 bytes icons/pda_icons/pda_exit.png | Bin 241 -> 2861 bytes icons/pda_icons/pda_flashlight.png | Bin 221 -> 2850 bytes icons/pda_icons/pda_floorbot.png | Bin 214 -> 2887 bytes icons/pda_icons/pda_font.png | Bin 0 -> 232 bytes icons/pda_icons/pda_honk.png | Bin 219 -> 2845 bytes icons/pda_icons/pda_locked.PNG | Bin 215 -> 2850 bytes icons/pda_icons/pda_mail.png | Bin 216 -> 2851 bytes icons/pda_icons/pda_medbot.png | Bin 219 -> 2899 bytes icons/pda_icons/pda_medical.png | Bin 203 -> 2823 bytes icons/pda_icons/pda_menu.png | Bin 229 -> 2852 bytes icons/pda_icons/pda_mule.png | Bin 230 -> 2856 bytes icons/pda_icons/pda_notes.png | Bin 218 -> 2845 bytes icons/pda_icons/pda_power.png | Bin 215 -> 2840 bytes icons/pda_icons/pda_rdoor.png | Bin 212 -> 2839 bytes icons/pda_icons/pda_reagent.png | Bin 219 -> 2855 bytes icons/pda_icons/pda_refresh.png | Bin 234 -> 2857 bytes icons/pda_icons/pda_scanner.png | Bin 241 -> 2864 bytes icons/pda_icons/pda_signaler.png | Bin 238 -> 2865 bytes icons/pda_icons/pda_status.png | Bin 230 -> 2866 bytes 33 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 icons/pda_icons/pda_color.png create mode 100644 icons/pda_icons/pda_font.png diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index eb521d8510..eb5d8d4a5d 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -26,6 +26,14 @@ GLOBAL_LIST_EMPTY(PDAs) var/obj/item/cartridge/cartridge = null //current cartridge var/mode = 0 //Controls what menu the PDA will display. 0 is hub; the rest are either built in or based on cartridge. var/icon_alert = "pda-r" //Icon to be overlayed for message alerts. Taken from the pda icon file. + var/font_index = 0 //This int tells DM which font is currently selected and lets DM know when the last font has been selected so that it can cycle back to the first font when "toggle font" is pressed again. + var/font_mode = "font-family:\"VT323\", monospace;letter-spacing:1px;" //The currently selected font. + var/background_color = "#808000" //The currently selected background color. + + #define FONT_VT 0 + #define FONT_SHARE 1 + #define FONT_ORBITRON 2 + #define FONT_MONO 3 //Secondary variables var/scanmode = 0 //1 is medical scanner, 2 is forensics, 3 is reagent scanner. @@ -121,7 +129,8 @@ GLOBAL_LIST_EMPTY(PDAs) hidden_uplink.interact(user) return - var/dat = "Personal Data Assistant" + var/dat = "Personal Data Assistant" + dat += " Refresh" @@ -130,6 +139,12 @@ GLOBAL_LIST_EMPTY(PDAs) if (mode) dat += " | Return" + if (mode == 0) + dat += "
" + dat += "
Toggle Font" + dat += " | Change Color" + dat += "
" + dat += "
" if (!owner) @@ -307,6 +322,24 @@ GLOBAL_LIST_EMPTY(PDAs) //BASIC FUNCTIONS=================================== if("Refresh")//Refresh, goes to the end of the proc. + + if ("Toggle_Font") + //CODE REVISION 2 + font_index = (font_index + 1) % 4 + + switch(font_index) + if (FONT_VT) + font_mode = "font-family:\"VT323\", monospace;letter-spacing:1px;" + if (FONT_SHARE) + font_mode = "font-family:\"Share Tech Mono\", monospace;letter-spacing:0px;" + if (FONT_ORBITRON) + font_mode = "font-family:\"Orbitron\", monospace;letter-spacing:0px; font-size:15px" + if (FONT_MONO) + font_mode = "font-family:monospace;" + if ("Change_Color") + var/new_color = input("Please enter a color name or hex value (Default is \'#808000\').")as color + background_color = new_color + if("Return")//Return if(mode<=9) mode = 0 diff --git a/icons/pda_icons/pda_atmos.png b/icons/pda_icons/pda_atmos.png index 89a55a0a6cbd71c6875ef8e78b7224546b6396dd..4485e39799e17f455c09193390d6124cd2318eab 100644 GIT binary patch literal 2851 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 BM0)@L delta 207 zcmZ21_JDDMWIYoD1H*)g8D>C=y~NYkmHifn442~Uba4!+n3L?0pulWmBG7%oRKSG8l_{7tY~sX)jFuNXHZXRx x#e8hI%x1H(+j!YWRrW`@2PC~zG88x&7z$r6Wc1kL?hG`C!PC{xWt~$(69Dj|J^KIv diff --git a/icons/pda_icons/pda_back.png b/icons/pda_icons/pda_back.png index 4708824853f6f219a331be7c8f3be6a9575b6bef..d12effb55e5c5322d38e150421f6c4ef89e0c6f1 100644 GIT binary patch literal 2846 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 Hu0mjf;eJO( delta 209 zcmZ1}_K0zUWIYoD1H*)g8D>C=y~NYkmHifnjDR@z?VTqQfkNUXt`Q}{`DrEPiAAXl z?mjL7e(nlosYMFLdM1UfOCAE1aFi7IxdUa4fouk^22FV&#ggvm>&U>cv7h@-A}f&3 zmgMd3!tfsi7wla=87N}w>EaktF(=t8L4n!CM4-DM>wtcrt4Ocm2B`_I1t*gXrB}DU zkowS~KWnZ?#sOvy7nyYuOB&f0DfMk&o5a9y_R12*;?S$yK$93eUHx3vIVCg!02>TJ ABme*a diff --git a/icons/pda_icons/pda_blank.png b/icons/pda_icons/pda_blank.png index 665861d3c74c88ad4bf4007a3142b29e85136abf..14c58ad5d7ab9a13843fb6601d27d11342b78e42 100644 GIT binary patch delta 88 zcmdnXm^DEnh>@9rfkD+aR|!b51^9%x9yo9S$ke{Ra2b$dED7=pW^j0RBMrzA@^ojfnmbL3^O3bUgGKN%6^MOhEGC`-;He{P)NMQHKHUqKdq!Zu_%?n z-Nz-s&t0J`wMfBO&!n(*$wQzLj*!LpeYZeSkfJR9T^xl_H+M9WCils zlDyqr82*Fcg1yTp14Se}T^vIy=BOnnC@`Ct2z0xd_GC$9@TxE}Oj~k<@uJ3yX+T8` Mp00i_>zopr020bCIsgCw diff --git a/icons/pda_icons/pda_boom.png b/icons/pda_icons/pda_boom.png index 70e473c3c4c9026bb4b32f134e2441ebb9632172..508798c451a49cc7a8a16eed788ae3a52cd2c5a5 100644 GIT binary patch literal 2895 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 delta 224 zcmX>v_K|UdWIYoD1H*)g8D>C=y~NYkmHifnjDP^w5M4ba4!+n3EitpulWmBG4URqVW32;bV&!r)M3KGKlSVWtO}8 z!z7`Ua~GSY&?Q<{0_0OJYrnUHb*IB8)N*2BvZNFlRdm^R2UhSKW$@_@llHb P8qDD7>gTe~DWM4f9rQ(7 diff --git a/icons/pda_icons/pda_bucket.png b/icons/pda_icons/pda_bucket.png index ee030e3a37d84220f18c2123a5aeff5e1af56ca8..039b23b292e2245590ffa81c5cf5415571ccb780 100644 GIT binary patch literal 2844 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 diff --git a/icons/pda_icons/pda_chatroom.png b/icons/pda_icons/pda_chatroom.png index a00221c4e0de70ac4aa3c9c4d2c00eaec38e0918..2f253bdcf4e75a8410d5d62385f07f5b5ec5a7c6 100644 GIT binary patch literal 2855 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 diff --git a/icons/pda_icons/pda_cleanbot.png b/icons/pda_icons/pda_cleanbot.png index cecbcf407730b0487db5bdf314c02fa87a3f0cba..f3b976d6a2c2ae0cfec42b826bfa233f9f56abd3 100644 GIT binary patch delta 2865 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 P00000NkvXXu0mjftbJYG delta 146 zcmV;D0B!%k7PkSA83+OZ005AYXf}}{7k>Z;bV*G`2i^%75Gf}1Fmspy0034=L_t(2 z&z+LN3IHGoL)Y-b{qzojNTq2z1dY9z642BDpju6m z`Ggq_7tPHiapjqBy#Yk^Sjl;l-M`cZq~88h6V`+sB!W5*5dZ)H07*qoM6N<$f_JYu A*8l(j diff --git a/icons/pda_icons/pda_color.png b/icons/pda_icons/pda_color.png new file mode 100644 index 0000000000000000000000000000000000000000..8e8bcfe6272b5c7a6c857baaf4a2ee5559baca98 GIT binary patch literal 198 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 I&MBb@02F>iPXGV_ diff --git a/icons/pda_icons/pda_cuffs.png b/icons/pda_icons/pda_cuffs.png index 71958c8abc42196c0425591662dc08f0cf4c5023..ff7e0cf3fe685a2438b889bc183ef30546331edd 100644 GIT binary patch literal 2852 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 diff --git a/icons/pda_icons/pda_dronephone.png b/icons/pda_icons/pda_dronephone.png index 7cf392eb9778a19a70675d9b410f08ca996da4db..cd7a1e22ecbd97dc82ecd146b90f7d4cc34bf895 100644 GIT binary patch delta 2849 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 delta 208 zcmV;>05AWr7W4s-85jZp005AYXf^-<00d`2O+f$vv5yPZ;bV*G`2igc6 z4j3j6Mh2k(000+FoUX6&b zoWQ1Kwztwiq#{gx!z~DhFjd?Lp6vND3KnM0000< KMNUMnLSTZ;xJ;-3 diff --git a/icons/pda_icons/pda_eject.png b/icons/pda_icons/pda_eject.png index 4168be03f6afcaa21defa54782daf26ee0823ae9..a9323f8f9f78de8aa002c0ff82ea893dfe7dda58 100644 GIT binary patch delta 116 zcmaFF*vdFTBA1bwfq_BQHdhHqu?6^qxE?rg0Law7zHk|kVk`;r3ubV5b|VeQ(e-q3 z4B?oW{Nw-pg^d#z{#A7DR&svrByjWp#6%|b!(XQJ1e-`M%Tn@C`1N0&VQQ8@yq|2) QB%nqHPgg&ebxsLQ08~~d9RL6T delta 210 zcmZo=e8f0GqMn0^fq`Md#0)ba#a`m+>&kwMLqyn2+B^)IMe(pdSV<4Nst3gv9NU@|l`Z_W&Z0zU$lgJ9> zvn6@EyDzEdb&7CPEcSrF%jtAkZ~YircCiq%p0u-kFIQMOjxnt z!$%hJO;RPi5xwdQ7_%h=E;O8;vM`02kynM0;nVRh#{AX6`9PBxJYD@<);T3K0RZk) BLS+B| diff --git a/icons/pda_icons/pda_exit.png b/icons/pda_icons/pda_exit.png index cd983a4a9abc6fd283e1c623fb60df216ab0069f..b440e2cda8e0163fc338f8f2c10cf076a4e9266d 100644 GIT binary patch literal 2861 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 LNkvXXu0mjf(qB#e delta 224 zcmZ20_K|UdWIYoD1H*)g8D>C=y~NYkmHifnjDR9@Ox;B_ppbZpYeY$Kep*R+Vo@rC zyN^qNpSwa?YLSAmo=IWrl7~Pg93=&Q?m!u1Ae+IfK~o+`v7|ftIx;Y9?C1WI$O`1M zC3(BMF#HF>1$&oI28#H2x;TbZ%t?++P+&GO5$G0>`taH%xb4WHW$lc?lFL}auD*~e z@JiM?kfmbBU1%w_T*Ot%qgW_&-m!F*v<;7nOwM&2UMiJ-NkRAHL>7jEXDy5i)WTK) P4QB9k^>bP0l+XkK!Wu_t diff --git a/icons/pda_icons/pda_flashlight.png b/icons/pda_icons/pda_flashlight.png index 3476727930b959f963014a77a5b2e79810ff0ccb..dafbec2c18b90b45ca50800e89d3e8f529c0f31f 100644 GIT binary patch literal 2850 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 A;s5{u delta 204 zcmZ1^c9(I2WIYoD1H*)g8D>C=y~NYkmHifn44)qN;nvd&fkNUXt`Q}{`DrEPiAAXl z?mjL7e(nlosYMFLdM1UfOCAE1aFi7IxdUa4fouk^22FV&#ggvm>&U>cv7h@-A}f&3 zmgMd3!tfsi7wla=87N}m>EaktF(=tIL4n!CM4+2(DqDw9jnsr%j__us7E^-@J}&0W t{GE4IgmM&a@`rFNJt%)UL(viFS{b_qjPgPCyg)-3JYD@<);T3K0RR}bIu-x` diff --git a/icons/pda_icons/pda_floorbot.png b/icons/pda_icons/pda_floorbot.png index 999e45aed250617b70a645c34031dbc67da3accc..1572a02f03fed04dd8ded17addbcbdf2bfd98eb0 100644 GIT binary patch delta 2880 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 VCp=;b4GaJP002ovPDHLkV1jt@LPh`p diff --git a/icons/pda_icons/pda_font.png b/icons/pda_icons/pda_font.png new file mode 100644 index 0000000000000000000000000000000000000000..8ae56bfc49a8c4a2e4adfa977468dbec79befc72 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!S%6Q7>wyCYfJ_z^1`ZAec6J6f zHU?f^22M@}W@ZK^CI(hk21Z5(E-nT^K?VT<27Z19K0XF+ZU)hJclv?a7)yfuf*Bm1 z-ADs+5tIHNF<|=<|pP#Jl ZVQ0={;upUBJQHXagQu&X%Q~loCICs?J^lay literal 0 HcmV?d00001 diff --git a/icons/pda_icons/pda_honk.png b/icons/pda_icons/pda_honk.png index 55632bf40bcd6cf5dd6aa68fae2a92be68ac16ad..49c2b5c0daee0c5e7cab8be5e303820ebfd4d3af 100644 GIT binary patch literal 2845 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 delta 202 zcmbO$cAIg6WIYoD1H*)g8D>C=y~NYkmHifn44;*X+b_knKq2uG*NBqf{Irtt#G+IN zcORDkKX-+))FK6AJ(I%LB@cm0I7$lq+<`L2KsJL{gQh%?Vo7)Ob!1@J*w6hZkrl{i zOY(MiVfYV%3-&Ib3=}c*ba4!+n3L?BpulWmBGAp&&$h!zgm=dtmhi4cjR_M3E;L*X sHQCI#TmD0ZRJsQ5+8J)w9fTMda(+)|ls~Ib2Q-4g)78&qol`;+0L+a&CjbBd diff --git a/icons/pda_icons/pda_locked.PNG b/icons/pda_icons/pda_locked.PNG index 79fe5829162168f1c062c6be4b694dd751a83b1b..ca1e641732591315d28505f40cbf117ff21781bb 100644 GIT binary patch literal 2850 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 diff --git a/icons/pda_icons/pda_mail.png b/icons/pda_icons/pda_mail.png index 6bfb1e8cd7bb3f8000903aa1b697bfc2211e2674..d41d8dd1ae61d599b2f0a10f7d724b617a411051 100644 GIT binary patch literal 2851 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 BMl=8b delta 199 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 diff --git a/icons/pda_icons/pda_notes.png b/icons/pda_icons/pda_notes.png index eb076d3ca33db3e3ff265fb052993d3f019a5e56..2fe05ee351e54bdf2128ebc2019d4e46b9229155 100644 GIT binary patch literal 2845 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 delta 201 zcmbO$c8hU>WIYoD1H*)g8D>C=y~NYkmHifn44!LpeYZeSkfJR9T^xl_H+M9WCils zlDyqr82*Fcg1yTp14T?dT^vIy<|I2MC@`Ct2y}1AK9H;=#vAeV@fC)2<=MT#%zEbq qE;PLS6)3H7wSil}!@EMjl7Zn+b3bF!FP(Ux2@IaDelF{r5}E+}n>;W8 diff --git a/icons/pda_icons/pda_power.png b/icons/pda_icons/pda_power.png index 04175e7c8355b6cb9abf5c8d29cafcc8316a7e2c..86909ea7305573c464084759f6784c7a18013de2 100644 GIT binary patch literal 2840 zcmV+z3+MESP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000(Nkl58GW}*ZG00030{{sMcQ~#q?{R6rH0000C=y~NYkmHifni~yJB$E{Ci0)@m&Tq8&6h2cL4F4((#GEl_G)5S5QVotJsf&#ONi9q*;?1t`ysZwvGING?x?5<5%IFD`3 oI;A(6J6JXfnp>DYaC*YPaKCdAW3Y^M2T(hMr>mdKI;Vst0Fy60QUCw| diff --git a/icons/pda_icons/pda_rdoor.png b/icons/pda_icons/pda_rdoor.png index 6eab5a8817dd4c92aabcc4f37781dbb809acd997..95c0dfd0750671865dd08e5f90a57a784ac2566e 100644 GIT binary patch literal 2839 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 delta 195 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 FV1kzINC^M{ delta 202 zcmZ23cAIg6WIYoD1H*)g8D>C=y~NYkmHifnjG%-SkL|w2Kq2uG*NBqf{Irtt#G+IN zcORDkKX-+))FK6AJ(I%LB@cm0I7$lq+<`L2KsJL{gQh%?Vo7)Ob!1@J*w6hZkrl{i zOY(MiVfYV%3-&Ib3=}c*ba4!+n3L?BpulWmBG9dIq2ah0n@{SDq8)d7TKliEF-cuG sBR9z`flW0u_W;+5i6$PG9fTMdo}HV@7!xGv4K#wm)78&qol`;+0KSktI{*Lx diff --git a/icons/pda_icons/pda_refresh.png b/icons/pda_icons/pda_refresh.png index 08439c6bca3e988739e23d13bda39581563ccae9..c5e2d24f1734be60a9901349aa2ac4f0eddee52c 100644 GIT binary patch literal 2857 zcmV+^3)b|BP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000~NklAua26CssJ5|u7Vp$fPz~9BYzf5^ICwt zc#0)p@<0O2nfo6=wQYM4nHaC}$sxJt{O*|&EdT%j|NjF3OV$6G?W69p00000NkvXX Hu0mjfur5t} delta 217 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 PG?>BD)z4*}Q$iB}@^(jz diff --git a/icons/pda_icons/pda_signaler.png b/icons/pda_icons/pda_signaler.png index f71398f70d26803ec455ef0eb86aff99a7193846..43a69798bc57c1f89ea89b461f11af4cf93a6afd 100644 GIT binary patch literal 2865 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 L)z4*}Q$iB}nFd0_ diff --git a/icons/pda_icons/pda_status.png b/icons/pda_icons/pda_status.png index fe955e66a6168d9b2cc86af6005b199ed5421123..dec0ec88df897b1cfb7a76e331f035ae1f83d376 100644 GIT binary patch literal 2866 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 E0D9CzdH?_b From 3c769e323e7c2ef51a9662abbafe636394c9a562 Mon Sep 17 00:00:00 2001 From: pubby Date: Wed, 27 Sep 2017 21:13:00 -0500 Subject: [PATCH 071/136] Remove unused ninja team var --- code/datums/antagonists/ninja.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm index 230a4d64e4..b08ad16665 100644 --- a/code/datums/antagonists/ninja.dm +++ b/code/datums/antagonists/ninja.dm @@ -1,6 +1,5 @@ /datum/antagonist/ninja name = "Ninja" - var/team var/helping_station = 0 var/give_objectives = TRUE From 724fa8ce547a5fa08795ebbece48196b5ef892ca Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Thu, 28 Sep 2017 19:46:10 -0700 Subject: [PATCH 073/136] [READY]Refactors timestops to use fields (#30858) * kek * fixes * Fixes * fixes * throw freeze * woops * double woops --- code/controllers/subsystem/throwing.dm | 11 +- code/game/objects/effects/proximity.dm | 2 +- code/modules/fields/fields.dm | 11 +- code/modules/fields/peaceborg_dampener.dm | 3 +- code/modules/fields/timestop.dm | 131 ++++++++++++++++++ .../research/xenobiology/xenobiology.dm | 78 ----------- tgstation.dme | 1 + 7 files changed, 150 insertions(+), 87 deletions(-) create mode 100644 code/modules/fields/timestop.dm diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index f245b0766c..97d84a0d3b 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -57,6 +57,9 @@ SUBSYSTEM_DEF(throwing) var/pure_diagonal var/diagonal_error var/datum/callback/callback + var/paused = FALSE + var/delayed_time = 0 + var/last_move = 0 /datum/thrownthing/proc/tick() var/atom/movable/AM = thrownthing @@ -64,14 +67,20 @@ SUBSYSTEM_DEF(throwing) finalize() return + if(paused) + delayed_time += world.time - last_move + return + if (dist_travelled && hitcheck()) //to catch sneaky things moving on our tile while we slept finalize() return var/atom/step + last_move = world.time + //calculate how many tiles to move, making up for any missed ticks. - var/tilestomove = Ceiling(min(((((world.time+world.tick_lag) - start_time) * speed) - (dist_travelled ? dist_travelled : -1)), speed*MAX_TICKS_TO_MAKE_UP) * (world.tick_lag * SSthrowing.wait)) + var/tilestomove = Ceiling(min(((((world.time+world.tick_lag) - start_time + delayed_time) * speed) - (dist_travelled ? dist_travelled : -1)), speed*MAX_TICKS_TO_MAKE_UP) * (world.tick_lag * SSthrowing.wait)) while (tilestomove-- > 0) if ((dist_travelled >= maxrange || AM.loc == target_turf) && AM.has_gravity(AM.loc)) finalize() diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm index 62471505d0..70128be7ee 100644 --- a/code/game/objects/effects/proximity.dm +++ b/code/game/objects/effects/proximity.dm @@ -33,7 +33,7 @@ if(!force_rebuild && range == current_range) return FALSE . = TRUE - + current_range = range var/list/checkers_local = checkers diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm index 0e15d24e03..218c19ff22 100644 --- a/code/modules/fields/fields.dm +++ b/code/modules/fields/fields.dm @@ -30,6 +30,7 @@ //Processing var/process_inner_turfs = FALSE //Don't do this unless it's absolutely necessary var/process_edge_turfs = FALSE //Don't do this either unless it's absolutely necessary, you can just track what things are inside manually or on the initial setup. + var/requires_processing = FALSE var/setup_edge_turfs = FALSE //Setup edge turfs/all field turfs. Set either or both to ON when you need it, it's defaulting to off unless you do to save CPU. var/setup_field_turfs = FALSE var/use_host_turf = FALSE //For fields from items carried on mobs to check turf instead of loc... @@ -41,6 +42,7 @@ /datum/proximity_monitor/advanced/Destroy() full_cleanup() + STOP_PROCESSING(SSfields, src) return ..() /datum/proximity_monitor/advanced/proc/assume_params(list/field_params) @@ -76,6 +78,10 @@ /datum/proximity_monitor/advanced/proc/process_edge_turf(turf/T) +/datum/proximity_monitor/advanced/New() + if(requires_processing) + START_PROCESSING(SSfields, src) + /datum/proximity_monitor/advanced/proc/Initialize() setup_field() post_setup_field() @@ -250,11 +256,6 @@ setup_field_turfs = TRUE setup_edge_turfs = TRUE -/datum/proximity_monitor/advanced/debug/recalculate_field() - ..() - -/datum/proximity_monitor/advanced/debug/post_setup_field() - ..() /datum/proximity_monitor/advanced/debug/setup_edge_turf(turf/T) T.color = set_edgeturf_color diff --git a/code/modules/fields/peaceborg_dampener.dm b/code/modules/fields/peaceborg_dampener.dm index a480459f38..5e0fbdfb2b 100644 --- a/code/modules/fields/peaceborg_dampener.dm +++ b/code/modules/fields/peaceborg_dampener.dm @@ -5,6 +5,7 @@ name = "\improper Hyperkinetic Dampener Field" setup_edge_turfs = TRUE setup_field_turfs = TRUE + requires_processing = TRUE field_shape = FIELD_SHAPE_RADIUS_SQUARE var/static/image/edgeturf_south = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_south") var/static/image/edgeturf_north = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_north") @@ -21,13 +22,11 @@ use_host_turf = TRUE /datum/proximity_monitor/advanced/peaceborg_dampener/New() - START_PROCESSING(SSfields, src) tracked = list() staging = list() ..() /datum/proximity_monitor/advanced/peaceborg_dampener/Destroy() - STOP_PROCESSING(SSfields, src) return ..() /datum/proximity_monitor/advanced/peaceborg_dampener/process() diff --git a/code/modules/fields/timestop.dm b/code/modules/fields/timestop.dm new file mode 100644 index 0000000000..2fe1f775b4 --- /dev/null +++ b/code/modules/fields/timestop.dm @@ -0,0 +1,131 @@ + +/obj/effect/timestop + anchored = TRUE + name = "chronofield" + desc = "ZA WARUDO" + icon = 'icons/effects/160x160.dmi' + icon_state = "time" + layer = FLY_LAYER + pixel_x = -64 + pixel_y = -64 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + var/list/immune = list() // the one who creates the timestop is immune + var/turf/target + var/freezerange = 2 + var/duration = 140 + var/datum/proximity_monitor/advanced/timestop/chronofield + alpha = 125 + +/obj/effect/timestop/Initialize(mapload, radius, time, list/immune_atoms, start = TRUE) //Immune atoms assoc list atom = TRUE + . = ..() + if(immune_atoms) + immune = immune_atoms.Copy() + if(!isnull(time)) + duration = time + if(!isnull(radius)) + freezerange = radius + for(var/mob/living/L in GLOB.player_list) + if(locate(/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop) in L.mind.spell_list) //People who can stop time are immune to its effects + immune[L] = TRUE + if(start) + timestop() + +/obj/effect/timestop/Destroy() + qdel(chronofield) + playsound(src, 'sound/magic/timeparadox2.ogg', 75, TRUE, frequency = -1) //reverse! + return ..() + +/obj/effect/timestop/proc/timestop() + target = get_turf(src) + playsound(src, 'sound/magic/timeparadox2.ogg', 75, 1, -1) + chronofield = make_field(/datum/proximity_monitor/advanced/timestop, list("current_range" = freezerange, "host" = src, "immune" = immune)) + QDEL_IN(src, duration) + +/obj/effect/timestop/wizard + duration = 100 + +/datum/proximity_monitor/advanced/timestop + name = "chronofield" + setup_field_turfs = TRUE + field_shape = FIELD_SHAPE_RADIUS_SQUARE + requires_processing = TRUE + var/list/immune = list() + var/list/mob/living/frozen_mobs = list() + var/list/obj/item/projectile/frozen_projectiles = list() + var/list/atom/movable/frozen_throws = list() + +/datum/proximity_monitor/advanced/timestop/Destroy() + unfreeze_all() + return ..() + +/datum/proximity_monitor/advanced/timestop/field_turf_crossed(atom/movable/AM) + freeze_atom(AM) + +/datum/proximity_monitor/advanced/timestop/proc/freeze_atom(atom/movable/A) + if(immune[A] || !istype(A)) + return FALSE + if(A.throwing) + freeze_throwing(A) + if(isliving(A)) + freeze_mob(A) + else if(istype(A, /obj/item/projectile)) + freeze_projectile(A) + else + return FALSE + return TRUE + +/datum/proximity_monitor/advanced/timestop/proc/unfreeze_all() + for(var/i in frozen_projectiles) + unfreeze_projectile(i) + for(var/i in frozen_mobs) + unfreeze_mob(i) + for(var/i in frozen_throws) + unfreeze_throw(i) + +/datum/proximity_monitor/advanced/timestop/proc/freeze_throwing(atom/movable/AM) + var/datum/thrownthing/T = AM.throwing + T.paused = TRUE + frozen_throws[AM] = T + +/datum/proximity_monitor/advanced/timestop/proc/unfreeze_throw(atom/movable/AM) + var/datum/thrownthing/T = frozen_throws[AM] + T.paused = FALSE + frozen_throws -= AM + +/datum/proximity_monitor/advanced/timestop/process() + for(var/i in frozen_mobs) + var/mob/living/m = i + if(get_dist(get_turf(m), get_turf(host)) > current_range) + unfreeze_mob(m) + else + m.Stun(20, 1, 1) + +/datum/proximity_monitor/advanced/timestop/setup_field_turf(turf/T) + for(var/i in T.contents) + freeze_atom(i) + return ..() + +/datum/proximity_monitor/advanced/timestop/proc/unfreeze_projectile(obj/item/projectile/P) + frozen_projectiles -= P + P.paused = FALSE + +/datum/proximity_monitor/advanced/timestop/proc/freeze_projectile(obj/item/projectile/P) + frozen_projectiles[P] = TRUE + P.paused = TRUE + +/datum/proximity_monitor/advanced/timestop/proc/freeze_mob(mob/living/L) + L.Stun(20, 1, 1) + frozen_mobs[L] = L.anchored + L.anchored = TRUE + if(ishostile(L)) + var/mob/living/simple_animal/hostile/H = L + H.AIStatus = AI_OFF + H.LoseTarget() + +/datum/proximity_monitor/advanced/timestop/proc/unfreeze_mob(mob/living/L) + L.AdjustStun(-20, 1, 1) + L.anchored = frozen_mobs[L] + frozen_mobs -= L + if(ishostile(L)) + var/mob/living/simple_animal/hostile/H = L + H.AIStatus = initial(H.AIStatus) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 0b3c930962..6eedd257d0 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -542,84 +542,6 @@ log_admin("[key_name(G)] was made a golem by [key_name(user)].") qdel(src) - - - -/obj/effect/timestop - anchored = TRUE - name = "chronofield" - desc = "ZA WARUDO" - icon = 'icons/effects/160x160.dmi' - icon_state = "time" - layer = FLY_LAYER - pixel_x = -64 - pixel_y = -64 - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - var/mob/living/immune = list() // the one who creates the timestop is immune - var/list/stopped_atoms = list() - var/freezerange = 2 - var/duration = 140 - alpha = 125 - -/obj/effect/timestop/Initialize() - . = ..() - for(var/mob/living/L in GLOB.player_list) - if(locate(/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop) in L.mind.spell_list) //People who can stop time are immune to its effects - immune += L - timestop() - - -/obj/effect/timestop/proc/timestop() - set waitfor = FALSE - playsound(src, 'sound/magic/timeparadox2.ogg', 75, 1, -1) - for(var/i in 1 to duration-1) - for(var/atom/A in orange (freezerange, src.loc)) - if(isliving(A)) - var/mob/living/M = A - if(M in immune) - continue - M.Stun(200, 1, 1) - M.anchored = TRUE - if(ishostile(M)) - var/mob/living/simple_animal/hostile/H = M - H.AIStatus = AI_OFF - H.LoseTarget() - stopped_atoms |= M - else if(istype(A, /obj/item/projectile)) - var/obj/item/projectile/P = A - P.paused = TRUE - stopped_atoms |= P - - for(var/mob/living/M in stopped_atoms) - if(get_dist(get_turf(M),get_turf(src)) > freezerange) //If they lagged/ran past the timestop somehow, just ignore them - unfreeze_mob(M) - stopped_atoms -= M - stoplag() - - //End - playsound(src, 'sound/magic/timeparadox2.ogg', 75, TRUE, frequency = -1) //reverse! - for(var/mob/living/M in stopped_atoms) - unfreeze_mob(M) - - for(var/obj/item/projectile/P in stopped_atoms) - P.paused = FALSE - qdel(src) - return - - - -/obj/effect/timestop/proc/unfreeze_mob(mob/living/M) - M.AdjustStun(-200, 1, 1) - M.anchored = FALSE - if(ishostile(M)) - var/mob/living/simple_animal/hostile/H = M - H.AIStatus = initial(H.AIStatus) - - -/obj/effect/timestop/wizard - duration = 100 - - /obj/item/stack/tile/bluespace name = "bluespace floor tile" singular_name = "floor tile" diff --git a/tgstation.dme b/tgstation.dme index 525e30ca66..986a748818 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1360,6 +1360,7 @@ #include "code\modules\events\wizard\summons.dm" #include "code\modules\fields\fields.dm" #include "code\modules\fields\peaceborg_dampener.dm" +#include "code\modules\fields\timestop.dm" #include "code\modules\fields\turf_objects.dm" #include "code\modules\flufftext\Dreaming.dm" #include "code\modules\flufftext\Hallucination.dm" From a780d6f79e573661fe2c844a38a6a48d45969390 Mon Sep 17 00:00:00 2001 From: YPOQ <30683121+YPOQ@users.noreply.github.com> Date: Thu, 28 Sep 2017 20:46:02 -0600 Subject: [PATCH 075/136] Fixes larva evolving while restrained (#31060) --- code/modules/mob/living/carbon/alien/larva/powers.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index 36191203ad..906ba71c96 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -34,6 +34,7 @@ if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ? to_chat(user, "You cannot evolve when you are cuffed.") + return if(L.amount_grown >= L.max_grown) //TODO ~Carn to_chat(L, "You are growing into a beautiful alien! It is time to choose a caste.") From 08dcd65a63fb1da9abe7e8f89e9248f0c2ee9f94 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Thu, 28 Sep 2017 22:45:42 -0400 Subject: [PATCH 077/136] Fixes omega air injector (#31059) --- _maps/map_files/OmegaStation/OmegaStation.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 12d1d8abe7..14282b7ebf 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -38904,7 +38904,7 @@ volume_rate = 200 }, /turf/open/space/basic, -/area/space) +/area/engine/engineering) "bxd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 From dd7fd8b4a86fdf183a2568035c0daa34dd6137d9 Mon Sep 17 00:00:00 2001 From: RandomMarine Date: Thu, 28 Sep 2017 19:45:17 -0700 Subject: [PATCH 079/136] You can now light cigars on burning people (#31081) * adds lighting cigs on burning mobs * backslash the * src --- code/game/objects/items/cigs_lighters.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 15a7c1ab0b..f04f8d4441 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -234,6 +234,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/cigarette/attack(mob/living/carbon/M, mob/living/carbon/user) if(!istype(M)) return ..() + if(M.on_fire && !lit) + light("[user] lights [src] with [M]'s burning body. What a cold-blooded badass.") + return var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M) if(lit && cig && user.a_intent == INTENT_HELP) if(cig.lit) From 1a9d36b3f1c435243da5220cc204811466989f94 Mon Sep 17 00:00:00 2001 From: oranges Date: Fri, 29 Sep 2017 15:47:47 +1300 Subject: [PATCH 081/136] Merge pull request #31078 from pubby/opspawn Cleanup operative landmarks --- _maps/map_files/BoxStation/BoxStation.dmm | 11 +-- _maps/map_files/MetaStation/MetaStation.dmm | 11 +-- _maps/map_files/generic/CentCom.dmm | 77 ++++++++++++++++----- code/_globalvars/lists/mapping.dm | 2 + code/game/gamemodes/nuclear/nuclear.dm | 76 ++++++++------------ code/game/objects/effects/landmarks.dm | 35 +++++----- 6 files changed, 109 insertions(+), 103 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 656507316d..07642f1d08 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -7441,14 +7441,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/crew_quarters/fitness) -"aqt" = ( -/obj/effect/landmark/syndicate_breach_area, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/crew_quarters/fitness) "aqu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -14777,7 +14769,6 @@ /turf/open/floor/plating, /area/chapel/main) "aHr" = ( -/obj/effect/landmark/marauder_entry, /turf/open/space, /area/space) "aHs" = ( @@ -100719,7 +100710,7 @@ aaa aaa aaa aaa -aqt +aqs aro aro aro diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 67107bf501..21180a53bd 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -178,7 +178,6 @@ /turf/open/floor/plasteel/airless/solarpanel, /area/solar/port/fore) "aav" = ( -/obj/effect/landmark/marauder_entry, /turf/open/space, /area/space) "aaw" = ( @@ -2225,14 +2224,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) -"aeD" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/landmark/syndicate_breach_area, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness/recreation) "aeE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -129060,7 +129051,7 @@ aaa aaa bii aaa -aeD +aeC afD afD afD diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 05f0897465..72a05373eb 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -5751,6 +5751,10 @@ /obj/structure/mirror{ pixel_x = 28 }, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, /turf/open/floor/plasteel/freezer{ dir = 2 }, @@ -6101,7 +6105,7 @@ /area/syndicate_mothership/control) "qp" = ( /obj/structure/chair/stool, -/obj/effect/landmark/syndicate_spawn, +/obj/effect/landmark/start/nukeop, /turf/open/floor/plasteel/bar{ dir = 2 }, @@ -6506,6 +6510,7 @@ /area/syndicate_mothership/control) "rj" = ( /obj/structure/closet/cardboard, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating/airless, /area/syndicate_mothership/control) "rk" = ( @@ -7623,7 +7628,7 @@ /turf/open/floor/wood, /area/syndicate_mothership/control) "tT" = ( -/obj/effect/landmark/syndicate_spawn, +/obj/effect/landmark/start/nukeop_leader, /turf/open/floor/wood, /area/syndicate_mothership/control) "tU" = ( @@ -8025,6 +8030,9 @@ /area/syndicate_mothership/control) "vb" = ( /obj/structure/closet/cardboard/metal, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plating/airless, /area/syndicate_mothership/control) "vc" = ( @@ -9731,7 +9739,6 @@ /area/wizard_station) "zj" = ( /obj/structure/table/wood, -/obj/effect/landmark/teleport_scroll, /obj/item/dice/d20, /obj/item/dice, /turf/open/floor/carpet, @@ -13652,6 +13659,44 @@ }, /turf/open/floor/holofloor, /area/holodeck/rec_center/school) +"QT" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating/airless, +/area/syndicate_mothership/control) +"QU" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/airless, +/area/syndicate_mothership/control) +"QV" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/syndicate_mothership/control) +"QW" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/syndicate_mothership/control) +"QX" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/syndicate_mothership/control) +"QY" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/syndicate_mothership/control) +"QZ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/syndicate_mothership/control) (1,1,1) = {" aa @@ -34895,7 +34940,7 @@ lG hm aa kl -qs +QT rk rl rm @@ -34903,7 +34948,7 @@ tl rm ux vc -qs +QY kl aa aa @@ -36180,7 +36225,7 @@ hq hm aa kl -qt +QU ro rm sd @@ -36437,7 +36482,7 @@ hq hm aa kl -qs +QV rp ro rm @@ -36445,7 +36490,7 @@ tl rm uy ve -qs +QZ kl aa aa @@ -36695,13 +36740,13 @@ hm aa kl qs -qs +QW se se se se se -qs +QX qs kl aa @@ -76391,9 +76436,9 @@ dM QJ QL fg -QO -QQ -QR +QL +QK +QL dM fN fQ @@ -76903,11 +76948,11 @@ dM QI dM QK -QM +QL QN -QP +QL fr -QS +QL dM fN ab diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index a2d30b1528..d031c01223 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -33,6 +33,8 @@ GLOBAL_LIST_EMPTY(department_security_spawns) //list of all department security GLOBAL_LIST_EMPTY(generic_event_spawns) //list of all spawns for events GLOBAL_LIST_EMPTY(wizardstart) +GLOBAL_LIST_EMPTY(nukeop_start) +GLOBAL_LIST_EMPTY(nukeop_leader_start) GLOBAL_LIST_EMPTY(newplayer_start) GLOBAL_LIST_EMPTY(prisonwarp) //prisoners go to these GLOBAL_LIST_EMPTY(holdingfacility) //captured people go here diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 4c21f9688b..acf55e4036 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -22,27 +22,17 @@ var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level + var/list/pre_nukeops = list() /datum/game_mode/nuclear/pre_setup() - var/n_players = num_players() - var/n_agents = min(round(n_players / 10, 1), agents_possible) - - if(antag_candidates.len < n_agents) //In the case of having less candidates than the selected number of agents - n_agents = antag_candidates.len - - while(n_agents > 0) - var/datum/mind/new_syndicate = pick(antag_candidates) - syndicates += new_syndicate - antag_candidates -= new_syndicate //So it doesn't pick the same guy each time. - n_agents-- - - for(var/datum/mind/synd_mind in syndicates) - synd_mind.assigned_role = "Syndicate" - synd_mind.special_role = "Syndicate"//So they actually have a special role/N - log_game("[synd_mind.key] (ckey) has been selected as a nuclear operative") - - return 1 - + var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible) + for(var/i = 0, i < n_agents, ++i) + var/datum/mind/new_op = pick_n_take(antag_candidates) + pre_nukeops += new_op + new_op.assigned_role = "Nuclear Operative" + new_op.special_role = "Nuclear Operative" + log_game("[new_op.key] (ckey) has been selected as a nuclear operative") + return TRUE //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// @@ -60,48 +50,36 @@ //////////////////////////////////////////////////////////////////////////////////////// /datum/game_mode/nuclear/post_setup() - - var/list/turf/synd_spawn = list() - - for(var/obj/effect/landmark/A in GLOB.landmarks_list) - if(A.name == "Syndicate-Spawn") - synd_spawn += get_turf(A) - continue - var/nuke_code = random_nukecode() - var/leader_selected = 0 var/agent_number = 1 - var/spawnpos = 1 + var/datum/mind/leader = pick(pre_nukeops) + syndicates += pre_nukeops + for(var/i = 1 to pre_nukeops.len) + var/datum/mind/op = pre_nukeops[i] - for(var/datum/mind/synd_mind in syndicates) - if(spawnpos > synd_spawn.len) - spawnpos = 2 - synd_mind.current.loc = synd_spawn[spawnpos] - - forge_syndicate_objectives(synd_mind) - greet_syndicate(synd_mind) - equip_syndicate(synd_mind.current) + forge_syndicate_objectives(op) + greet_syndicate(op) + equip_syndicate(op.current) if(nuke_code) - synd_mind.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) - to_chat(synd_mind.current, "The nuclear authorization code is: [nuke_code]") + op.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) + to_chat(op.current, "The nuclear authorization code is: [nuke_code]") - if(!leader_selected) - prepare_syndicate_leader(synd_mind, nuke_code) - leader_selected = 1 + if(op == leader) + op.current.forceMove(pick(GLOB.nukeop_leader_start)) + prepare_syndicate_leader(op, nuke_code) else - synd_mind.current.real_name = "[syndicate_name()] Operative #[agent_number]" - agent_number++ - spawnpos++ - update_synd_icons_added(synd_mind) - synd_mind.current.playsound_local(get_turf(synd_mind.current), 'sound/ambience/antag/ops.ogg',100,0) - var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list + op.current.forceMove(GLOB.nukeop_start[((i - 1) % GLOB.nukeop_start.len) + 1]) + op.current.real_name = "[syndicate_name()] Operative #[agent_number++]" + update_synd_icons_added(op) + op.current.playsound_local(get_turf(op.current), 'sound/ambience/antag/ops.ogg',100,0) + + var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list if(nuke) nuke.r_code = nuke_code return ..() - /datum/game_mode/proc/prepare_syndicate_leader(datum/mind/synd_mind, nuke_code) var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") spawn(1) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 7401797a47..68a1cb773c 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -157,11 +157,27 @@ /obj/effect/landmark/start/wizard name = "wizard" -/obj/effect/landmark/start/wizard/Initialize(mapload) +/obj/effect/landmark/start/wizard/Initialize() ..() GLOB.wizardstart += loc return INITIALIZE_HINT_QDEL +/obj/effect/landmark/start/nukeop + name = "nukeop" + +/obj/effect/landmark/start/nukeop/Initialize() + ..() + GLOB.nukeop_start += loc + return INITIALIZE_HINT_QDEL + +/obj/effect/landmark/start/nukeop_leader + name = "nukeop leader" + +/obj/effect/landmark/start/nukeop_leader/Initialize() + ..() + GLOB.nukeop_leader_start += loc + return INITIALIZE_HINT_QDEL + /obj/effect/landmark/start/new_player name = "New Player" @@ -205,23 +221,6 @@ /obj/effect/landmark/tripai name = "tripai" -// marauder entry (XXX WTF IS MAURADER ENTRY???) - -/obj/effect/landmark/marauder_entry - name = "Marauder Entry" - -// syndicate breach area (XXX I DON'T KNOW WHAT THIS IS EITHER) - -/obj/effect/landmark/syndicate_breach_area - name = "Syndicate Breach Area" - -// teleport scroll landmark, XXX DOES THIS DO ANYTHING? -/obj/effect/landmark/teleport_scroll - name = "Teleport-Scroll" - -/obj/effect/landmark/syndicate_spawn - name = "Syndicate-Spawn" - // xenos. /obj/effect/landmark/xeno_spawn name = "xeno_spawn" From bdae94f60c249aabd648db3d61b4ecbe69408ad8 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Thu, 28 Sep 2017 21:46:59 -0500 Subject: [PATCH 083/136] Shooting walls can create bullet holes/dents (#30714) * Bullet holes in walls * Code standards, new sprite --- code/__DEFINES/layers.dm | 1 + code/game/turfs/closed.dm | 13 +++++++++++++ icons/effects/effects.dmi | Bin 888145 -> 888237 bytes 3 files changed, 14 insertions(+) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 830a25fb0a..2e0b359fac 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -12,6 +12,7 @@ #define HIGH_TURF_LAYER 2.03 #define ABOVE_OPEN_TURF_LAYER 2.04 #define CLOSED_TURF_LAYER 2.05 +#define BULLET_HOLE_LAYER 2.06 #define ABOVE_NORMAL_TURF_LAYER 2.08 #define LATTICE_LAYER 2.2 #define DISPOSAL_PIPE_LAYER 2.3 diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 68e5e31e84..3140e73400 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -138,3 +138,16 @@ desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern." icon = 'icons/turf/walls/hierophant_wall.dmi' icon_state = "wall" + +/turf/closed/bullet_act(obj/item/projectile/Proj) + ..() + if(!Proj.nodamage && (Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + var/mutable_appearance/bullet_hole = mutable_appearance('icons/effects/effects.dmi', "bullet_hole", BULLET_HOLE_LAYER) + + var/random_x = rand(-13, 13) + bullet_hole.pixel_x += random_x + + var/random_y = rand(-13, 13) + bullet_hole.pixel_y += random_y + + add_overlay(bullet_hole, TRUE) \ No newline at end of file diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 971eb849f67f35c636d0b482751f8f24778aaa6d..fd53873c183655a7110c3f91e6966fe3ab9c1c7c 100644 GIT binary patch delta 30069 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 delta 29977 zcmY(qbzD?m^fn68A)O*Ubcb|z4h$_I9fF7;NW(!G8W}nS>F$t_66tOv1nCCpu6w@k z`+MJe?;rcaz?@<4v(H-3de-yosYn-^_$m|&0U~|$jNBD$-K;-4xVSrfa7IG%%BXm) z{^5@Zfz+R$a&N23EmaK?X#CiSIG;JS6iE^@IzR{uRk&39G=T@21EIv>xSf0gC&vEa zK5yw_#K3Id&&+lf{N>EwV{gmH+2>hWMm*ZYA{IUkNDb6ol*&(d{JRhPw8A^jLVJL; zWdTT+8`kp*ftOvB@{Q+dUJfkz=;y&xY_jr)eSdS5T*MwEOn2>~4ldwX;1OZ9j>$^k z=gnf^*8MYk?Ur1Zv03HxFd@c!!C>9XpUkJ_dA|yGM09#owO*aIB9DX^w0{0dAd!U$ zr58bwBl0*?siAeW%t;*bXy)g+>~cx`4XkTOj{0`aTY5I4!{+favVMnyv@N2mQ?&9MB{m-?%tjJOgs09Jdv;i+mvO$ zy+Z+pxY{3KsbnVX-}-@S0bJu2_XVwia2pLI)D@Vg{je zQz>Kh!Nn66e;&(X$o4nCzcZo20@(8+^W~=6Ss`ly@ol0*U1`BY9QF!Ki#V<}LM13E z#aZ{LglzAYv9Z*MNnPy3ybja9CF{*?>caj$YT!W_-Z~SA{SrvhaQpUvI+o~jW$47& z55-i+TVUK;I%N2Rok$YtII#LC`r+J-@iw0+F7kYmKrKpOfocmeOEb333xqd~Y=7k> zd;zyoXwS+Cclj}*v~pb$WNS_JpcI~BA7sJtp8bO+!*61?h0zl>KG^GbdP7|b^A0~G zU_wey3O(JKbrxupWeyP+}Ne$SNQUr<=s&7Rd4db71GE!K3{ zV>dKK@vJ2hOlaa;xkLGAYI<+{);kNp(ANGGn$dhZ`b*rOo)2)8*RLEMznl;>_ z<;Gb=BwzNB-=QCmB^ezh`A7u5H*6& zl4@-S{9ImE;(GOj@hRuP`|;u@8?>m~Q)x?vs_b8ZTabWL+5Igo_iJQy!9@dC&&*wg zMGGdu>uBsm-|`F^$lPY_9G0NZj*O_8+A)uthr(n*%Ji*Y#9VYidb!2!RwXzV=>w>) zDzm>|;Wa!_|I!|*ZaUqUsD#^B<9!Xy>fr3NVT{)1>MQ&esSN~}3I<;tJ|HEnZ^G0Z zD|nve5FXgJOWgYz9z$yi=|1dxlk;K;t?}QN%H1xuzEaVTdK;}n6QM@%+?6KJ8KdT* zczA4VBL_vS+!Nr>f9Lp)pNsGMq z5jV=y3=zOt%wK%Nvt;Ukrxwe_la1bFX5u^^Pc`9{z4@GTw!$GjlMXXjNB3kK;gT?m zlG!Vlv-&E?q+PlsrkCi0M_ZkT)49f+xb{V|NC}-R89mLEG|p?aH{3kdB)|JMPVVGS zj}ILlq{*LenWG3Hl?At>g|(w0gX0-EP{4r-j{p9K4h{@(V1fe+9N6H%0S9hlJKA$v zN}yrS_vy*|dzkHzFQOZ7-V&pEMc&t>_|M;7o2;u^;hdFR-&}3B#2DG!TYT+_R|hmU{PO|_Ut9X6bEJ9JrnOGR5Zt6kB=oDK0ie0< ziOnxkSXEPcSqHa1);slveSaWUsD>#polRJaM7ZnecCDJ_y)x@ZAv5ZK`i0oQr~_*E zEqjMQSh&J?{@DLvD~Tlbxu(3yWGwWIQI3iM$le~=-r*<;W-O2VPDCC`Qq5(qIvCgs zvqrndQCr*AJ2~*k7q5|TdXgK zkW+hQ5n00ON*zj172;2%V=8wA4FYzStx@$QLp>yWJz^QeaQ(*yJ!!Sy*_0R+vQQJ1 zphU|^^ar*Fmil3k+AAJ^5VmkuBkUNQ{w!2 zLYY=2?ttHtir1nx$R;+HBvyzi;(=MVsUOZ24`JWuL%=C8pM|DuezK;DDX>bbPo=CO zY#vdyQl%rckzp@9L8rcD7PvHsz3jupD^w|A=KQ9*_R3+sq$~k$t^&lVAo-w>`A2%K zG2N7OIlskID&w=HYnu;P;_w|!-FwGE@lKZT)BYLj`^g*@C02)CDY*q?zD9{iFUbN!_QdAKCnXLDZ{7=4Vzn=#RDHFS(sPF{&46U+{wS*||*_?&GfEqN<-G&kl zEztHaAAZ~UF_qfI@-h*SmR4JSULeRtZE?k)4bJJ5(C$U#Or-U^{!GalCCVQupxH!o zE?JVkg{2kAoP|b%DWVFOzgj8G(wrh|o})Hd!0{(c~cCgN$if>PYFMZJR?4o(%hu$M7gB3 z)w29%FqIatdU(J&wZ<2UVp>jhJn!*(RA2O7X7z7u=alAJ0_USmtcqXkJj1d;bMY)Y zSa47Ep7FIEdj!Z-`Y;g2k?Sv#9J%?&JUJ_~jP&{P z8I$YC0?ElGIvG%?@8Pcz)hf~Ly2M~w)M4bA#p7c;#xcJWV_)xe8x-KNtf#gvDR%zz z-S&tUCGSIR;9%;vwWEf?$`2Y+YG0{(jP(&P{HGm`<=$Q`6t*MO!`vddIwOX8wjTtn ziQ`|uy#XHXyN|5j{D8ZU@*bX%#6P|69F7qZGBX&-{mk8vagg)``^jNq3@;PO8k7`s zFS_0RyO}gg=}e%t_-CN-35g8a!}kdSuHU@aZXzRW^WDETy~X3VXl`cD`LCC?2F%lW zOYKXHXbfN(LfCnhe#E5HS^Qj`wk1}wvw5c%Jpe~fmt%7mm3Zi!`AM{&r=^fJ7rAE$ zb>b3hP8o``F3elTjQI^irD2__mQ<%Hq6y)GgJ_B3^3<>E#~p^jJP)=n5MKCG&R+cA z$No09)^3lg_dLhKi8(zQSf=4fTwpLg3-s@36u9uOwJq?vE|PS5qAcbSuAWnC7N6|X z1t2K+102i;*z*jgK9g*`C^9Q=FAdgv%Y`i--S`BgteK=$#M*8>=c8B2GIdpyRd=7A ze+_lWLdJb*>IA%S6JO@=4FEsO;%z%-xgWzx?s@30{f{DNTa88k3s&wsnz*V2gNQzI z2?q14OW5eD>PkS>!90-D;mq6JEm_)hw4{-Pve!?tkdpvysy}aIibi@+Kq$+&y zmMrYq-wzEZ<=o-N?n1OXJ$RF!H(Gn! z*uy2^85c8t2qkE1i{h%cI}NyKy+8iGooX4<TC9s0sO%HT?Yf4;6XWT?GLV;zTM*8} zZ}m4j+nqfhLdsN_+Y51jLo^vc`YN}J_c;3gu*>vlBif;$cJdru`>3>5x-CwTkQHuHtL&LYA+6L#JY&N&q7}-cC8kq35ZO0?|(pamAmJ#PbDxZzGAWa|wr@n8F|VmQEKb(Ah|>-9MlL zoq_X-kmT_#zwVoW*X7)-*2x(V18NqhXu^efh(~Q!%rkK&%Mdu9+IT8MC>{zsTZLjP zJV~w~wOJu(=aJ&qGQbA$Cz^DQ{YznM5tSy$DJPar6KM&q%}HRzR6x$xaC z1wAz^c|0Rxa_F>~O;Hi)JLW9EMU~;@z1>&ZG{!HIKjUvwdMF;uq)4TuO#>bjOc^Sl zj5ChwE;4@HA$zACf)8JSy0w0U!*?O(LV~4}OF|!eAZwR*ct)onMpXF@@j%$i^}(VB z`C6BXid<#q5zrZ2tyHHB&;ZDWltl>u_TFkD}ie}h;Pu`UzyE*U&+w}}zJ#E5nZY3Iz@9n{r zl|N@UjPMoDivLihiny8^Ro+ahGYt2&mtEr$kn_!>0tvmXcDtZU^2qq4WBYCn zaB#AydES(R@YK4=S@aqHO|ydSdN(vSctsQYahk!@5X2STKCAnx$PeW(6>cA;_U)H} z`c_}|32%(YevQ2&tV~B-D!dQkd&=*-t}}){FpN{!@Sf-UnHb>7G#)21M@ar2*s8K~ zzBTTyO*8Xe`fDxN7Y4#)Z`a%9$znDaiifdS}kHlL6byrIHLI> z2hwJB=FRKuAEtXrlEh+iMe18_-{lq?1)`7EL{`n)SgY7F?~|T7xFlEZ(4^fR^S0o1+*w--}6Dgz{p#O|XfV+54n7Sxr!h zd#gyJDKG{FSkk&|&E^Fx|6K1*GMHW&@&j>{ckI~>`k;0+Gus?el#~Acw@8j*OfTE3 zfqUk~qvnw9KG-wQl45cbwz+BcmR7^?KV~@mUS)=tFHfn(uz?4B@Cm=;>b&@AHh=cR zT5!u&<~2%`Vf1+V=|q4mN)##A2zQ^XitX_41dnr)9ljB5SP$o4X3c%0IXExHn`wdtsd`elj7LZ0+nn1L_En}RFxw&6+*h4+|bOVBdPK*|5i7P zwCe`NFsaJy44@I(zCQCr)*srQV233EhV@(@SM#McU{r>EY z32P24$-`#H7k+9m09J_@Z2GGi5p3x1a)&tR_v1Hh(o_D9@FmIZ-Js<1nq+;Q%fv~ zunsZts(hF920{DpimOv!Bq=v}YTQ2$WQucE{@7LiZRw3#6&C;2@dphxjk0#VYV=Gm zoF$8-g%$pkpy_>*;4~Ll9a*c%R&2`99kb1c`KelID5eN7t*c z(D|PQvCTLdMq`K8+f!!qb?;9N?Iious(zOoS%A!Pk-a4p&*za(wB*iyg)DRI)A4V7 zfU}Cry-2*_!ME(d@xgvHN3luDaEvm7yCIT%^Hn4CF;d}M6h&~}G!Q@e>*5g|-y^{A%<)sDJN1n&m4t z1%Pjwi%p!Ra)UbuzLs}h1#Z;#1+lj?-xhwf@NB(~Y`PK0Q|o$X|~ z&p7PZ*t{e%Co!Zji_6k%z)Yc+oh#`ppS7kyC&6mtL&S5CCi-B#@r>>;puSy#DcvCr zKx>x53p%xC+t1IKsI%jt$m#K1l?3KIhN`d6Dc+s30jl)+?DWrDhd$t|=$34AhR!2s z7}>1yRV)j5O=Y~5Q-Qd2h`TCQiM-q%O^&@DQ-KY%B{|C1Jy27zrU#QUUg3;bL61}s z-#r0OzDm%7TZ0HEp8G2qhEpKZStbQ}B_8CPGV30 z?(hPU!JQs#)dZ~cA!Xk!yNBYu_KzDPnHpE2rHW0JSA&_#2%s-RN~I~J2=A?9(wm=> zvbW8@-G>%lihkVi8gpxERsdi0$E`nnh76rXWXi|<_eOslW1loBeRo8r-2dnIt{R%^ z*PO7!#PJTRg==MujXbu>D>LgKP5bY(hCHL||Cw@SK4xKTY-V}ljB!=e?u+-CNKeTE zYaDA^NAQz2{`Q%3>7hrk9r%cUL;==F#wVtKUT1fwZ;BoSF8aXcugc4IjC_?=(Fu`4 z*5P>a{R-LJTYYO=f33z`lA-E;`ea&yqVagKBG#Dd*Hc3MX@z}Dh&{E-osbaj%MW*r zn6oTrto|FXZ~oq3JpEJfe*&xh4@2Nm!e8RmBdN&5>@so1lkB#_pC^U=ZSWqI|JTil z@J~e|8Poqeq_i}S+2R0hRS<_kl6@078hB>9(YRcB-_g76k01_h2~Z%PZ-bAA{DUKX!fl6g^3$_*s-y4RaB`bVrsA8_Jo>a<75Uqc@8oYJi ze+dvYvVpQnaeNB?FCH%4+4K|?8&%6=)bGW|g!jriBD)3bW2dz4-* zzJ60FMez^0@ws0Uo+d~BP=OJYO0F)M(f-BifW(p+5#RwEb@Fr9?i!GQm~+)*&N@v} z7uHq+{(^+Ukt~nCiJzkwuh}fOSZL!6AJIX;H%F5QXs*#!AveMIK6F1=W-zS-HzuXf z^>t#$THj`R<$J=)y0?L*vKw~#HYnhw=am%KR;Q3vS!7m zh?qL!;7MS-oC(vfw7;kbVrh zpZfqN5WWm44iU3c9U|pX@8{DL{Wj9z|74EecBnl6QvTchj<$0l&e9Jo9Ghqif@f z>=dx<5xs1_kv6z|s%<*Cl8&bpBVS=~t^W$)TYZN}k|ep^SW$ z$u1!h9Y(YH^^BM;%dHc_l`4=Lf5g!Od#Q>JGA!zg3}hMU7R+^V?tSUZ{~|&RnwLUt z?xHQEtKd0OVa;?#ly=imQ~&e}B=zmd%DX8Gb8~jTKFdY2bM2igluNtRgL)$QMqgiVtC6Yj z5!%fOo1*#FOPT*&C6r_EU+B6bwb^yJHw1sQini*BNP2efj!Z;$I*=#gCg9g^hY!$o zugrOQs1>#%4?8`^xR+waLSiE2SkhVZW9Tofetk|@xHi5aJJb6fqx3UjL_DFJyFbr8 z3+s;yd3w~INHDTT6}SE6t9KhS0(H~W@1pJ%T??>}Bk!Zh4nKBfVHe+qb1zxa;KWc{ z-n-p;dk#O=-3XKDxW9{&QMP>Q`$Pe>8;u?uc^q$bc_+5sGv4IjR1sECMH@*`v%tT| zLEKr~AN<|pAxiP7rfO3^+FBVyPAoegF{%zkJ=u+w^OncB1Ly$5+vsbp`dDKU9Y{D* z#&(kADbw1mw(ln$x8c;%CeaR`Rfhuor*14p`qlhfc;yqp9c96hM2Egc zR}ZoeTmEmML76!yA4p-;z&3)u>cIOwd-MF>-42~>Gzpf5QQUZ5Umzj|2Lzc-4e?2* z?|pS@5)H*+p1)HB?13%ThYektL#r~TpsXK$L}($fTNfS8SlQ4yWl4LQ`iECk8P5+! zi>%%U{!Jg*I8=8$nh6U2xJ5_rpI!B|{*pFCbkEqRuF`BBt0XQAVD zYBeLWf2+D^-Tc@-oFYF`aYHvojwpo0?zFder1y~$r01JFY*fZt$s-OS5sKWgAzjngmHPs$lC?axED$t)s?>K73w>gL6Ys!`nf#Cvq6;TKndSY}FXG^^MAV z$3!V6Sv~tA3h6f+uxJDnfUZeI8-Z&9s}2we`R0@xGc_NgK}_qrCF|V-*p~V7a-USl zVwH%<9PN8Vj^XkLVo?XrjLgBdCg>uhG|b}npikm6FPmz4T4MUP$ZMat)>r3S27to)zlmP|iLAV5lR2m- ztJd}O0*c%w^?pO(=;4wuL(oY03gdrh+Dkv)SC|PQpF3vqhJOH()YM zV(x;cd}|8YFg`1KS@(s@pDLz#3vA4?iA5V#{(s@`H7VUN$JJwH4@h$Q^wO1geXSm% ziaj@A4b=&nB-$Y~#680u9DtUOPWw#emos~@TQT>q0^F*oKQB`=<@UI_EbTzv4A{=^ zq4?=9mZ0z0!YglDVqw~td>Tw=CsV5NB5d)g)s`I!vA_7X$0inNF%x;+Akb8z7oUV8 zS@Y33&?u_4$E?uj9x{!di2Wb%*Yg6^#Jq4MnZ@Rv0#Wv7H87;Vx%s(2@^`PKffySJ z*&Jq8O(bzepO5-x6Pc>={A-!kj%BqmF3g|Fj8SSpt?+*Hk?VM;JS8{EE-eHkWZq za$*GP!x5IasS(8VPy#ANI0ZT$?%im{WeCN~JApGJp_dL*fJi_qDy$PX0TP2HKEv6e zY<~>ezsojED$PTN4Yxv*&);U~S?9$H39aSd&S18qRrQZ)+%VHYcPz1%wvj;#+wCyX z@B8N-_fvFz&W`XT=Z1+9p#u`@j%YLtWS=xG0cK8P5r_w{vKR-qmqqAChHOeFu>)h!v}|m{nz`*hWfffh|9o;YB!a z5P-#jrbomGPjEzP_P#4VI3lBQLy7u^Wp!!RARs5~Dp$<9!>1!dN*~Ian`zd7nBRMF zdB}fT_iPcKGweU*l6HHyGz30$k z5PWqYvEu@2(s}1OjwNqAA}MVH^_odvS>8uaA|gAXW zB&zNg^?`!`RZcp<`fJF0srzkBPy8ReWyl8CNR^w{jscjeN5Kl5}yzLP0oD>bA8>>6%ahjAm3yu zE!w|ND-8&$-XbXJ3MVB^!esnOadhuMre0g3>=qSVyIe5!A}3RT&!RBpFmV#38w`7x zd4GM~#(oSK}54{>BmYJ#MN6^5XL-Lg(VZ1h#vtcpia8F4J~;#?9s^s4AmeJ&JPy+S9O zNb@%*%(FTcKQKfBT)E@u&F;do>Zczx0HZ9rD#5_?>%3Uw&^bi#M;*vA@&1R7Vdnt+ zVv6dw6ItKBhufy(lu&2>M*Uyf&wu6eZ`jKCb+c- z%LTArD1qm`tbZY^3~&0a(B{l{z*+p~e`gIiUGrPdvx%zPy*=bLnBs{ znL^|ut?We7d&q0?dd8HNE9>D1VynaeM-fV#8wuwBtb6NcE;wU1AP@5AUsBrwDk9v* zjF{UCK*Jww&vG*oV#imD(jk1E*E=@E^r3OzpX6{YyMyrBJodyA*_1Q_|FZo75~W%Y zF*VK~@CN%Pjc>hEK0*OG#e#$pkgu@3vc42sxcJWr0=dsn+DR|s6Xb56ZzWqVDlnec zB6Er}c^D;iK>4vjP2%sn?o)4z!JgN36CbvZ5_wUimv+VzAf=!B;x8$AFScPi0c~FA z;nb^(opsrt>+sZG!?LQ^x}kh+2i;oavgnirSs%CF#;^$Z0MXqM+6vU4GF)X2i-_#r zPCQHa0|dAJEma&_B)5dLCm4!PNSQ?bUM>A5{9SGqCWos#SkC859d!gGb|n1ID#MQX z)PCCCQ4l`cva8v6JyI!b%GfS0mgXEvw))Ygj3;MGtXB1UH#drlqQ3NS&WNYeD;UdAzZ0$ ziBWsF^Et)O_j%*voXM#k$7SNR6V7Dn&iXJ`AUhs?)Q)VsHtUNBD{WbuJu|{@kk7IR zPN_g4E7u7nWM?Nkt#OPiNfXuTc^t7))vYr+oh6BA8A|Pu7%lqT10pIWtxq)g3{aFb zj6eY=wGFHkD5?F{H00TR;opd`OY#zX6~Qk1<)@bG|Isg%W3F(Bev;)C{*Va9oV=hPrYtmmcKlq8#~WJ801wcsMUHaN8yG?8(<{{S%_+iP-%tKI-~Cfb zaY7*^zeQ}mMjOdO2Ua<54djQ5Y0PPB7q8kt+`BP()t=_ImIEVB6oUm&ce6Ce8jt-B z%hsqKK+%Vzja8byfRQpgP(biLD|hRj?}0@EVAn06y`Io}6$5J3F8retne ziBQ$*U=1I2hcO!Q0y^Iyw^+m+@!nsdy)rlYHDY*us!`(?9_<)lAieI@Uz8z2c%I5v zz!)^`Gs>x}!Y4Nt&$tW1P~+@i<71c*28s-6R3)D!6EqgYt#Poki*)EvX0i0coq{GJ z6%2Q43H#pQ7-WEiaqFYhjUH%R&;J>1^(+!f`7=A<`StVEDH~(fN1|@l>_}rMD6kMJ z726Sl&4L_2{NJj{G6kp;4{4v~^bTlQ6ySt1xv7+>l-a3iDdzOfx)1J>`MDc!*xCz0 zH?3q~OIu~6-0320PC1AIOr;!h95iqT(9WuUDES$F!Wpa3t^Wl^Hv-G#HLdt%T8-|g z(_otBt0>lq4A~{8nda(UZ5V}xuty};x;z>{q)`2(0K-;GD(Q+P+^R#+;HW5hiX!)$ z&|_p4lszph3(C2nJ8HUO{&Xw-<^hIYY{4ymz}U?TE$zcYJxI)loNL+TmGrrr^N4F} z$Hsz@Q);BZl8z}bY-ZLKp2Xc?(K+b+7#^$xGEkKp~QFsd}#zR~| z3fiTb2#YN4Qpyox!NSe)V{Y9c@M>->NnSCHLaiBUx@hj&Sn>=$C@VO}gN zNVr8OG#W+(D6r;-Qshz8Sab{r{FRXd+fP+OmVUaW))670>^?7rJK-oM=_XZ)f`8i= z%P3%bxER&_N{x->0(@$Tu+X_M1RnZaaEPCpgAHxf#3+@`zv>t}kYc-GyQoK7XxT-V z%mHL_EtFrXgUzQ#{v=MSWbl%`oMY`)LuQLVSOvxs405@$9bqU@dAc)WMcAaI+LSp| zNhFq`;0=*7LkY7zFKn7AAK#dMuS%gFB`Kj~c7lZSYhbVu;Z6t{oPj6qjAj2>WlU?U za0y{Y@bep#^+6*p+xq|Ak@tEgAv`YY;&kjlMI5AKG$>@JyQ|c>sI2*TArLz*v0ZcE z=2kiroov6T^e8{sxq-Jk0K3>OT!=`aUQkAQhVyn`VswlhUrn(fV;)Y?9UV+$x0X#p zN-F(^qNX-$w#1ImwNucA?2XfJ9c`v_3WxPiFRlr^6K!puaC-E8AKcT_)ATDvYwAf_ z&SmA8aCWS~cI1G>p}we;-$R^v_DK!c`YEA*M?MkwoQ1koF@x7tPK1@}PXa|XtMjU> z=4*-nY0l%;{fCk9vh5-z-2TsDf~2+836WLb=c&+(!aiu7MGDA~}RF6MP#46ev6+M&mIR#klXaRbqaHKXk#pvLprJwj=qR{hd-#WV}Wp#&qZS^C5D@FPcJV|!! z=bX%n<(X<`slZ;>KwcF2;Hv4Kfst8R;iR{y;E^83PG9^3JWhOA*93{&vyNPj6M< zos^T{|2%KKAI~bv{g6k2g~ccYaX;8T(&I%C*~QWg1^{NWdmehar3GryMT$)?dY@X= zBq~8pB?&qdmC=L{6=^Ihqk*D?#$p>}18iO^s+QeR1qspbxm8jNeCz$wvcI5M=$t!z zn%4m)@cr-Jez%NlYtyd13@O)z3%yFBs-}YqvygC|kpU#5ewJ>6!+UBf#T`EW4w}I< zf!$kkfYo4FBx4CY&{0U!U}zUP2v&L0;Xe2mpHYP{WX6UXL5&bd@Ie>+y{zyDT_s|l z=tf#7uqcuFZd-Fm?|fe*K_ZfE9dbaTE5`^ejr;x%Rw()7+nRiDI%easgvn6Jd)r|K zMNkI?o!93q{s$1%Xc5`??%frx$YK`NmjZyt@CKnJDh{5X@m>lI@fSb$!DVT%=spgu z6{gDGmFMsK_pn+r`$QZ2ylMWeNkJQYkQ44hq)jfWQ+6p-KNai#rr}%P517 z#o%6(1mUwnjo^!<#OV6YnA4}lLONU&F4jC3jTZJhwnLTg`F#0Pmr}WOqXYC@_L9H` z3B&gM7>`fxdWTLamb(E-Tje=6w!lq4U&~{94REy5$6O0A;ZPKQ5fUQ$)ko)B6Dyru zXsjWrn)~4yPbJxYK;{et!Y139=)HjUa$gXU3kLfxAVFvbg~3zaw!py(?(e{X$RKJkFJJObiS`xdUII9(?)FU z{yeZEJ%q+bb<+SSWY6$K|dD0lv)bBzV?B~K?9?@>wODz z%@t7UGdg+i9JZfV;Du*OsDVPapMZDjKwhwLUvq=X4r`9rJ$YJX8@c5E)f zGlE|&7TF3F6#KBK0>mO#y0lne&-8f7Nznwn;m50a3FxDpxl1Ie)r2f6&2%RlmyIx^ zrH(WO%J&{P2mqV6`?02yd*LOe1rOe!3IUT^pdb5N3qGve;jQ%z-5#k&p~H(=rzcAb zwSAtPK3O!vXZcebFREdJTNE!Wgj;U@>xHLFEl>~x!lokn5BzqPc?3A#3Ruxgf@!YV zu`k`8m9XyMIW~hwEQ^pwhsQu%cyPBa%D2J??gJnt6d+SjEbhG)2kXit|?l_maP+|#6~Z31mBm=+PYRhO;C0kdI0f2IXC)|SJg=k zxE#xa(=_DCBM5P3I6;7aR?4@IWFZWAnS_}+TdxD46LGeF;NPzq5Q@F!=fHl8r#6rm z&9L`f>@~YVMt=C05v{P#0Uq;Uzl{S1P;{3ANYXy8NHH29@4nz^JD^iC+W*d!lMO~J z7WE9LRq6w%_<$xAzl@Y^V17M-rDf5nMk^jT@Dp%ey~&r`E4tB3-4j6(XX>t>E=Bgp z%eCkX4e`s+BhDsAvAdm%fWr}Zj-p=(o1d6K1ER!kVn%nuQ|C*h8k*aLrA!!&^qXlH z?2C+?Ps6xX+A0rTfp03n(*{3TCc)#@$)IOS>ruNK2RZTG6IB;?;sXfiJ22ZeV3BY< z5NuSsko>{8M{|RzOpcn^;NgNofvP(v>9xw`2Qu~cNw9m#L*2tJZvL%6W9gSTnJ@ZH zjukRt*`X}XwpPrF>j?X-n%j+~+f@=h3FyrNf!qxSnmv#7q4h^TG$GT^conF`aP|1I z=oeClZi-5Z{<&JQ<^S3uTpaR}#?6RyvQ`9>tvzh7W5|EgeQdFqt91pr;C+Lda@GcgO| zR7)zV)IKx_m?+Z7x7E4|a3p4@L;(|ZLn<*KTfd&LPOopbs+?^9KaBeAbx84xT-~9S zScYC-IxPT&wzDrF^exLED?9dKtE{v*h;D5MV1RUnr=b$wyYs8j28gK=lvP8*(2ymLK zy0*iIQvMNV>?if;KjhoD+nU%VhmO{aAOo6;h%6ON3$5q2X)|&Go6`^y)wT2LU{++V zg`8LtzRMHgauU9%v*Ov83g(2uWuQ3VggP3sR=SiDNfn^0a;VN_mByd;Fe2ijJ;?fS z{gy>lBPxi}#^|p6Yqf4x`|D#A0AzH{UAyMo&TZFLu1m;0R*3xNZc*H7oN<^67olG< zYd7Y^FB6KIoW2f;QDsG2VPNIO$(svxE5!{W*EZvkT;V_*aNBOdSrsrofV+Vtc22>o z+o^$@stQQ`rH`hSely3`8-#+fiCX_ch43DJg7C+S@21QN<8C0Z0Rp3X2BpE2iOstn zex4ht^U^BzHD<#ZhtiHLf>5%zW=xsyIc{}2YaVNUe_o=Q2Z3!O2^M>*JRHf_`^$}> zK$abLF*6kYaQ_fKN{f_oy>+X$72u8!WKKUCL}HH1H*Y>9yLbM#@nHME0mGGv7m*SR zfuHL(9#aTde+LFDyBh2Pz4pg~f%ENSw!;>OX@(e*&^fI@vo&MGYGeUUF&?kv%7riK2LiI*AvJy=BoAfy^jygNd$@TBF;mN}?m5 zYT4}VTh5pWcjlxPRLx+`Gnb5C0-<8Nv1auRwGY<<@D{`FK!Ji@=`Ck2*D!C=a9-?- z;f0>mKhQqO_ZpTZQKk!dit7g=7ctZIxnyskA8%CVvZ|^uLe2)%`C^f z#E}UJx#x)3dFJqc^084#0mW~oYY#ACsm=8~j9+!_qMZVQm;nNTg5YsH{ z5&J|%bvyO$p!w~yoBvm~kQ56Xi%kCZ#_3TfBi!JqCltDW#a~%QB!&x#nCKzn6q)Ox zrO1EJ$pmp*b7V#k`cM>pLnW*vyE;O5!O;S#$6z6U4fqY9FJdJR6fPaAfE7vq2F zYAv32D+8*Vgk8}njARVg5yZ@$yv*fUgCc_W?v59fozfX^+kmI1%fI4MrR+~nz~9}p z^JfrczXC`2DvYA5+EW377+0?yhfd4oA;UR!;hdB@dHD7tf@QuJ#Yf7DUA7pJ&f4%w4?C zD2^Ytn7X?Cum&87^yj3y&bho;C3tNUt4y6mh2KDlL)nc<+ZI)2Mm@&%X*NRnVx;wH zR=tOsja+^nw;XY-6;a5Eo_`=M7x*#89*34<_Sx6@URG#lP%s^6u@nE2HvFYGtBB%z zEhHF}wE_XGm=$MjbX3Tnlkjd_!8*^}*c?tKTE&&FQ_)y0Wkfks2#lVy0BO*dEZ)+W zDxdVt88guCLWjD)HB)k67Y==$8$^XNsqJ8DfmVxD_N(lkkC;CkhPg%!VNf zGkdPge#a@ZQ6E^=_<1;$?*C0^U9Iyt(_H`fLnTed*0pp$i-3_f5c(2BRInzApgoiG zHD7Kw=G5>d%~+WeI$^##@TYsZ(=faxK}`ATN*J$kJVxDz;NlQq1d38mBv%zLoOl%) zKFL27QR8@IkXUpLK-;Z2Xls%X#rBe1)49Y$5yZY+^UE?yp7>VhJpO{;7CMv~j_G}k zaAYzlki`a=`92BNrmfzO6NnhRwI+|W>=v-3Pmt3v8jm2(rpCbozRq9j0NZ;+dxUr& zmuZIv>SI&I<*w(3eDdIP_ggsAbJfH@N?P;WhGp;{*J7LXq*$ zb*zxbN?w|4hEu6M@E)46gOsBEQ!umc?2X(*bL?rk6FR(>(hJ}YE?M!)*vKPRRuP}1+qGF&d&o{I+GFT1x-`ZmMzE-CRcCbLf#-7K8$oTe^eRLj#xu?+8auo2_P&cJ&?(F?(*gyPhPJ{k%i9&~EqNPYEb4QAHf zmDbcqGaJp1m-i!?%2!Qb*8D2y@K~lD%BL!9U4g&O6WTp`CL|?Bn<)LY#_4;404A@* z=f?;%@iY>^qF0IhOX!?kA}hT-BdfDl=8g?tAZv~_BWmsquB26FtM%$<^iP#dK3X&d zOy2}4f*R?|Z3uF4Fht=yomQC3b})ESbS5sVtNf$EFNF*dW{q`gh5d@Ty0z|HD0bzL z-8gkbk9EV5s<*mFDPI%3l!e@go-vVqXzoOlvxx{;RSp(i?C-3bce&Cs3tKU#-gsPu zQ=${d}|G-72GTQXq7ITLzdj$jVYAP7^dvh+N2B zHEq{eZ(h4%Q@*7=8mBrrVqXD{3Im9YX~w)H)cNFzL?P!K#?-OUkAt)dVJvMbNS-t) z!*@$?zwzG+>Gp*ghU|AZ=VdkwveZ-lse3Lkf#J~fAgy|r%V^}d=B0VgFgg9!ERJ*z zt&DS+fmaV#bOF$L6ww2H9rJXVZw6qa!F5E$ip86qbfqz3S7VI zLJ4>DV~X`l_Gi=U(_^!BQ!3JuQL2*}$o2QNq^e8|RmQSQT)H^P@I2@G2%nHCV-KI8 zeG3NJPXljZ4!IfFB4pcf^3-gKu^;sx{dzgiuLDW^0oJ$f`&nGMM(-l?cUk6B8f%@K zA!JNgNFNtZ*=|FW(4zfBEvX7H&sN}Y9z%9@-eIV8OZoHIm^C;>dwASTpZ}WL-=r2! zd`FS2`H!tcBItoACg3zTzD7{Vct&`fvr8@Op2q}dYIUi#e1fb(E!DpXA8Q=(h7j)2m-h3Xo0^IuT z0*w=_um7$59>xKO-Y<52$}QkERT4=o*dKL><2_ClYXX~+M>syB3mRt^6Fi-c0E2MN zng;=8>MB(UZ6yD7a_;FRR42sF9jTFxhzL!JhsqMNwmPVzOBxv0oJgmjqSw&c8{=1K9 z`(EZfdm1V+s^deS&);H1IjfiV5(Z4be6J4K_Bs{1=y4E+gC42&UY`U{<~8<84bJ1B z-bmTMk1?Yd6FAf1={)Ciewe1#Q~#UaUZT@RwQk%dJ-ks2?NQbyF>Qswpz1WBNp-D= zi;N6(sfZ=X79LW?K}^K)`xuABGhyANM{gjAC%8d`R1kDlkcHhbzSRe4xK9febn^K$ zPAKS0%w}z;*4Os3w=sxi@~MGA1{t0AgfNTY5+~r2NQb}e48m(MZVQ(}weyl?wf6qh z(c;|fholV~}O|SupfS+M z6v{Ta3ZGmXJm#Dbe&>vY7xd+tl|m7D`R*eDuf<@=$TlQOW(d%vO1GVR?$|n}+xN6_ z*VIuSXvf`K7lc>dMsxLsf1xnLHsvraNb0TLXj_!U!*UwTFX@g+wA|6Z@hT&N?s}2dQd``TUH2&KB7+%Ep?*>Pnx> z0*hajnPNMY@BO$9U%ihO-Hj-}v}qRG|Iyr*?aDXU57=9sF}(lSo?er1ia&C4_8MhM zJPxwi_cI*4Gg*J<8zoxY7q;A*IO|z?L>0PeZcxgNvDJi`j&DGe`?R5!c{}o@ulIgo z^CLNf(q6=oF>(&x4^n#1y}rF4JBNIe12%WIZfXB4C0&eR0xZp{Z>EN{HznHR$4tEp z4|V&TAAqOp9}%RNSO=5gc!hxw5%mExQmDq=5MGvBYg)NoX+Iq@$NZlp+Q3SUUPs3Ud2`{I{PTr5S$Hyr6R{HN zmgsMG3BhAClOBn<-`X-L|7hfU#W#gaxTjK|6`E5j3wlSn zoO)Kx)YTl}Iv&#aj=RIrl+_Y7b;)w_WX{w^5FVgR``SkB(L0)q;AR^~#4mh^Ax0mw z?FD4$1kNZh)3)#EubK|D%ssG>j&{i06LhWKULJSyzP$bWqF+J0Hu~!Vt&~cR-qpt@ zs3oL&lWHTmWLkk7fk>Wz;8V}*7VG07G4t-2m~0=q1Lk>ql0Kr3gGF&@E-uqPcN0xy zNWMFSI*>H6iokZ8&1EN154C4VIQGP5-zhL{;t~I^aC)$B7RCxDGB**9*Ufn2DoJo+ zDr+41F4GE8d%k{)5GB{K(62L}=tid#^GsQ0;Ej|$o+=}VB(_&VHfW=AOkk$nG8|i0 z7J_cI-cia!{L4|v%n=w*Em`ShO*cl=RzsFXM6J^I{Knk^hC*?u%Kyc7Q;*}u zHYSRwr!AT`Sq7!PJIRZ+tB9*9t7pb7q7m3!5^*1hdg8Y^`{o1O)~PJZh!1Dch8fX* z1P~s*kwRIf|!^oe=+3!vG1Al19Z*l52mI7pIm=0w3i65%>Q+X&cC&aEhg0H4OdGc_5#!v8i%$ruk6&2s{nn5>db1A?c2OQ+ zpLh2g|C2YNRdW9D>uOMhDd`LMv+fPYq}RyY<}9>y_rNwSO<`l2bqYBD;UjHrN{{nc zPkR~jH~1`3deV2LzNyuEN5L`2J}R$a&O;>qgM}L%;?KlYvm&Ksiu??0eL>S8CYQ@> zzks1uE#cOz6(&2rnnYz%!NfT`-mZ`QFUAw}@OyiRmSGo{JLkZagMY8L;cjH`gHo#M z_}bW9(Eg98@EgIwqQrJfw$#WZ6nJOeF-p&(U)(iK6m_&gCqeL0g~2)`^B}AdA=x)$ z8?&W>*eXR=tg2l6<>1$cC+Z4wNF7QQaZ3PtC_0{Ky2_m(IkH&gDdJCd1lU7%wU>`};DK%5tKo%c%yNIT?n^(5>c)CEM z>`<6^)Q{||MtIxJ6K8`2AnkQUxuvjcg%fKs+XwF27H(?~IU?X zS-rz!+NpW(0Nk5b_-X8h*z^K3vRfW?8w4{M8VA1*fu{wQ`qHZ5<_O601O+Duxcf(T z-q9+YGBXk5s|64*Ef|z$!H27_$p>z`X}rQNytu^HmnOz1Bju8ySJr~EUba{_7oWI` zkkm=uqD;iZT2T2pN1XsE^Ecsxp`wOX!3tOi2Fps!NxqT#~z1 zV72uL(A+*68tQk!)2&J1s82sWkwX1^WD@OJ;{);3W$jpy`Ln{4X$jx(($*+INM^=a zGJs;#y^4pHf`T8hQ4pS0L8mZr`?g~Ol0uu4=l-J!0|A%By!&9`T!0p0dpR;yP!Z?g zgVX&|`KsXEEeId`PCX6_vrS-=eS~n57>nXS6bhj&%yupAQiM8(`qt{1;1n#XPZk^Z z9lLUFOBKh#9@%MlnGa9|BQ;JxUS1)OX)M4Bd}K zPR~bo=Qj$xW8OYo4gP+svzyeu$c7zg>h(2=tl$4-(N?KRxRATH@M*Hfv+1FFl_mn; zE+k!i!7Ie3w=vjMi4whgq%>zQ;wDS9I20sY5;46DX<;~b%5=datOSjXH^PR3+Qr+d zkE4(dlF#EUcj()_5yVR)Xk<9uKse%3MtFsD9);vCMF(xv+NliLqUj~-RCtz>gv+Ed zC;1VrnC?`@Ud!`8?;J~`KuwWiGfp55JBzD2K-dSAh!JTMPCvL#jPf`!@Jvn9t6yB# zVyU7`%D)C0a|ow#@4lV?&?|wHLQTCc91GW5G}pf?82&Rxr~!=a~*MQUya%zS*GMc;-U zUO};n8~I$5o1`cQ<+77IKmR7sJWR)*lvyETQ(&c?sSB`0 zsu2@uTT5G!ASI%ywMc3Ev2Am@TO8EUBQ%xq=<3SW#NV(%}2%`F-W&COMS@_vpWc zI25J!tx`=_aOAS!Fnkm9JEO4mvv+{=D_=spPkjVluRC#K%;+I53L=szqlxaFSIZ+k(##NZ_U;Lo&l_y^3H033{Q(9K1pIaT z>RL?p)@}%jbC_9Y3torelzw7gp`h2%rzsB{+5&elLSwLhj5W_~SM}(qFk7n0;+<`I z#$QDnGgpPIa^RXnnX)@}{QUuTo(BRhu=sN9+nWlI6l7Pd=Z1zOJyI+H?~ z7_{iUm@>2C3P9AgOZwXU4RG?voae=P+-6T>7h#?!9_H8*hAKxqtP|=qWv%={>8=E6 zLe$apja)7~1H1-Y!SObGl&Q559s;pE{gumnuH}S*FKZ(&dgmDKGGS=zuQI&B*tnOY$A?P_l5gLWs8(BCU&5$5{HF93KIP808C3y6vIl$qb8QqbLJ_Pq8S61DNSG-V%0GJ zbi%RWd;32G_^(`mZLgwVIgn39CHGmxhcz7Uj8!3&gI4DZMFG)LsPWP`SzKJ{?45{u zg#}A^)O9>Amp4jje(4x%!xrn-%@}?@zuMf)*8Jd>C790T8a%%@DZkm^#l?CrgsM5% zKaB4f{4>|=)*97JRV;~$=8mytPp%&1~2+ZA9!lUu)oAWoP-+lB-&1cc=^PZ^g^r7nWEL@)`%(=6UXdx8? zTAx`AHAd%aaVb7HzH(8OLL@xG=L`vmvS1IzD@+tZT1zNfW9nPs97*TO%aq4!hekeF z>u$%FZ6+_O+>-!st4ZiDN4RBvHD3?m3`!XRZ47pyq~Uu(;njqy4XGelQ$w2xY+k8#My;(kyVPW^`QN@}Rg8Hi8So^TG8Dct5^Ya!+`%<( z*1MGTN9jIxyG{l^5^tFM=}0PWqem!~1heK{3so7EHo$it{%H8E5Q1~QTM&2t1?gji zo`RJbr#=@h?WI~LFY;G(J4aGMSIq5?lWglIiM}E_v0Z6|==r^ar_)6>Y|l-p7nF zHTWYA;P`f`csOI2v*R(CZZ1gj{~cez70K%J>tz@AtvCL}hXVe2GOsu3o_TtrDp@`+kZ3=7 zuj4TNo(*RoXRxTKuPvaTfd$?1q5mQ#v?UOeY|zVPNGt2T{eY|8e2_?;Pk+tx3>S2! zt2_U1|H~uC{VJ5Eyw$%rz>q182v##w2S2gU+gM+Nj%V@iHCCOG`_DKBfI)HRaqHdd zmR4(u?9)9o&=--`rO4U8HBcxpe)8q{QuRoy!SZ0!H|50oSTh_VYF?xq#aI+^ONsA7AMp+QOv?Vn+A5~2+ zxbS)}H-0RH*MQZnmadZqNd3T*>F!aa(Wu7?9i1nH7dGx*!2cxIKe!5`Y@DEAvN%$a za7i4#HN6Dp(3)?PFwTL>Tu??$k0}#t-vRe*OWu( z-6uUH0T`vfjz;?q;bIORF+HgZGXJghSOZau1_(VOVkkUh0oG6WNm&{nOSU-OYQKB& zTzg2szX9t82Y2n_XU4K?PKYSe$p^9#HjQnl$+0){e>w~QL0f-2$??8gGlt$gK>uWX zjLGB-Dgdtt>vEW$)ERa1#ZIl14to{-sg)Ax9E@`H3j0|Jzu0)N2lsRgw>BxEzY6J) zqW4pmXzv9ghz~_t2nVu%mo8j1yk*8Et&1m7r<{%N^ZLb4`G|*6RW74pu4;Z;tmvhJ8|*2_{?^ zpqwf~S7oqLz8Ebopn2E_sZX3OsN71{IsDjc#EpF==c4_uhE^5>}Y`$X8#J5)HwQ=M-0?T$b9k+xrs694SJjs;j`q=t?+K4MdcY=- z#jk?g%!$!oMfzNXw%b(!W{9b(11&*|&d1>4@2rd;NwU{D-;xSNv=XF&MA_>&q8~p~ zlUZl8QGU;`$pllm=<(A6t$O=6%5|zx_HIRxivLQz0>Cm!BQ~%lt&R_`9x((cde7CZ zdsqhhZ2jEc#qQvSL7vL(^P*4m-LOsBO?{aY^Xo8r5x@!dL)_vuZJZOd@uvuwTZwyo%hF_xa(69Z3 zacs=4_(!%M3vA7B>1DuPv4O0@#~^dmiS=ZiN=+MjIOb%wm{%GMX{#KjG@-bgQZE~X ziv#v~%7|alk1HStLl(KMogLB7fErCX@6w=<8?PZAwHSpt1H)kjA3zA_>M*P+<5@(w z_j$J+q!lYc%{>r8G&I4x%}{Tx*1{b7j?_ERyLMfxRCu$v*1|{`GP6XK){n`o@#8n6 zq6VeHHjkd!ften3!NTc(-7dJ(@r~)35@s?Lg1=4eQ)T#sn9!rMS89DQd<;}9VMGl7 zVs;g;xZ{J^)RbY-0$5RniqC(g+wGxc&HLU4eRu*f3-P*gbM*uhcRxhK{+*IwBy&Vc zQ}CbZP}wqGcj$|_f6}i33b0XQUbM zwVKSq7~H#UjfJ7Hx+P*!6e$1GlK`wum;6aVfBGs&-BX&Jmvq@zzXlGr1@h?0eBIF)mPsr zN`H!|24D0w+*83+$6LrX$XYA;ibqr59P_JY)%DFNOGl9zY|=9IWim$aq&9qE{3@2zAKZwh_xcnBXlk^RI? za6Cv)F9>bu-KR~=#%oP_hYruJ5p$vH=Cgw~hGp0HPBBfjrAgt^;sTyBs~zJ+%M#8B z?0zc+1z#|2bJHA);WGT)V$~mf(L2?bfARt~$&QZ+V~>HahI2-Wj}#w+_?l`T`bIR?Nlt@V?* zY?{U0DAOS>)}8;Phem_yIC+-*WIcWeo;|+G0pXD(>3mafl-&}jiiU01l$!hiR^^|5 z5`ZKqh#&HHH`Bi7eqHx`_DKku&=lm=kQ`+hK?I3oy*|ZseCN%{h~`nmlkcwGIAMWM zCj?!w_W6nA18cUto|CQWNWnC_bX1YQ5!n*bRGLfdS?-T23a`|vZf}zlah0#?NQLL_ z(peAD(GXrwUR->>FT?-5(3JtC<3Ej>$UTJY<%i*XcJ=eAZ^%2i!F#ecIFrzoOXTu?^cN@sFVRd=jf9mc8% zxsFVHOhG)4&sVoodJ9arnw0Mj3C1dzHGL9cE!+%kPGSaot+rc>qsV~YPW-_-LbPcA ztsi*lvdv($Lm||Y+NU1c`YVd&=65`&-$Lu7(pet{Q%q%-K&<+g#I@F7H_ERoZX!>8 zDkJH>4W{>7K8`D7cqyb#L{k1(pgP|3xc=^LM*nFROo=4xB)Jr~o-E~UMPz;_WS&ng z&j(5bycOdnUGo|TVE~>fimYp6ZLd(+Bt@+H$-k;>#gdD6uYZ0pe#K&INi^_8a$6%? z)`+l7MbX(AytqcF#^Dr`S<}$z7WM1jaN%A+5S4qJ#D`UDqb=zWOFh8V9&O@Ui%xp4 zk8!JHo|%6oVe`8W+XZlP_nW1@r_yJhOwmL8$sE)-QcD;2$AE^OI=VnTXYw3nxrl!^ zZ*jBCBAW91= za?|bh`o7UI3j&78&JUHlxHgcWu6RPSSq(BobEU^p*|G=glcr!o#E4&~;<||Rssp=K zvZ&b>G#3d>UWa9{(5x68K-K*jf$d;_wXd8zW=Ck*FHFd6=yqz?uN5!F&sbCQ@ ze7$!od`fRLtQzCzBA7!cFyx?OCLXTtZEj-O$ZMac9e@$5F6e+Adzdu?c2uKRfw&8( zb+sPK;}BEB-;RO%`iDfiUu~2$3OEF#DRYeNG0``2uKHEu#1y4S(8fy@d+gZ8G)3B+^kOo zcq1(@iPRPs>Y(&~642fOmip9Iz)FutW%cfF-nFQ--m_a=OdBp%M)8ohA;;p~hS#e1 zy7Ax8>EjmP)=P(XcyRqU%gqUi&eit{oJB0 zRKQ!81vwBU?;6~4X1wdyvH5eUObJjeOOUn%vT0!Kq>Vh*i_VSyDyU-s`XFv=&nn;~ zgU@b|j4+O>B)13`cPL6bj53!@y14yu>Qx(^8DtF&2Q2>(#rKD3c2RSD68fn-M6@>e z*LBQxMX&Ev4ZU#J|Ef4r6o0|duQtO$h7byQ8*RoJW{Z@$5q}T?@=-6rRyB6=uamlr zWj%N$nXiQEg5OXy#@_+R$P3JIu?+Tk(n8P%l3lyiAz4>_OP;SAzaJ2I;T7q`t(IO3LK_r+js7A|#v&%3eC z=^1*r>30P{Ih2>Ljggu~BXA0$v+zGgAy}I<2mig6n+5kFU&HOOC#XMRVBJ`}MTg96 zZ7cpjvh-jKyRJuEpt5pCt&9ERV6V!TFCvl@H*!}U2+=iAb>Z*g&u>Q3F9Y=}j2UEO z5nj2KyP?xH^m(}LObRsE-795^`lQrrkY>17mP^euWFkoifrte z9QRI}U$lo-)mEJb`|kl~Uef0?G8LETYu0-UlX#oqw?oeTE-OJhzw{IYz;g4qIY?(OSqELLsHApo@L(b@ zbIs*!f{7=S?a0{9j|V}8$!IS)7nsMLiw0|{@1bf{vaXe+KR?c^#6#`aKs_|#kXQ>G z+V?E;#jaDgQ}1Y8AM)05ZFo+rHErg=;*540=tMVmDaSp>!c{C=_H6K^2`;qxqa8Br z^&VeoKy-sa=~d={`Q~q8wqfK?Uazh=L#F+sIeH?pj+ApVOT|{doQJ0Z`Vy6(sftef zn%Qyk2YbgG5bW-RE{7vE9*O#-_NSKB0+7_ z9w|d^hc2;6--`b}mP1~6miVwq?XxS5sxoGJY7whG4(c2fr&@;a%m4A{M8ZEr*Ufp{ zz-i-rThJi$C@j-^Zx5^r`N#9x?)182Sx}YYe|{^#sF#M#I&PfjqvVL%Fv`@R&zfgH zSQwVNeR4Cc;DiodEgMl;8vk}{Ly*)gKJ0 z7sB3K5R<=|a7@#*5jNIM&bQHvu7K>Pn?*TO2CjN;F5(1Z)B!@Y4l7ni~O3tbfg%1>h3NP-xC>Zg5r9I7-E!+K31_Y)(TSu`mt2QQ6iGyTr^9w^Un}XdQZ}?y6o27+{d22y;PKjwUUQ>gN2IWMx zNz}&gfT;WTQa6Sf^WTy&LY%l-Z@>35^588?WB>@u$XarbFYe^k1ZfBH5260xu{DSN zVwSlr*2cK~6-{30R?A@iPVmm@yQU2~77y(G=grL$)N)Tg`Zg>f5Ilv#(mwdJbm>x* z{wt8Q3|a$m;7qyT?dIUdBQ~eTyVtu+41llR>g~a^@bNglV?PhQCxN&CG0gF}i=Uzt z=-4G(r0JsRDiP?ootNzm1zWuIpt8H66ydj(yeK|Bum-w^aK35P)P*+84?P~x-knZ9 zCG$$C0HC}~V~wEtUqJ$hPWq0}-ZUG<(ip5GV4WK%Y!>%PvoEZ%Gx7|%OXdg4lsV?s z_!rYT2O%gqsN&nls*56q0XTQ<-#-44`I{~2d53(eU{@(yW(em|ND_fP`o-jMS51N; zZO}xlEo{T|&E+{Iy_Z|k`Xk{l2lzqruXTzg+Hj#Zj~u^Gik){xJ5xFLDZx-ohe!4BMzDn0Bo{<+qt#k4|u zd_kEXOLbU69pn7b{)KDwZ_3mIb$z9fDY6rieZ6qL`VVVEXA?TLV4 zIAhqyzg`^PIf#EiWX2q;-Z)!p6GAW`i&gvW4oG4dEV%6O8MZ$uEqtdrTa7J*^ zYfu&8vCqrAnjJZxJOZUK)5j-JJQjjx?cg44P4`Rc!W*Qj*tsUWxK?fL3JiwB(-Y;~ z;P_rC9G|WD2=j>T;*$QpBHlJLgSu4nJBr$9yILUe>xMWUsna6{kJ+}WbZ^7Oys~Hl zg55eNU;JRWV7B6wm`nj>Rya@qKuuMZ&1PY>+t1&xL*mIT;B}k)D(5VpK%(tCOt?x( zLG6N84K}X5qa-5(EQO&gaMx$s&gjP`{^^_Ypu1;UA$^cX4WnCyvTDVM^j=fekBVsHa)6FiNc5|ToO7*WG^1`$T(Xw z<emejf4^dQP<@oX>v%-+WK7e8ed;wIkB61zO?>F zOiqTf82;Mpqb#%R^<1gJ_$p))#tKN>g2l9IZKOrC zh#@C|_WW)`CF}fW%w#p7?F%_Ysfd&R*8cV-$nMHYhqt&iIXj-K2OKxk4-6FerUx&WB)Ki=?P5ScBaDu@TuP>~eL- z9lbKL@83NJu3)=Cta_C|5Kj#9^-Qe|o0x-sPDZ~F*zSIWF*SsCjx>P{>qE~Z4qXH9 z>bSIuz~ht`!KR?^JIUY2S?Zy&>Mtw~3Ge5Ca9O78q(<9Ld7(=8sjr_!%;{%q4|bgB zd^2Y5<-uA{=~;MR0LluQFq9MWzBEia=0i&GO3O3@KM`vlMWW=H8NH_>+4hWQ;i8R? zXj`Uy7DXwAliUJ4?4cUuZTbxMk4FUj4^5JlnzXE5vfbweO6Tq@Np)C?en6xL1kh9! zFbUGN82Tc6Sy>$MU| zswfbKK7II~UXo{_&Mx71id+QBv7r6u_Yz+ZRAZi&OwY?A)UU86UaTQ#IqIqqR@2QN zbiY`maGEXReWsAt)*gZIrejLTImE$27jE!E!LAc~PqLeZOP8fQpB9LUO|R)^na5?V zL)C8&4ACsI8h`Bqx6@FO;F;vvYHb~Zowl2-V-tKA$S$piqp8Y@KzMxv_(eGGIhx3j zcrw8Y{Mc4&8Ks$({P_Dl2q2327=3ia`58ku0etq$Orl9?3+7Po!UK2ID+1E=PfH8o z@pi|8TexL33WJ7S>;P@33G=*@{|0!*_NyR^2n_$La9?!FbW$7H=b7JHQ9MVrwHwAS zz8r$*=QFI2Qm4A=bxX&g;$df`uGMFXQjHh-rA)@`Tep}@$N6r>f8(y3YV85hJHEm! zUIh`}q+FgSx!b!JecT0xsVWXms8^Pt-hFJi&l|1?l*oD)U7Ldh&!7~ME>f{IW$11J zxy-u+-0mnTK4}G(Xg?VD1XBYH$gAQ2d)P-0Ps*F=dmypjBwPepAuH&~mX1|_Bmb!n zS%i6o_S;}P1Z!gerh^>D`~xyF4S~y}LP$)Y{rjO+5sZg7aOPdv zDBXf?7gyMV+9w_FEMrBrRsuQng>>;~ux&Oa=HltfWaLb!*i zq3Y8tKfay>`F`?ZigW)g&1&2Q)&bCeee#vzqEoR%R-z|x95f)bLv>pWB|`^UketoC z;NV_4{pX(;Y%Y8vS#Y|5lM%A&dAuR_@vKE$%5i2yHHY4Y$(G%awI#pi4KH@()Zl#N ztny(ghaj4S=C`IsD5w>I6@WFa%IH9cImfrCvsN=4na6^Yp*65Qb%(=43J6+Hbl%1= z|KYJ&&F=(jd{KCj*OTx?x|KY62?YoH#uoYCjl!|N_Wu2r7sta`dxas^{iYM0dE5l| zqjr?lE;GMyk*eDwT+;s%k2}LHe-bh4X9rLO-V(Tva&tRtYkLtqNoWc3`Y^Gbytw<6 z+$=U4)=8HmS0wESG;7+h`OJyD5P-j0pYeA9Ot78X#7^l=&W(wWl%k9d^36?8Kmcg8 zm1oO+5#1#GzM8```FYcwDLdIc>-oh?=|!(2YFAb6UDPi>O{{TWb9E$(| From 977163ae54603d3cf667f1c74dc8d9984101a956 Mon Sep 17 00:00:00 2001 From: kingofkosmos Date: Fri, 29 Sep 2017 05:46:34 +0300 Subject: [PATCH 085/136] Fixes MMI buckled-warning (#31061) * Fixes MMI having a buckled-warning when trying to move. * Comment added. --- code/modules/mob/living/brain/MMI.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 65a3fd253e..83dd63cc74 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -199,6 +199,8 @@ else to_chat(user, "The MMI indicates the brain is active.") +/obj/item/device/mmi/relaymove() + return //so that the MMI won't get a warning about not being able to move if it tries to move /obj/item/device/mmi/syndie name = "Syndicate Man-Machine Interface" From 2309a729c7e7f8a03522d22aad41212f7f93b296 Mon Sep 17 00:00:00 2001 From: oranges Date: Fri, 29 Sep 2017 15:48:08 +1300 Subject: [PATCH 087/136] Merge pull request #31076 from AutomaticFrenzy/elseif Fix dangling #elseif in list helpers --- code/__HELPERS/_lists.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 540ec9fb63..e5478adff4 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -474,7 +474,7 @@ #error Remie said that lummox was adding a way to get a lists #error contents via list.values, if that is true remove this #error otherwise, update the version and bug lummox -#elseif +#endif //Flattens a keyed list into a list of it's contents /proc/flatten_list(list/key_list) if(!islist(key_list)) From f0c684c15ee4e0747e3376066caf6756943ff94d Mon Sep 17 00:00:00 2001 From: kingofkosmos Date: Fri, 29 Sep 2017 05:51:31 +0300 Subject: [PATCH 089/136] Alt-clicking descriptions when examining --- .../miniantags/abduction/abduction_gear.dm | 2 +- code/game/machinery/aug_manipulator.dm | 3 + code/game/machinery/deployable.dm | 6 +- code/game/objects/items/devices/PDA/PDA.dm | 7 + code/game/objects/items/devices/gps.dm | 7 +- .../objects/items/devices/radio/headset.dm | 8 +- code/game/objects/items/extinguisher.dm | 192 ++++++++++++++++++ code/game/objects/items/stacks/stack.dm | 1 + code/game/objects/items/storage/fancy.dm | 18 +- code/game/objects/items/storage/lockbox.dm | 7 +- code/game/objects/items/twohanded.dm | 7 +- code/game/objects/structures/extinguisher.dm | 4 + code/game/objects/structures/reflector.dm | 4 + .../atmospherics/machinery/atmosmachinery.dm | 6 +- code/modules/clothing/glasses/glasses.dm | 5 + code/modules/clothing/head/jobs.dm | 6 +- code/modules/games/cas.dm | 4 +- code/modules/mining/abandoned_crates.dm | 2 +- .../computers/item/laptop.dm | 5 + .../computers/machinery/console_presets.dm | 10 +- code/modules/paperwork/paper.dm | 12 +- .../projectiles/guns/ballistic/shotgun.dm | 4 + 22 files changed, 301 insertions(+), 19 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 8c6bf1a8aa..36168a58d2 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -328,7 +328,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} return /obj/item/paper/guides/antag/abductor/AltClick() - return + return //otherwise it would fold into a paperplane. #define BATON_STUN 0 #define BATON_SLEEP 1 diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm index ff072fd010..299b0500ce 100644 --- a/code/game/machinery/aug_manipulator.dm +++ b/code/game/machinery/aug_manipulator.dm @@ -11,6 +11,9 @@ var/initial_icon_state var/static/list/style_list_icons = list("standard" = 'icons/mob/augmentation/augments.dmi', "engineer" = 'icons/mob/augmentation/augments_engineer.dmi', "security" = 'icons/mob/augmentation/augments_security.dmi', "mining" = 'icons/mob/augmentation/augments_mining.dmi') +/obj/machinery/aug_manipulator/examine(mob/user) + ..() + to_chat(user, "Alt-click to eject the limb.") /obj/machinery/aug_manipulator/Initialize() initial_icon_state = initial(icon_state) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 333aa6ac55..f0e1e8a18a 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -110,13 +110,17 @@ /obj/item/grenade/barrier name = "barrier grenade" - desc = "Instant cover. Alt+click to toggle modes." + desc = "Instant cover." icon = 'icons/obj/grenade.dmi' icon_state = "flashbang" item_state = "flashbang" actions_types = list(/datum/action/item_action/toggle_barrier_spread) var/mode = SINGLE +/obj/item/grenade/barrier/examine(mob/user) + ..() + to_chat(user, "Alt-click to toggle modes.") + /obj/item/grenade/barrier/AltClick(mob/living/user) if(!istype(user) || user.incapacitated()) return diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index eb521d8510..43f6d95910 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -58,6 +58,13 @@ GLOBAL_LIST_EMPTY(PDAs) var/obj/item/inserted_item //Used for pen, crayon, and lipstick insertion or removal. Same as above. var/overlays_x_offset = 0 //x offset to use for certain overlays +/obj/item/device/pda/examine(mob/user) + ..() + if(!id && !inserted_item) + return + else + to_chat(user, "Alt-click to remove contents.") + /obj/item/device/pda/Initialize() . = ..() if(fon) diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 55c8bb5252..6ba8425392 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -1,7 +1,7 @@ GLOBAL_LIST_EMPTY(GPS_list) /obj/item/device/gps name = "global positioning system" - desc = "Helping lost spacemen find their way through the planets since 2016. Alt+click to toggle power." + desc = "Helping lost spacemen find their way through the planets since 2016." icon = 'icons/obj/telescience.dmi' icon_state = "gps-c" w_class = WEIGHT_CLASS_SMALL @@ -15,6 +15,9 @@ GLOBAL_LIST_EMPTY(GPS_list) var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user. var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown +/obj/item/device/gps/examine(mob/user) + ..() + to_chat(user, "Alt-click to switch it [tracking ? "off":"on"].") /obj/item/device/gps/Initialize() . = ..() @@ -209,4 +212,4 @@ GLOBAL_LIST_EMPTY(GPS_list) clear() tagged = null STOP_PROCESSING(SSfastprocess, src) - . = ..() \ No newline at end of file + . = ..() diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 4c309f4aa1..9817614e24 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -1,6 +1,6 @@ /obj/item/device/radio/headset name = "radio headset" - desc = "An updated, modular intercom that fits over the head. Takes encryption keys. \nTo speak on the general radio frequency, use ; before speaking." + desc = "An updated, modular intercom that fits over the head. Takes encryption keys." icon_state = "headset" item_state = "headset" materials = list(MAT_METAL=75) @@ -11,6 +11,12 @@ var/obj/item/device/encryptionkey/keyslot2 = null dog_fashion = null +/obj/item/device/radio/headset/examine(mob/user) + ..() + to_chat(user, "To speak on the general radio frequency, use ; before speaking.") + if (command) + to_chat(user, "Alt-click to toggle the high-volume mode.") + /obj/item/device/radio/headset/Initialize() . = ..() recalculateChannels() diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 05ef0220de..2e6ec98606 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/item/extinguisher name = "fire extinguisher" desc = "A traditional red fire extinguisher." @@ -186,3 +187,194 @@ theturf.MakeSlippery(min_wet_time = 10, wet_time_to_add = 5) user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] using its release valve.") +======= +/obj/item/extinguisher + name = "fire extinguisher" + desc = "A traditional red fire extinguisher." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "fire_extinguisher0" + item_state = "fire_extinguisher" + hitsound = 'sound/weapons/smash.ogg' + flags_1 = CONDUCT_1 + throwforce = 10 + w_class = WEIGHT_CLASS_NORMAL + throw_speed = 2 + throw_range = 7 + force = 10 + materials = list(MAT_METAL=90) + attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") + dog_fashion = /datum/dog_fashion/back + resistance_flags = FIRE_PROOF + var/max_water = 50 + var/last_use = 1 + var/safety = TRUE + var/refilling = FALSE + var/sprite_name = "fire_extinguisher" + var/power = 5 //Maximum distance launched water will travel + var/precision = 0 //By default, turfs picked from a spray are random, set to 1 to make it always have at least one water effect per row + var/cooling_power = 2 //Sets the cooling_temperature of the water reagent datum inside of the extinguisher when it is refilled + +/obj/item/extinguisher/mini + name = "pocket fire extinguisher" + desc = "A light and compact fibreglass-framed model fire extinguisher." + icon_state = "miniFE0" + item_state = "miniFE" + hitsound = null //it is much lighter, after all. + flags_1 = null //doesn't CONDUCT_1 + throwforce = 2 + w_class = WEIGHT_CLASS_SMALL + force = 3 + materials = list() + max_water = 30 + sprite_name = "miniFE" + dog_fashion = null + +/obj/item/extinguisher/New() + ..() + create_reagents(max_water) + reagents.add_reagent("water", max_water) + +/obj/item/extinguisher/attack_self(mob/user) + safety = !safety + src.icon_state = "[sprite_name][!safety]" + src.desc = "The safety is [safety ? "on" : "off"]." + to_chat(user, "The safety is [safety ? "on" : "off"].") + return + +/obj/item/extinguisher/attack(mob/M, mob/user) + if(user.a_intent == INTENT_HELP && !safety) //If we're on help intent and going to spray people, don't bash them. + return FALSE + else + return ..() + +/obj/item/extinguisher/attack_obj(obj/O, mob/living/user) + if(AttemptRefill(O, user)) + refilling = TRUE + return FALSE + else + return ..() + +/obj/item/extinguisher/examine(mob/user) + ..() + if(reagents.total_volume) + to_chat(user, "It contains [round(reagents.total_volume)] units.") + to_chat(user, "Alt-click to empty it.") + else + to_chat(user, "It is empty.") + +/obj/item/extinguisher/proc/AttemptRefill(atom/target, mob/user) + if(istype(target, /obj/structure/reagent_dispensers/watertank) && target.Adjacent(user)) + var/safety_save = safety + safety = TRUE + if(reagents.total_volume == reagents.maximum_volume) + to_chat(user, "\The [src] is already full!") + safety = safety_save + return 1 + var/obj/structure/reagent_dispensers/watertank/W = target + var/transferred = W.reagents.trans_to(src, max_water) + if(transferred > 0) + to_chat(user, "\The [src] has been refilled by [transferred] units.") + playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) + for(var/datum/reagent/water/R in reagents.reagent_list) + R.cooling_temperature = cooling_power + else + to_chat(user, "\The [W] is empty!") + safety = safety_save + return 1 + else + return 0 + +/obj/item/extinguisher/afterattack(atom/target, mob/user , flag) + // Make it so the extinguisher doesn't spray yourself when you click your inventory items + if (target.loc == user) + return + //TODO; Add support for reagents in water. + if(refilling) + refilling = FALSE + return + if (!safety) + if (src.reagents.total_volume < 1) + to_chat(usr, "\The [src] is empty!") + return + + if (world.time < src.last_use + 12) + return + + src.last_use = world.time + + playsound(src.loc, 'sound/effects/extinguish.ogg', 75, 1, -3) + + var/direction = get_dir(src,target) + + if(user.buckled && isobj(user.buckled) && !user.buckled.anchored) + spawn(0) + var/obj/B = user.buckled + var/movementdirection = turn(direction,180) + step(B, movementdirection) + sleep(1) + step(B, movementdirection) + sleep(1) + step(B, movementdirection) + sleep(1) + step(B, movementdirection) + sleep(2) + step(B, movementdirection) + sleep(2) + step(B, movementdirection) + sleep(3) + step(B, movementdirection) + sleep(3) + step(B, movementdirection) + sleep(3) + step(B, movementdirection) + + else user.newtonian_move(turn(direction, 180)) + + var/turf/T = get_turf(target) + var/turf/T1 = get_step(T,turn(direction, 90)) + var/turf/T2 = get_step(T,turn(direction, -90)) + var/list/the_targets = list(T,T1,T2) + if(precision) + var/turf/T3 = get_step(T1, turn(direction, 90)) + var/turf/T4 = get_step(T2,turn(direction, -90)) + the_targets = list(T,T1,T2,T3,T4) + + for(var/a=0, a<5, a++) + spawn(0) + var/obj/effect/particle_effect/water/W = new /obj/effect/particle_effect/water(get_turf(src)) + var/turf/my_target = pick(the_targets) + if(precision) + the_targets -= my_target + var/datum/reagents/R = new/datum/reagents(5) + if(!W) return + W.reagents = R + R.my_atom = W + if(!W || !src) return + src.reagents.trans_to(W,1) + for(var/b=0, bYou quietly empty out \the [src] using its release valve.") +>>>>>>> 086d636... Alt-clicking descriptions when examining (#30988) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index cc718be2bd..3a79ce23db 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -76,6 +76,7 @@ to_chat(user, "There are [get_amount()] in the stack.") else to_chat(user, "There is [get_amount()] in the stack.") + to_chat(user, "Alt-click to take a custom amount.") /obj/item/stack/proc/get_amount() if(is_cyborg) diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 883641d43b..b5417e8f8e 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -125,13 +125,21 @@ icon_type = "cigarette" spawn_type = /obj/item/clothing/mask/cigarette/space_cigarette +/obj/item/storage/fancy/cigarettes/examine(mob/user) + ..() + to_chat(user, "Alt-click to extract contents.") + /obj/item/storage/fancy/cigarettes/AltClick(mob/user) - if(user.get_active_held_item()) + if(user.stat || user.restrained()) return - for(var/obj/item/lighter/lighter in src) - remove_from_storage(lighter, user.loc) - user.put_in_active_hand(lighter) - break + var/obj/item/clothing/mask/cigarette/W = locate(/obj/item/clothing/mask/cigarette) in contents + if(W && contents.len > 0) + remove_from_storage(W, user) + user.put_in_hands(W) + contents -= W + to_chat(user, "You take a [icon_type] out of the pack.") + else + to_chat(user, "There are no [icon_type]s left in the pack.") /obj/item/storage/fancy/cigarettes/update_icon() if(fancy_open || !contents.len) diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 346e9ba409..385a069c00 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -123,6 +123,11 @@ icon_broken = "medalbox+b" can_hold = list(/obj/item/clothing/accessory/medal) +/obj/item/storage/lockbox/medal/examine(mob/user) + ..() + if(!locked) + to_chat(user, "Alt-click to [open ? "close":"open"] it.") + /obj/item/storage/lockbox/medal/AltClick() if(!locked) open = (open ? FALSE : TRUE) @@ -179,4 +184,4 @@ /obj/item/storage/lockbox/medal/sci/PopulateContents() for(var/i in 1 to 3) - new /obj/item/clothing/accessory/medal/plasma/nobel_science(src) \ No newline at end of file + new /obj/item/clothing/accessory/medal/plasma/nobel_science(src) diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index 6668937003..048184578a 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -427,6 +427,11 @@ var/obj/item/grenade/explosive = null var/war_cry = "AAAAARGH!!!" +/obj/item/twohanded/spear/examine(mob/user) + ..() + if(explosive) + to_chat(user, "Alt-click to set your war cry.") + /obj/item/twohanded/spear/update_icon() if(explosive) icon_state = "spearbomb[wielded]" @@ -475,7 +480,7 @@ if(G) explosive = G name = "explosive lance" - desc = "A makeshift spear with [G] attached to it. Alt+click on the spear to set your war cry!" + desc = "A makeshift spear with [G] attached to it." update_icon() // CHAINSAW diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index f0ff566b60..e61e1a1870 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -10,6 +10,10 @@ var/obj/item/extinguisher/stored_extinguisher var/opened = 0 +/obj/structure/extinguisher_cabinet/examine(mob/user) + ..() + to_chat(user, "Alt-click to [opened ? "close":"open"] it.") + /obj/structure/extinguisher_cabinet/New(loc, ndir, building) ..() if(building) diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 338979cf4d..5b758377c4 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -13,6 +13,10 @@ var/buildstacktype = /obj/item/stack/sheet/metal var/buildstackamount = 0 +/obj/structure/reflector/examine(mob/user) + ..() + to_chat(user, "Alt-click to adjust its direction.") + /obj/structure/reflector/bullet_act(obj/item/projectile/P) var/turf/reflector_turf = get_turf(src) var/turf/reflect_turf diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 585b4c4550..ce68eecdc9 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -34,6 +34,11 @@ Pipelines + Other Objects -> Pipe network var/device_type = 0 var/list/obj/machinery/atmospherics/nodes +/obj/machinery/atmospherics/examine(mob/living/user) + ..() + if(is_type_in_list(src, GLOB.ventcrawl_machinery) && user.ventcrawler) + to_chat(user, "Alt-click to crawl through it.") + /obj/machinery/atmospherics/New(loc, process = TRUE) nodes = new(device_type) if (!armor) @@ -300,4 +305,3 @@ Pipelines + Other Objects -> Pipe network //Used for certain children of obj/machinery/atmospherics to not show pipe vision when mob is inside it. /obj/machinery/atmospherics/proc/can_see_pipes() return TRUE - diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 5dd0a34c1e..cf7dc9eb5f 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -3,6 +3,11 @@ materials = list(MAT_GLASS = 250) var/glass_colour_type = null //colors your vision when worn +/obj/item/clothing/glasses/examine(mob/user) + ..() + if(glass_colour_type && ishuman(user)) + to_chat(user, "Alt-click to toggle its colors.") + /obj/item/clothing/glasses/visor_toggling() ..() if(visor_vars_to_toggle & VISOR_VISIONFLAGS) diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 8982e553f6..bbc0ada952 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -82,6 +82,10 @@ pockets = /obj/item/storage/internal/pocket/small/detective dog_fashion = /datum/dog_fashion/head/detective +/obj/item/clothing/head/fedora/det_hat/examine(mob/user) + ..() + to_chat(user, "Alt-click to take a candy corn.") + /obj/item/clothing/head/fedora/det_hat/AltClick() ..() if(ismob(loc)) @@ -172,4 +176,4 @@ /obj/item/clothing/head/fedora/curator name = "treasure hunter's fedora" desc = "You got red text today kid, but it doesn't mean you have to like it." - icon_state = "curator" \ No newline at end of file + icon_state = "curator" diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm index 675fe328af..ecdc1a641f 100644 --- a/code/modules/games/cas.dm +++ b/code/modules/games/cas.dm @@ -104,12 +104,14 @@ var/buffertext = "A funny bit of text." /obj/item/toy/cards/singlecard/cas/examine(mob/user) + ..() if (flipped) to_chat(user, "The card is face down.") else if (blank) to_chat(user, "The card is blank. Write on it with a pen.") else to_chat(user, "The card reads: [name]") + to_chat(user, "Alt-click to flip it.") /obj/item/toy/cards/singlecard/cas/Flip() set name = "Flip Card" @@ -145,4 +147,4 @@ return name = cardtext buffertext = cardtext - blank = 0 \ No newline at end of file + blank = 0 diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 4db42b6933..6c445c9ceb 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -184,7 +184,7 @@ /obj/structure/closet/crate/secure/loot/AltClick(mob/living/user) if(!user.canUseTopic(src)) return - attack_hand(user) + attack_hand(user) //this helps you not blow up so easily by overriding unlocking which results in an immediate boom. /obj/structure/closet/crate/secure/loot/attackby(obj/item/W, mob/user) if(locked) diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index b6cf404248..1618b68478 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -21,6 +21,11 @@ var/w_class_open = WEIGHT_CLASS_BULKY var/slowdown_open = TRUE +/obj/item/device/modular_computer/laptop/examine(mob/user) + ..() + if(screen_on) + to_chat(user, "Alt-click to close it.") + /obj/item/device/modular_computer/laptop/Initialize() . = ..() diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index bc188485bc..25fa05ef1e 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -44,6 +44,10 @@ desc = "A stationary computer. This one comes preloaded with research programs." _has_ai = 1 +/obj/machinery/modular_computer/console/preset/research/examine(mob/user) + ..() + to_chat(user, "Alt-click to eject the intelliCard.") + /obj/machinery/modular_computer/console/preset/research/install_programs() var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] hard_drive.store_file(new/datum/computer_file/program/ntnetmonitor()) @@ -59,6 +63,10 @@ _has_id_slot = 1 _has_printer = 1 +/obj/machinery/modular_computer/console/preset/command/examine(mob/user) + ..() + to_chat(user, "Alt-click [src] to eject the identification card.") + /obj/machinery/modular_computer/console/preset/command/install_programs() var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] hard_drive.store_file(new/datum/computer_file/program/chatclient()) @@ -72,4 +80,4 @@ /obj/machinery/modular_computer/console/preset/civilian/install_programs() var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] hard_drive.store_file(new/datum/computer_file/program/chatclient()) - hard_drive.store_file(new/datum/computer_file/program/nttransfer()) \ No newline at end of file + hard_drive.store_file(new/datum/computer_file/program/nttransfer()) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index e3d6154606..47c7b81e26 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -64,6 +64,8 @@ /obj/item/paper/examine(mob/user) ..() + to_chat(user, "Alt-click to fold it.") + var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper) assets.send(user) @@ -79,7 +81,7 @@ user << browse("[name][stars(info)]
[stamps]", "window=[name]") onclose(user, "[name]") else - to_chat(user, "It is too far away.") + to_chat(user, "You're too far away to read it!") /obj/item/paper/verb/rename() @@ -101,10 +103,12 @@ name = "paper[(n_name ? text("- '[n_name]'") : null)]" add_fingerprint(usr) + /obj/item/paper/suicide_act(mob/user) user.visible_message("[user] scratches a grid on [user.p_their()] wrist with the paper! It looks like [user.p_theyre()] trying to commit sudoku...") return (BRUTELOSS) + /obj/item/paper/attack_self(mob/user) user.examinate(src) if(rigged && (SSevents.holidays && SSevents.holidays[APRIL_FOOLS])) @@ -399,4 +403,8 @@ return /obj/item/paper/crumpled/bloody - icon_state = "scrap_bloodied" \ No newline at end of file +<<<<<<< HEAD + icon_state = "scrap_bloodied" +======= + icon_state = "scrap_bloodied" +>>>>>>> 086d636... Alt-clicking descriptions when examining (#30988) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 71bdce7f28..bbaf20689c 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -213,6 +213,10 @@ var/toggled = FALSE var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine +/obj/item/gun/ballistic/shotgun/automatic/dual_tube/examine(mob/user) + ..() + to_chat(user, "Alt-click to pump it.") + /obj/item/gun/ballistic/shotgun/automatic/dual_tube/Initialize() . = ..() if (!alternate_magazine) From a01540e39b63c8429bd1dcd6e670069df868580d Mon Sep 17 00:00:00 2001 From: oranges Date: Fri, 29 Sep 2017 15:52:40 +1300 Subject: [PATCH 090/136] Merge pull request #31074 from pubby/ninjaoutfit Ninja outfit code cleanup --- code/datums/antagonists/ninja.dm | 32 ++----------------------------- code/datums/outfit.dm | 4 ++-- code/modules/ninja/ninja_event.dm | 4 ---- code/modules/ninja/outfit.dm | 25 ++++++++++++++++++++++++ tgstation.dme | 1 + 5 files changed, 30 insertions(+), 36 deletions(-) create mode 100644 code/modules/ninja/outfit.dm diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm index 230a4d64e4..00dc953e90 100644 --- a/code/datums/antagonists/ninja.dm +++ b/code/datums/antagonists/ninja.dm @@ -19,36 +19,8 @@ ..(new_owner) helping_station = rand(0,1) -/datum/antagonist/ninja/proc/equip_space_ninja(mob/living/carbon/human/H = owner.current, safety=0)//Safety in case you need to unequip stuff for existing characters. - if(safety) - qdel(H.w_uniform) - qdel(H.wear_suit) - qdel(H.wear_mask) - qdel(H.head) - qdel(H.shoes) - qdel(H.gloves) - - var/obj/item/clothing/suit/space/space_ninja/theSuit = new(H) - var/obj/item/dash/energy_katana/EK = new(H) - theSuit.energyKatana = EK - - H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_ears) - H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/space_ninja(H), slot_shoes) - H.equip_to_slot_or_del(theSuit, slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(H), slot_gloves) - H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(H), slot_head) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/space_ninja(H), slot_wear_mask) - H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(H), slot_glasses) - H.equip_to_slot_or_del(EK, slot_belt) - H.equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(H), slot_l_store) - H.equip_to_slot_or_del(new /obj/item/tank/internals/emergency_oxygen(H), slot_s_store) - H.equip_to_slot_or_del(new /obj/item/tank/jetpack/carbondioxide(H), slot_back) - theSuit.randomize_param() - - var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H) - E.implant(H) - return 1 +/datum/antagonist/ninja/proc/equip_space_ninja(mob/living/carbon/human/H = owner.current) + return H.equipOutfit(/datum/outfit/ninja) /datum/antagonist/ninja/proc/addMemories() owner.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!") diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 8d4413171d..3c3ab905ea 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -102,10 +102,10 @@ if(implants) for(var/implant_type in implants) var/obj/item/implant/I = new implant_type(H) - I.implant(H, null, silent=TRUE) + I.implant(H, null, TRUE) H.update_body() - return 1 + return TRUE /datum/outfit/proc/apply_fingerprints(mob/living/carbon/human/H) if(!istype(H)) diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index 8ff3652367..a3184cbb20 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -71,13 +71,9 @@ Contents: var/datum/antagonist/ninja/ninjadatum = add_ninja(Ninja) ninjadatum.equip_space_ninja() - Ninja.internal = Ninja.s_store - Ninja.update_internals_hud_icon(1) - if(Ninja.mind != Mind) //something has gone wrong! throw EXCEPTION("Ninja created with incorrect mind") - SSticker.mode.update_ninja_icons_added(Ninja) spawned_mobs += Ninja message_admins("[key_name_admin(Ninja)] has been made into a ninja by an event.") diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm new file mode 100644 index 0000000000..4ec9cde23c --- /dev/null +++ b/code/modules/ninja/outfit.dm @@ -0,0 +1,25 @@ +/datum/outfit/ninja + name = "Space Ninja" + uniform = /obj/item/clothing/under/color/black + suit = /obj/item/clothing/suit/space/space_ninja + glasses = /obj/item/clothing/glasses/night + mask = /obj/item/clothing/mask/gas/space_ninja + head = /obj/item/clothing/head/helmet/space/space_ninja + ears = /obj/item/device/radio/headset + shoes = /obj/item/clothing/shoes/space_ninja + gloves = /obj/item/clothing/gloves/space_ninja + back = /obj/item/tank/jetpack/carbondioxide + l_pocket = /obj/item/grenade/plastic/x4 + r_pocket = /obj/item/tank/internals/emergency_oxygen + internals_slot = slot_r_store + belt = /obj/item/dash/energy_katana + implants = list(/obj/item/implant/explosive) + + +/datum/outfit/ninja/post_equip(mob/living/carbon/human/H) + if(istype(H.wear_suit, suit)) + var/obj/item/clothing/suit/space/space_ninja/S = H.wear_suit + if(istype(H.belt, belt)) + S.energyKatana = H.belt + S.randomize_param() + diff --git a/tgstation.dme b/tgstation.dme index 525e30ca66..5e990d33b5 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1904,6 +1904,7 @@ #include "code\modules\ninja\energy_katana.dm" #include "code\modules\ninja\ninja_event.dm" #include "code\modules\ninja\Ninja_Readme.dm" +#include "code\modules\ninja\outfit.dm" #include "code\modules\ninja\suit\gloves.dm" #include "code\modules\ninja\suit\head.dm" #include "code\modules\ninja\suit\mask.dm" From eb27276765d20387938e01dbb4a8695778c1061c Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 27 Sep 2017 15:31:57 -0400 Subject: [PATCH 092/136] Profile access is granted when holder is created --- code/modules/admin/admin_ranks.dm | 2 -- code/modules/admin/holder2.dm | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 828fbb2e91..67d0b4dbf7 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -214,8 +214,6 @@ GLOBAL_PROTECT(admin_ranks) var/datum/admins/D = new(rank_names[rank], ckey) //create the admin datum and store it for later use if(!D) continue //will occur if an invalid rank is provided - if(D.rank.rights & R_DEBUG) //grant profile access - world.SetConfig("APP/admin", ckey, "role=admin") D.associate(GLOB.directory[ckey]) //find the client for a ckey if they are connected and associate them with the new admin datum else if(!SSdbcore.Connect()) diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 238512c8b7..04d03dbf4f 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -34,6 +34,8 @@ GLOBAL_PROTECT(href_token) admin_signature = "Nanotrasen Officer #[rand(0,9)][rand(0,9)][rand(0,9)]" href_token = GenerateToken() GLOB.admin_datums[ckey] = src + if(R.rights & R_DEBUG) //grant profile access + world.SetConfig("APP/admin", ckey, "role=admin") /proc/GenerateToken() . = "" From ae604eb341b754e6a56aa9c48742180a72e2f24d Mon Sep 17 00:00:00 2001 From: oranges Date: Wed, 27 Sep 2017 22:35:39 +0000 Subject: [PATCH 094/136] Add a fingerprint to pipes when interacted with by a wrench --- code/game/machinery/pipe/construction.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 3fb3447f61..34d2edc56c 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -213,6 +213,8 @@ GLOBAL_LIST_INIT(pipeID2State, list( return ..() if (!isturf(src.loc)) return 1 + + add_fingerprint(user) fixdir() if(pipe_type in list(PIPE_GAS_MIXER, PIPE_GAS_FILTER)) From f508d248be9805e43156f7ff6efebead35d59493 Mon Sep 17 00:00:00 2001 From: oranges Date: Fri, 29 Sep 2017 15:55:27 +1300 Subject: [PATCH 096/136] Merge pull request #31091 from tgstation/Cyberboss-patch-1 Gives 1 GBP for Grammar and formatting --- tools/WebhookProcessor/github_webhook_processor.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php index 4e20a7e902..a8b32c7a92 100644 --- a/tools/WebhookProcessor/github_webhook_processor.php +++ b/tools/WebhookProcessor/github_webhook_processor.php @@ -456,6 +456,7 @@ function get_pr_code_friendliness($payload, $oldbalance = null){ 'Fix' => 2, 'Refactor' => 2, 'Code Improvement' => 1, + 'Grammar and Formatting' => 1, 'Priority: High' => 4, 'Priority: CRITICAL' => 5, 'Atmospherics' => 4, From baf72b8412a870c1d7cea79d39ee51827ef43636 Mon Sep 17 00:00:00 2001 From: oranges Date: Fri, 29 Sep 2017 15:55:02 +1300 Subject: [PATCH 098/136] Merge pull request #31064 from YPOQ/silverfriedfoods Silver slime extracts create proper fried foods --- .../food_and_drinks/food/snacks_bread.dm | 31 +++++++++++++++++++ .../kitchen_machinery/deep_fryer.dm | 31 +------------------ .../chemistry/recipes/slime_extracts.dm | 7 +++++ 3 files changed, 39 insertions(+), 30 deletions(-) diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index a07375a5b1..cf51c9867f 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -185,6 +185,37 @@ icon_state = "" bitesize = 2 +/obj/item/reagent_containers/food/snacks/deepfryholder/proc/fry(obj/item/frying, datum/reagents/reagents, cook_time = 30) + if(istype(frying, /obj/item/reagent_containers/)) + var/obj/item/reagent_containers/food = frying + food.reagents.trans_to(src, food.reagents.total_volume) + icon = frying.icon + overlays = frying.overlays + icon_state = frying.icon_state + desc = frying.desc + w_class = frying.w_class + reagents.trans_to(src, 2*(cook_time/15)) + switch(cook_time) + if(0 to 15) + add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY) + name = "lightly-fried [frying.name]" + if(16 to 49) + add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY) + name = "fried [frying.name]" + if(50 to 59) + add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY) + name = "deep-fried [frying.name]" + if(60 to INFINITY) + add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY) + name = "the physical manifestation of the very concept of fried foods" + desc = "A heavily fried...something. Who can tell anymore?" + filling_color = color + foodtype |= FRIED + if(istype(frying, /obj/item/reagent_containers/food/snacks/)) + qdel(frying) + else + frying.forceMove(src) + /obj/item/reagent_containers/food/snacks/butteredtoast name = "buttered toast" desc = "Butter lightly spread over a piece of toast." diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index 179f944500..0f27265b4b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -82,36 +82,7 @@ insert ascii eagle on american flag background here if(frying.loc == src) to_chat(user, "You eject [frying] from [src].") var/obj/item/reagent_containers/food/snacks/deepfryholder/S = new(get_turf(src)) - if(istype(frying, /obj/item/reagent_containers/)) - var/obj/item/reagent_containers/food = frying - food.reagents.trans_to(S, food.reagents.total_volume) - S.icon = frying.icon - S.overlays = frying.overlays - S.icon_state = frying.icon_state - S.desc = frying.desc - S.w_class = frying.w_class - reagents.trans_to(S, 2*(cook_time/15)) - switch(cook_time) - if(0 to 15) - S.add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY) - S.name = "lightly-fried [frying.name]" - if(16 to 49) - S.add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY) - S.name = "fried [frying.name]" - if(50 to 59) - S.add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY) - S.name = "deep-fried [frying.name]" - if(60 to INFINITY) - S.add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY) - S.name = "the physical manifestation of the very concept of fried foods" - S.desc = "A heavily fried...something. Who can tell anymore?" - S.filling_color = S.color - S.foodtype |= FRIED - if(istype(frying, /obj/item/reagent_containers/food/snacks/)) - qdel(frying) - else - frying.forceMove(S) - + S.fry(frying, reagents, cook_time) icon_state = "fryer_off" user.put_in_hands(S) frying = null diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 7e08a11b49..62e5fd723d 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -151,6 +151,12 @@ for(var/i in 1 to 4 + rand(1,2)) var/chosen = pick(borks) var/obj/B = new chosen(T) + if(prob(5))//Fry it! + var/obj/item/reagent_containers/food/snacks/deepfryholder/D = new(T) + var/datum/reagents/reagents = new(25) + reagents.add_reagent("nutriment", 25) + D.fry(B, reagents) + B = D if(prob(50)) for(var/j in 1 to rand(1, 3)) step(B, pick(NORTH,SOUTH,EAST,WEST)) @@ -173,6 +179,7 @@ /obj/item/reagent_containers/food/snacks/soup, /obj/item/reagent_containers/food/snacks/grown, /obj/item/reagent_containers/food/snacks/grown/mushroom, + /obj/item/reagent_containers/food/snacks/deepfryholder ) blocked |= typesof(/obj/item/reagent_containers/food/snacks/customizable) From 9da41c35961179b493105bb8c0983eaf4e5c3279 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Thu, 28 Sep 2017 22:59:57 -0400 Subject: [PATCH 100/136] Stops revheads from being metagamed with healthscanners & medical HUDs. (#31110) * Stops revheads metagaming * Added comment. --- code/game/gamemodes/revolution/revolution.dm | 2 +- code/game/objects/items/devices/scanners.dm | 2 +- code/modules/mob/living/carbon/human/examine.dm | 2 +- code/modules/surgery/organs/augments_eyes.dm | 5 +++++ code/modules/surgery/organs/augments_internal.dm | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 4ada75bb05..d538c7f75e 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -154,7 +154,7 @@ var/obj/item/device/assembly/flash/T = new(mob) - var/obj/item/organ/cyberimp/eyes/hud/security/S = new(mob) + var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = new(mob) var/list/slots = list ( "backpack" = slot_in_backpack, diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 7d3eabfdc6..e9a622365a 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -214,7 +214,7 @@ MASS SPECTROMETER var/cyberimp_detect for(var/obj/item/organ/cyberimp/CI in C.internal_organs) - if(CI.status == ORGAN_ROBOTIC) + if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant) cyberimp_detect += "[C.name] is modified with a [CI.name].
" if(cyberimp_detect) to_chat(user, "Detected cybernetic modifications:") diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index d48d8608bc..74ccdab19c 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -311,7 +311,7 @@ if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH, /obj/item/organ/cyberimp/eyes/hud/medical)) var/cyberimp_detect for(var/obj/item/organ/cyberimp/CI in internal_organs) - if(CI.status == ORGAN_ROBOTIC) + if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant) cyberimp_detect += "[name] is modified with a [CI.name].
" if(cyberimp_detect) msg += "Detected cybernetic modifications:
" diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 75014626be..eda6e34677 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -39,3 +39,8 @@ desc = "These cybernetic eye implants will display a security HUD over everything you see." origin_tech = "materials=4;programming=4;biotech=3;combat=3" HUD_type = DATA_HUD_SECURITY_ADVANCED + +/obj/item/organ/cyberimp/eyes/hud/security/syndicate + name = "Contraband Security HUD Implant" + desc = "A Cybersun Industries brand Security HUD Implant. These illicit cybernetic eye implants will display a security HUD over everything you see." + syndicate_implant = TRUE diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 4e478d3420..1eec609fc0 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -6,6 +6,7 @@ status = ORGAN_ROBOTIC var/implant_color = "#FFFFFF" var/implant_overlay + var/syndicate_implant = FALSE //Makes the implant invisible to health analyzers and medical HUDs. /obj/item/organ/cyberimp/New(var/mob/M = null) if(iscarbon(M)) From 183c158d14188ace3e562920a7cbcc7bb9ef65e8 Mon Sep 17 00:00:00 2001 From: oranges Date: Fri, 29 Sep 2017 16:27:01 +1300 Subject: [PATCH 102/136] Merge pull request #31106 from DaxDupont/puttheclownupsidedown Removes references to gangs from tips.txt --- strings/tips.txt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/strings/tips.txt b/strings/tips.txt index 51e1210e03..e76b88c625 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -76,7 +76,6 @@ As a Security Officer, communicate and coordinate with your fellow officers usin As a Security Officer, your sechuds or HUDsunglasses can not only see crewmates' job assignments and criminal status, but also if they are mindshield implanted. Use this to your advantage in a revolution to definitively tell who is on your side! As a Security Officer, mindshield implants can only prevent someone from being turned into a cultist: unlike revolutionaries, it will not de-cult them if they have already been converted. As a Security Officer, examining someone while wearing sechuds or HUDsunglasses will let you set their arrest level, which will cause Beepsky and other security bots to chase after them. -As a Security Officer, implanting a gang member the first time will deconvert them, but destroy the implant. You must implant them a second time to protect them from further conversion attempts. Keep in mind that gang members have ways to destroy implants in people! As the Detective, people leave fingerprints everywhere and on everything. With the exception of white latex, gloves will hide them. All is not lost, however, as gloves leave fibers specific to their kind such as black or nitrile, pointing to a general department. As the Detective, you can use your forensics scanner from a distance. As the Lawyer, try to negotiate with the Warden if sentences seem too high for the crime. @@ -181,10 +180,6 @@ As a Wizard, the fireball spell performs very poorly at close range, as it can e As a Wizard, summoning guns will turn a large portion of the crew against themselves, but will also give everyone anything from a pea shooter to a BFG 9000. Use at your own risk! As a Wizard, the staff of chaos can fire any type of bolts from the magical wands. This can range from bolts of instant death to healing or reviving someone. As a Wizard, most spells become unusable if you are not wearing your robe, hat, and sandals. -As a Gangster, you can destroy mindshield implants with an implant breaker, letting you reconvert that person. -As a Gangster, your influence is based on how many areas you have tagged and how many people are wearing your gang's outfit; more areas and more people wearing the outfit will give you more influence. -As a Gangster, your gang outfits are very robust, giving moderate resistances to most direct damage at the cost of stealth. -As a Gang Boss, don't wait too long to promote lieutenants! If you get caught by security or enemy gangsters, hopefully you have a backup. As an Abductor, you can select where your victims will be sent on the ship control console. As an Abductor Agent, the combat mode vest has much higher resistance to every kind of weapon, and your helmet prevents the AI from tracking you. As an Abductor, the baton can cycle between four modes: stun, sleep, cuff and probe. From 2d1d0b7fd8b0250c06805cb808e1b450e8d40ed7 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 29 Sep 2017 00:48:01 -0500 Subject: [PATCH 104/136] Update tank_types.dm --- code/game/objects/items/tanks/tank_types.dm | 187 +------------------- 1 file changed, 1 insertion(+), 186 deletions(-) diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 58133568ba..f1251370f8 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -1,188 +1,3 @@ -<<<<<<< HEAD -/* Types of tanks! - * Contains: - * Oxygen - * Anesthetic - * Air - * Plasma - * Emergency Oxygen - */ - -/* - * Oxygen - */ -/obj/item/tank/internals/oxygen - name = "oxygen tank" - desc = "A tank of oxygen." - icon_state = "oxygen" - distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE - force = 10 - dog_fashion = /datum/dog_fashion/back - - -/obj/item/tank/internals/oxygen/New() - ..() - air_contents.assert_gas("o2") - air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - - -/obj/item/tank/internals/oxygen/yellow - desc = "A tank of oxygen, this one is yellow." - icon_state = "oxygen_f" - dog_fashion = null - -/obj/item/tank/internals/oxygen/red - desc = "A tank of oxygen, this one is red." - icon_state = "oxygen_fr" - dog_fashion = null - - -/* - * Anesthetic - */ -/obj/item/tank/internals/anesthetic - name = "anesthetic tank" - desc = "A tank with an N2O/O2 gas mix." - icon_state = "anesthetic" - item_state = "an_tank" - force = 10 - -/obj/item/tank/internals/anesthetic/New() - ..() - air_contents.assert_gases("o2", "n2o") - air_contents.gases["o2"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD - air_contents.gases["n2o"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD - return - -/* - * Air - */ -/obj/item/tank/internals/air - name = "air tank" - desc = "Mixed anyone?" - icon_state = "oxygen" - force = 10 - dog_fashion = /datum/dog_fashion/back - -/obj/item/tank/internals/air/New() - ..() - air_contents.assert_gases("o2","n2") - air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD - air_contents.gases["n2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD - return - - -/* - * Plasma - */ -/obj/item/tank/internals/plasma - name = "plasma tank" - desc = "Contains dangerous plasma. Do not inhale. Warning: extremely flammable." - icon_state = "plasma" - flags_1 = CONDUCT_1 - slot_flags = null //they have no straps! - force = 8 - - -/obj/item/tank/internals/plasma/New() - ..() - air_contents.assert_gas("plasma") - air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - -/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/flamethrower)) - var/obj/item/flamethrower/F = W - if ((!F.status)||(F.ptank)) - return - if(!user.transferItemToLoc(src, F)) - return - src.master = F - F.ptank = src - F.update_icon() - else - return ..() - -/obj/item/tank/internals/plasma/full/New() - ..() - air_contents.assert_gas("plasma") - air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - - -/* - * Plasmaman Plasma Tank - */ - -/obj/item/tank/internals/plasmaman - name = "plasma internals tank" - desc = "A tank of plasma gas designed specifically for use as internals, particularly for plasma-based lifeforms. If you're not a Plasmaman, you probably shouldn't use this." - icon_state = "plasmaman_tank" - item_state = "plasmaman_tank" - force = 10 - distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE - -/obj/item/tank/internals/plasmaman/New() - ..() - air_contents.assert_gas("plasma") - air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - -/obj/item/tank/internals/plasmaman/full/New() - ..() - air_contents.assert_gas("plasma") - air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - - -/obj/item/tank/internals/plasmaman/belt - icon_state = "plasmaman_tank_belt" - item_state = "plasmaman_tank_belt" - slot_flags = SLOT_BELT - force = 5 - volume = 6 - w_class = WEIGHT_CLASS_SMALL //thanks i forgot this - -/obj/item/tank/internals/plasmaman/belt/full/New() - ..() - air_contents.assert_gas("plasma") - air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - - - -/* - * Emergency Oxygen - */ -/obj/item/tank/internals/emergency_oxygen - name = "emergency oxygen tank" - desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it." - icon_state = "emergency" - flags_1 = CONDUCT_1 - slot_flags = SLOT_BELT - w_class = WEIGHT_CLASS_SMALL - force = 4 - distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE - volume = 3 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011) - - -/obj/item/tank/internals/emergency_oxygen/New() - ..() - air_contents.assert_gas("o2") - air_contents.gases["o2"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - -/obj/item/tank/internals/emergency_oxygen/engi - name = "extended-capacity emergency oxygen tank" - icon_state = "emergency_engi" - volume = 6 - -/obj/item/tank/internals/emergency_oxygen/double - name = "double emergency oxygen tank" - icon_state = "emergency_engi" - volume = 10 -======= /* Types of tanks! * Contains: * Oxygen @@ -366,4 +181,4 @@ name = "double emergency oxygen tank" icon_state = "emergency_engi" volume = 10 ->>>>>>> 98ed3d0... Air tanks get their own sprite + reset fix + From c80237c969fd4cf9573e7a37a9625e36c20c4813 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 29 Sep 2017 00:48:53 -0500 Subject: [PATCH 105/136] Update tank_types.dm --- code/game/objects/items/tanks/tank_types.dm | 186 -------------------- 1 file changed, 186 deletions(-) diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 3dfa3581f4..9892c35445 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -1,188 +1,3 @@ -<<<<<<< HEAD -/* Types of tanks! - * Contains: - * Oxygen - * Anesthetic - * Air - * Plasma - * Emergency Oxygen - */ - -/* - * Oxygen - */ -/obj/item/tank/internals/oxygen - name = "oxygen tank" - desc = "A tank of oxygen." - icon_state = "oxygen" - distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE - force = 10 - dog_fashion = /datum/dog_fashion/back - - -/obj/item/tank/internals/oxygen/New() - ..() - air_contents.assert_gas("o2") - air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - - -/obj/item/tank/internals/oxygen/yellow - desc = "A tank of oxygen, this one is yellow." - icon_state = "oxygen_f" - dog_fashion = null - -/obj/item/tank/internals/oxygen/red - desc = "A tank of oxygen, this one is red." - icon_state = "oxygen_fr" - dog_fashion = null - - -/* - * Anesthetic - */ -/obj/item/tank/internals/anesthetic - name = "anesthetic tank" - desc = "A tank with an N2O/O2 gas mix." - icon_state = "anesthetic" - item_state = "an_tank" - force = 10 - -/obj/item/tank/internals/anesthetic/New() - ..() - air_contents.assert_gases("o2", "n2o") - air_contents.gases["o2"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD - air_contents.gases["n2o"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD - return - -/* - * Air - */ -/obj/item/tank/internals/air - name = "air tank" - desc = "Mixed anyone?" - icon_state = "oxygen" - force = 10 - dog_fashion = /datum/dog_fashion/back - -/obj/item/tank/internals/air/New() - ..() - air_contents.assert_gases("o2","n2") - air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD - air_contents.gases["n2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD - return - - -/* - * Plasma - */ -/obj/item/tank/internals/plasma - name = "plasma tank" - desc = "Contains dangerous plasma. Do not inhale. Warning: extremely flammable." - icon_state = "plasma" - flags_1 = CONDUCT_1 - slot_flags = null //they have no straps! - force = 8 - - -/obj/item/tank/internals/plasma/New() - ..() - air_contents.assert_gas("plasma") - air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - -/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/flamethrower)) - var/obj/item/flamethrower/F = W - if ((!F.status)||(F.ptank)) - return - if(!user.transferItemToLoc(src, F)) - return - src.master = F - F.ptank = src - F.update_icon() - else - return ..() - -/obj/item/tank/internals/plasma/full/New() - ..() - air_contents.assert_gas("plasma") - air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - - -/* - * Plasmaman Plasma Tank - */ - -/obj/item/tank/internals/plasmaman - name = "plasma internals tank" - desc = "A tank of plasma gas designed specifically for use as internals, particularly for plasma-based lifeforms. If you're not a Plasmaman, you probably shouldn't use this." - icon_state = "plasmaman_tank" - item_state = "plasmaman_tank" - force = 10 - distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE - -/obj/item/tank/internals/plasmaman/New() - ..() - air_contents.assert_gas("plasma") - air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - -/obj/item/tank/internals/plasmaman/full/New() - ..() - air_contents.assert_gas("plasma") - air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - - -/obj/item/tank/internals/plasmaman/belt - icon_state = "plasmaman_tank_belt" - item_state = "plasmaman_tank_belt" - slot_flags = SLOT_BELT - force = 5 - volume = 6 - w_class = WEIGHT_CLASS_SMALL //thanks i forgot this - -/obj/item/tank/internals/plasmaman/belt/full/New() - ..() - air_contents.assert_gas("plasma") - air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - - - -/* - * Emergency Oxygen - */ -/obj/item/tank/internals/emergency_oxygen - name = "emergency oxygen tank" - desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it." - icon_state = "emergency" - flags_1 = CONDUCT_1 - slot_flags = SLOT_BELT - w_class = WEIGHT_CLASS_SMALL - force = 4 - distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE - volume = 3 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011) - - -/obj/item/tank/internals/emergency_oxygen/New() - ..() - air_contents.assert_gas("o2") - air_contents.gases["o2"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) - return - -/obj/item/tank/internals/emergency_oxygen/engi - name = "extended-capacity emergency oxygen tank" - icon_state = "emergency_engi" - volume = 6 - -/obj/item/tank/internals/emergency_oxygen/double - name = "double emergency oxygen tank" - icon_state = "emergency_engi" - volume = 10 -======= /* Types of tanks! * Contains: * Oxygen @@ -367,4 +182,3 @@ name = "double emergency oxygen tank" icon_state = "emergency_engi" volume = 10 ->>>>>>> 46bed07... Merge pull request #31077 from RandomMarine/itsairmanbitchandimbringingthepain From cb034e006957a4572de6753774d9b2637897af4f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 29 Sep 2017 11:19:29 -0500 Subject: [PATCH 106/136] Automatic changelog generation for PR #2966 [ci skip] --- html/changelogs/AutoChangeLog-pr-2966.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2966.yml diff --git a/html/changelogs/AutoChangeLog-pr-2966.yml b/html/changelogs/AutoChangeLog-pr-2966.yml new file mode 100644 index 0000000000..3570d4a852 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2966.yml @@ -0,0 +1,4 @@ +author: "RandomMarine" +delete-after: True +changes: + - imageadd: "Air tanks (o2+n2) now have a different appearance from oxygen tanks." From 7d31aa75382bf2a63b6ce0b550336c1111b4ad84 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 29 Sep 2017 11:45:54 -0500 Subject: [PATCH 107/136] Automatic changelog generation for PR #2958 [ci skip] --- html/changelogs/AutoChangeLog-pr-2958.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2958.yml diff --git a/html/changelogs/AutoChangeLog-pr-2958.yml b/html/changelogs/AutoChangeLog-pr-2958.yml new file mode 100644 index 0000000000..c02b758502 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2958.yml @@ -0,0 +1,15 @@ +author: "Toriate" +delete-after: True +changes: + - rscadd: "Adds Magrifles, RnD" + - rscadd: "Adds Modular Pistols, reskinnable stetchkins available only in a bundle" + - rscadd: "Adds Bundle category for regular traitor uplink" + - rscadd: "Adds Flechette Launcher, nukeop exclusive, unique variant available in bundle" + - rscadd: "Adds 10mm Soporific rounds" + - rscadd: "adds Foam X9 assault rifle, adminspawn" + - bugfix: "Anti Tank Pistol no longer refundable" + - wip: "Adds Hyper-Burst Rifle, adminspawn only weapon, intended for nukeops" + - soundadd: "added Magrifle sounds" + - soundadd: "added Hyper-Burst Rifle sounds" + - imageadd: "added 6 alternative sprites for 10mm pistols, includes suppressed sprites" + - spellcheck: "Anti Tank Pistol description fixed" From da29f2c8d4bb031a27cd0f1aad54abf134e2f805 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Thu, 28 Sep 2017 12:55:25 -0400 Subject: [PATCH 108/136] Fixes subsystems not returning a qdel hint --- code/controllers/subsystem.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index eee6945c41..e160c132b9 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -69,7 +69,7 @@ can_fire = 0 flags |= SS_NO_FIRE Master.subsystems -= src - + return ..() //Queue it to run. // (we loop thru a linked list until we get to the end or find the right point) From 77c2c77f0ed39cb66b6d42d16766a7a5f0380978 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Thu, 28 Sep 2017 09:59:34 -0400 Subject: [PATCH 110/136] Removes a call to datum/New() --- code/modules/events/_event.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 79e99a1931..92399f8934 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -28,7 +28,6 @@ var/triggering //admin cancellation /datum/round_event_control/New() - ..() if(config && !wizardevent) // Magic is unaffected by configs earliest_start = Ceiling(earliest_start * config.events_min_time_mul) min_players = Ceiling(min_players * config.events_min_players_mul) From c37f74035edc890ac30bb13956444b2e5615a10a Mon Sep 17 00:00:00 2001 From: AnturK Date: Thu, 28 Sep 2017 22:34:48 +0200 Subject: [PATCH 112/136] Fixes evidence bag not respecting inventory --- code/modules/detectivework/evidence.dm | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index 2090ddd4d1..1400fdbe0c 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -23,7 +23,7 @@ icon_state = initial(icon_state) desc = initial(desc) -/obj/item/evidencebag/proc/evidencebagEquip(obj/item/I, mob/user) +/obj/item/evidencebag/proc/evidencebagEquip(obj/item/I, mob/user) if(!istype(I) || I.anchored == 1) return @@ -43,9 +43,7 @@ if(istype(I.loc, /obj/item/storage)) //in a container. var/obj/item/storage/U = I.loc U.remove_from_storage(I, src) - if(user.is_holding(I)) - user.dropItemToGround(I) - else + if(!user.dropItemToGround(I)) return user.visible_message("[user] puts [I] into [src].", "You put [I] inside [src].",\ @@ -62,7 +60,7 @@ add_overlay("evidence") //should look nicer for transparent stuff. not really that important, but hey. desc = "An evidence bag containing [I]. [I.desc]" - I.loc = src + I.forceMove(src) w_class = I.w_class return 1 From cd334646c3db6775945075c95c18cfd2c4b83af2 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Thu, 28 Sep 2017 11:44:04 -0400 Subject: [PATCH 114/136] Fixes PA Href Issue --- .../singularity/particle_accelerator/particle_control.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 382853066d..d0f17c5210 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -204,8 +204,8 @@ /obj/machinery/particle_accelerator/control_box/proc/toggle_power() active = !active investigate_log("turned [active?"ON":"OFF"] by [usr ? key_name(usr) : "outside forces"]", INVESTIGATE_SINGULO) - message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name_admin(usr) : "outside forces"](?) (FLW) in ([x],[y],[z] - JMP)",0,1) - log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? "[key_name(usr)]" : "outside forces"] in ([x],[y],[z])") + message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name_admin(usr) : "outside forces"][ADMIN_QUE(usr)] [ADMIN_FLW(usr)] in [ADMIN_COORDJMP(src)]",0,1) + log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? "[key_name(usr)]" : "outside forces"] in [COORD(src)]") if(active) use_power = ACTIVE_POWER_USE for(var/CP in connected_parts) From c54ea1b9bf833be9f10f5e6704317c7e95ab53f3 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Fri, 29 Sep 2017 19:42:40 -0400 Subject: [PATCH 116/136] Fixes SM shard extraction (#31111) * Fixes SM shard extraction * Space-OSHA called. They want to have a word. --- code/game/objects/items/theft_tools.dm | 6 +++--- code/modules/power/supermatter/supermatter.dm | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index ba7141d77e..d4432e0257 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -104,11 +104,11 @@ /obj/item/paper/guides/antag/supermatter_sliver info = "How to safely extract a supermatter sliver:
\
    \ -
  • Approach an active supermatter crystal with proper protective gear. DO NOT MAKE PHYSICAL CONTACT.
  • \ +
  • Approach an active supermatter crystal with radiation shielded personal protective equipment. DO NOT MAKE PHYSICAL CONTACT.
  • \
  • Use a supermatter scalpel (provided) to slice off a sliver of the crystal.
  • \ -
  • Use supermatter extraction tongs (also provided) to safely remove the sliver.
  • \ +
  • Use supermatter extraction tongs (also provided) to safely pick up the sliver you sliced off.
  • \
  • Physical contact of any object with the sliver will dust the object, as well as yourself.
  • \ -
  • Use the tongs to place the sliver into the provided container, which will take some time to seal
  • \ +
  • Use the tongs to place the sliver into the provided container, which will take some time to seal.
  • \
  • Get the hell out before the crystal delaminates.
  • \
  • ???
  • \
" diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 07cb98ea6d..eb6b3f0c52 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -537,7 +537,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard) to_chat(user, "You carefully begin to scrape \the [src] with \the [W]...") if(do_after(user, 60 * W.toolspeed, TRUE, src)) to_chat(user, "You extract a sliver from \the [src]. \The [src] begins to react violently!") - new /obj/item/nuke_core/supermatter_sliver(user.loc) + new /obj/item/nuke_core/supermatter_sliver(drop_location()) matter_power += 200 else if(user.dropItemToGround(W)) user.visible_message("As [user] touches \the [src] with \a [W], silence fills the room...",\ From eb05246c8b0739c716afea02c2eece78698d5068 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 29 Sep 2017 23:33:54 -0500 Subject: [PATCH 118/136] Update giant_spider.dm --- code/modules/mob/living/simple_animal/hostile/giant_spider.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index f6a7c7c54a..75cc53e0c9 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -48,9 +48,7 @@ see_in_dark = 4 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE var/playable_spider = FALSE -<<<<<<< HEAD devourable = TRUE -======= var/datum/action/innate/spider/lay_web/lay_web var/directive = "" //Message passed down to children, to relay the creator's orders @@ -62,7 +60,6 @@ /mob/living/simple_animal/hostile/poison/giant_spider/Destroy() QDEL_NULL(lay_web) return ..() ->>>>>>> 152c890... Adds action buttons for spiders, refactors action code, nurse spiders can set a hereditary directive for their children to follow (#30572) /mob/living/simple_animal/hostile/poison/giant_spider/Topic(href, href_list) if(href_list["activate"]) From fceb2890724f32d9e4f3172a03c5bcf7ff8f69ab Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 30 Sep 2017 01:41:41 -0500 Subject: [PATCH 119/136] Automatic changelog generation for PR #2979 [ci skip] --- html/changelogs/AutoChangeLog-pr-2979.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2979.yml diff --git a/html/changelogs/AutoChangeLog-pr-2979.yml b/html/changelogs/AutoChangeLog-pr-2979.yml new file mode 100644 index 0000000000..00ac0a8d08 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2979.yml @@ -0,0 +1,6 @@ +author: "XDTM" +delete-after: True +changes: + - rscadd: "Nurse spiders can now set a directive that will be seen by their spiderlings, when they get controlled by a player." + - rscadd: "Spiders' actions are now action buttons instead of verbs." + - rscadd: "Wrapping stuff in a cocoon is now a targeted action!" From b5cdb64a53d4b2be228fd5b2b09a236e6035821d Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sat, 30 Sep 2017 01:44:31 -0500 Subject: [PATCH 120/136] Update extinguisher.dm --- code/game/objects/items/extinguisher.dm | 192 +----------------------- 1 file changed, 1 insertion(+), 191 deletions(-) diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 2e6ec98606..c42322044a 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -1,193 +1,4 @@ -<<<<<<< HEAD -/obj/item/extinguisher - name = "fire extinguisher" - desc = "A traditional red fire extinguisher." - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "fire_extinguisher0" - item_state = "fire_extinguisher" - hitsound = 'sound/weapons/smash.ogg' - flags_1 = CONDUCT_1 - throwforce = 10 - w_class = WEIGHT_CLASS_NORMAL - throw_speed = 2 - throw_range = 7 - force = 10 - materials = list(MAT_METAL=90) - attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") - dog_fashion = /datum/dog_fashion/back - resistance_flags = FIRE_PROOF - var/max_water = 50 - var/last_use = 1 - var/safety = TRUE - var/refilling = FALSE - var/sprite_name = "fire_extinguisher" - var/power = 5 //Maximum distance launched water will travel - var/precision = 0 //By default, turfs picked from a spray are random, set to 1 to make it always have at least one water effect per row - var/cooling_power = 2 //Sets the cooling_temperature of the water reagent datum inside of the extinguisher when it is refilled - -/obj/item/extinguisher/mini - name = "pocket fire extinguisher" - desc = "A light and compact fibreglass-framed model fire extinguisher." - icon_state = "miniFE0" - item_state = "miniFE" - hitsound = null //it is much lighter, after all. - flags_1 = null //doesn't CONDUCT_1 - throwforce = 2 - w_class = WEIGHT_CLASS_SMALL - force = 3 - materials = list() - max_water = 30 - sprite_name = "miniFE" - dog_fashion = null - -/obj/item/extinguisher/New() - ..() - create_reagents(max_water) - reagents.add_reagent("water", max_water) - -/obj/item/extinguisher/attack_self(mob/user) - safety = !safety - src.icon_state = "[sprite_name][!safety]" - src.desc = "The safety is [safety ? "on" : "off"]." - to_chat(user, "The safety is [safety ? "on" : "off"].") - return - -/obj/item/extinguisher/attack(mob/M, mob/user) - if(user.a_intent == INTENT_HELP && !safety) //If we're on help intent and going to spray people, don't bash them. - return FALSE - else - return ..() - -/obj/item/extinguisher/attack_obj(obj/O, mob/living/user) - if(AttemptRefill(O, user)) - refilling = TRUE - return FALSE - else - return ..() - -/obj/item/extinguisher/examine(mob/user) - ..() - if(reagents.total_volume) - to_chat(user, "It contains [round(reagents.total_volume)] units.") - else - to_chat(user, "It is empty.") - -/obj/item/extinguisher/proc/AttemptRefill(atom/target, mob/user) - if(istype(target, /obj/structure/reagent_dispensers/watertank) && target.Adjacent(user)) - var/safety_save = safety - safety = TRUE - if(reagents.total_volume == reagents.maximum_volume) - to_chat(user, "\The [src] is already full!") - safety = safety_save - return 1 - var/obj/structure/reagent_dispensers/watertank/W = target - var/transferred = W.reagents.trans_to(src, max_water) - if(transferred > 0) - to_chat(user, "\The [src] has been refilled by [transferred] units.") - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) - for(var/datum/reagent/water/R in reagents.reagent_list) - R.cooling_temperature = cooling_power - else - to_chat(user, "\The [W] is empty!") - safety = safety_save - return 1 - else - return 0 - -/obj/item/extinguisher/afterattack(atom/target, mob/user , flag) - // Make it so the extinguisher doesn't spray yourself when you click your inventory items - if (target.loc == user) - return - //TODO; Add support for reagents in water. - if(refilling) - refilling = FALSE - return - if (!safety) - if (src.reagents.total_volume < 1) - to_chat(usr, "\The [src] is empty!") - return - - if (world.time < src.last_use + 12) - return - - src.last_use = world.time - - playsound(src.loc, 'sound/effects/extinguish.ogg', 75, 1, -3) - - var/direction = get_dir(src,target) - - if(user.buckled && isobj(user.buckled) && !user.buckled.anchored) - spawn(0) - var/obj/B = user.buckled - var/movementdirection = turn(direction,180) - step(B, movementdirection) - sleep(1) - step(B, movementdirection) - sleep(1) - step(B, movementdirection) - sleep(1) - step(B, movementdirection) - sleep(2) - step(B, movementdirection) - sleep(2) - step(B, movementdirection) - sleep(3) - step(B, movementdirection) - sleep(3) - step(B, movementdirection) - sleep(3) - step(B, movementdirection) - - else user.newtonian_move(turn(direction, 180)) - - var/turf/T = get_turf(target) - var/turf/T1 = get_step(T,turn(direction, 90)) - var/turf/T2 = get_step(T,turn(direction, -90)) - var/list/the_targets = list(T,T1,T2) - if(precision) - var/turf/T3 = get_step(T1, turn(direction, 90)) - var/turf/T4 = get_step(T2,turn(direction, -90)) - the_targets = list(T,T1,T2,T3,T4) - - for(var/a=0, a<5, a++) - spawn(0) - var/obj/effect/particle_effect/water/W = new /obj/effect/particle_effect/water(get_turf(src)) - var/turf/my_target = pick(the_targets) - if(precision) - the_targets -= my_target - var/datum/reagents/R = new/datum/reagents(5) - if(!W) return - W.reagents = R - R.my_atom = W - if(!W || !src) return - src.reagents.trans_to(W,1) - for(var/b=0, bYou quietly empty out \the [src] using its release valve.") -======= + /obj/item/extinguisher name = "fire extinguisher" desc = "A traditional red fire extinguisher." @@ -377,4 +188,3 @@ theturf.MakeSlippery(min_wet_time = 10, wet_time_to_add = 5) user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] using its release valve.") ->>>>>>> 086d636... Alt-clicking descriptions when examining (#30988) From dc2140a88dca092844dd7da12449d242e3b5ac53 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sat, 30 Sep 2017 02:15:40 -0500 Subject: [PATCH 121/136] Update paper.dm --- code/modules/paperwork/paper.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 47c7b81e26..7f301cc1e8 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -403,8 +403,5 @@ return /obj/item/paper/crumpled/bloody -<<<<<<< HEAD icon_state = "scrap_bloodied" -======= - icon_state = "scrap_bloodied" ->>>>>>> 086d636... Alt-clicking descriptions when examining (#30988) + From 384332fe20752172627c821bf9a319f5560c0adf Mon Sep 17 00:00:00 2001 From: oranges Date: Sun, 1 Oct 2017 01:22:35 +1300 Subject: [PATCH 122/136] Small refactor to movement (#31071) You can now move an object into nullspace, which will call exited on it's parent and parent area but will not call any entered. Note that you cannot pass null into forceMove it will crash, instead use the new proc that will call the underlying logic with a null destination Some of the force move procs have been refactored to check that their parent move succeeded before doing updates --- code/game/atoms_movable.dm | 31 ++++++++++++++++--- .../mob/living/silicon/silicon_movement.dm | 4 ++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 6c544c4497..a880a44fa6 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -225,6 +225,17 @@ A.CollidedWith(src) /atom/movable/proc/forceMove(atom/destination) + . = FALSE + if(destination) + . = doMove(destination) + else + CRASH("No valid destination passed into forceMove") + +/atom/movable/proc/moveToNullspace() + return doMove(null) + +/atom/movable/proc/doMove(atom/destination) + . = FALSE if(destination) if(pulledby) pulledby.stop_pulling() @@ -251,8 +262,17 @@ AM.Crossed(src, oldloc) Moved(oldloc, 0) - return 1 - return 0 + . = TRUE + + //If no destination, move the atom into nullspace (don't do this unless you know what you're doing) + else + . = TRUE + var/atom/oldloc = loc + var/area/old_area = get_area(oldloc) + oldloc.Exited(src, null) + if(old_area) + old_area.Exited(src, null) + loc = null /mob/living/forceMove(atom/destination) stop_pulling() @@ -261,9 +281,10 @@ if(has_buckled_mobs()) unbuckle_all_mobs(force=1) . = ..() - if(client) - reset_perspective(destination) - update_canmove() //if the mob was asleep inside a container and then got forceMoved out we need to make them fall. + if(.) + if(client) + reset_perspective(destination) + update_canmove() //if the mob was asleep inside a container and then got forceMoved out we need to make them fall. /mob/living/brain/forceMove(atom/destination) if(container) diff --git a/code/modules/mob/living/silicon/silicon_movement.dm b/code/modules/mob/living/silicon/silicon_movement.dm index c7267acf76..590326eda1 100644 --- a/code/modules/mob/living/silicon/silicon_movement.dm +++ b/code/modules/mob/living/silicon/silicon_movement.dm @@ -4,7 +4,9 @@ /mob/living/silicon/forceMove(atom/destination) . = ..() - update_camera_location(destination) + //Only bother updating the camera if we actually managed to move + if(.) + update_camera_location(destination) /mob/living/silicon/proc/do_camera_update(oldLoc) if(!QDELETED(builtInCamera) && oldLoc != get_turf(src)) From 20e7f03910c923351d40c623fff91cfbf8e30ad7 Mon Sep 17 00:00:00 2001 From: Tad Hardesty Date: Sat, 30 Sep 2017 05:57:28 -0700 Subject: [PATCH 124/136] Strip propriety macros from tooltips (#31113) --- code/modules/tooltip/tooltip.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index 3a12d580c4..afafbbdf66 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -65,6 +65,10 @@ Notes: else if (!title && content) content = "

[content]

" + // Strip macros from item names + title = replacetext(title, "\proper", "") + title = replacetext(title, "\improper", "") + //Make our dumb param object params = {"{ "cursor": "[params]", "screenLoc": "[thing.screen_loc]" }"} From 08ecb0e322e5f901d4448a7d8913600c5184d3d3 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sat, 30 Sep 2017 08:58:52 -0400 Subject: [PATCH 126/136] RegisterSignal() can now accept a list (#31098) * RegisterSignal may now accept a list of signals * Update old calls to RegisterSignal() --- code/datums/components/README.md | 3 ++- code/datums/components/_component.dm | 16 +++++++++------- code/datums/components/slippery.dm | 5 +---- code/datums/components/squeek.dm | 19 +++---------------- 4 files changed, 15 insertions(+), 28 deletions(-) diff --git a/code/datums/components/README.md b/code/datums/components/README.md index 04dc21f33e..81218700c1 100644 --- a/code/datums/components/README.md +++ b/code/datums/components/README.md @@ -94,7 +94,8 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo * Allows the component to react to ownership transfers 1. `/datum/component/proc/_RemoveNoSignal()` (private, final) * Internal, clears the parent var and removes the component from the parents component list -1. `/datum/component/proc/RegisterSignal(signal(string), proc_ref(type), override(boolean))` (protected, final) (Consider removing for performance gainz) +1. `/datum/component/proc/RegisterSignal(signal(string/list of strings), proc_ref(type), override(boolean))` (protected, final) (Consider removing for performance gainz) + * If signal is a list it will be as if RegisterSignal was called for each of the entries with the same following arguments * Makes a component listen for the specified `signal` on it's `parent` datum. * When that signal is recieved `proc_ref` will be called on the component, along with associated arguments * Example proc ref: `.proc/OnEvent` diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 667ffa7b82..a4c85f7816 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -95,7 +95,7 @@ P.datum_components = null parent = null -/datum/component/proc/RegisterSignal(sig_type, proc_on_self, override = FALSE) +/datum/component/proc/RegisterSignal(sig_type_or_types, proc_on_self, override = FALSE) if(QDELETED(src)) return var/list/procs = signal_procs @@ -103,12 +103,14 @@ procs = list() signal_procs = procs - if(!override) - . = procs[sig_type] - if(.) - stack_trace("[sig_type] overridden. Use override = TRUE to suppress this warning") - - procs[sig_type] = CALLBACK(src, proc_on_self) + var/list/sig_types = islist(sig_type_or_types) ? sig_type_or_types : list(sig_type_or_types) + for(var/sig_type in sig_types) + if(!override) + . = procs[sig_type] + if(.) + stack_trace("[sig_type] overridden. Use override = TRUE to suppress this warning") + + procs[sig_type] = CALLBACK(src, proc_on_self) /datum/component/proc/InheritComponent(datum/component/C, i_am_original) return diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm index 321d407e92..573bb81d11 100644 --- a/code/datums/components/slippery.dm +++ b/code/datums/components/slippery.dm @@ -6,10 +6,7 @@ /datum/component/slippery/Initialize(_intensity, _lube_flags = NONE) intensity = max(_intensity, 0) lube_flags = _lube_flags - if(ismovableatom(parent)) - RegisterSignal(COMSIG_MOVABLE_CROSSED, .proc/Slip) - else - RegisterSignal(COMSIG_ATOM_ENTERED, .proc/Slip) + RegisterSignal(list(COMSIG_MOVABLE_CROSSED, COMSIG_ATOM_ENTERED), .proc/Slip) /datum/component/slippery/proc/Slip(atom/movable/AM) var/mob/victim = AM diff --git a/code/datums/components/squeek.dm b/code/datums/components/squeek.dm index 40fd0af598..ebc9cf0434 100644 --- a/code/datums/components/squeek.dm +++ b/code/datums/components/squeek.dm @@ -24,22 +24,9 @@ if(use_delay_override) use_delay = use_delay_override - if(istype(parent, /atom)) - RegisterSignal(COMSIG_ATOM_BLOB_ACT, .proc/play_squeak) - RegisterSignal(COMSIG_ATOM_HULK_ATTACK, .proc/play_squeak) - RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/play_squeak) - if(istype(parent, /atom/movable)) - RegisterSignal(COMSIG_MOVABLE_CROSSED, .proc/play_squeak) - RegisterSignal(COMSIG_MOVABLE_COLLIDE, .proc/play_squeak) - RegisterSignal(COMSIG_MOVABLE_IMPACT, .proc/play_squeak) - if(istype(parent, /obj/item)) - RegisterSignal(COMSIG_ITEM_ATTACK, .proc/play_squeak) - RegisterSignal(COMSIG_ITEM_ATTACK_SELF, .proc/use_squeak) - RegisterSignal(COMSIG_ITEM_ATTACK_OBJ, .proc/play_squeak) - if(istype(parent, /obj/item/clothing/shoes)) - RegisterSignal(COMSIG_SHOES_STEP_ACTION, .proc/step_squeak) - else - RegisterSignal(COMSIG_ATOM_ENTERED, .proc/play_squeak) + RegisterSignal(list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_CROSSED, COMSIG_MOVABLE_COLLIDE, COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_ATTACK_OBJ), .proc/play_squeak) + RegisterSignal(COMSIG_ITEM_ATTACK_SELF, .proc/use_squeak) + RegisterSignal(COMSIG_SHOES_STEP_ACTION, .proc/step_squeak) /datum/component/squeak/proc/play_squeak() if(prob(squeak_chance)) From 078128aa91a209fb2a51794a36d700fd142623e2 Mon Sep 17 00:00:00 2001 From: nicbn Date: Sat, 30 Sep 2017 10:08:25 -0300 Subject: [PATCH 128/136] Paper markdown (#30873) * why it doesn't work * list thing * oops * fixes list. maybe * Less regex * wip * Done I think. I think * return your functions * Replace $10 by $a --- code/__HELPERS/text.dm | 175 +++++++++++++++--- code/game/machinery/newscaster.dm | 4 +- code/game/objects/items/devices/PDA/PDA.dm | 2 +- .../file_system/programs/file_browser.dm | 7 + code/modules/paperwork/paper.dm | 63 ++----- 5 files changed, 176 insertions(+), 75 deletions(-) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 53691d122e..ce8f9f9bd2 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -414,34 +414,159 @@ GLOBAL_LIST_INIT(binary, list("0","1")) end = temp return end - -/proc/parsepencode(t, mob/user=null, signfont=SIGNFONT) - if(length(t) < 1) //No input means nothing needs to be parsed +/proc/parsemarkdown_basic_step1(t, limited=FALSE) + if(length(t) <= 0) return - t = replacetext(t, "\[center\]", "
") - t = replacetext(t, "\[/center\]", "
") - t = replacetext(t, "\[br\]", "
") - t = replacetext(t, "\[b\]", "") - t = replacetext(t, "\[/b\]", "") - t = replacetext(t, "\[i\]", "") - t = replacetext(t, "\[/i\]", "") - t = replacetext(t, "\[u\]", "") - t = replacetext(t, "\[/u\]", "") - t = replacetext(t, "\[large\]", "") - t = replacetext(t, "\[/large\]", "") - if(user) - t = replacetext(t, "\[sign\]", "[user.real_name]") - else - t = replacetext(t, "\[sign\]", "") - t = replacetext(t, "\[field\]", "") + // This parses markdown with no custom rules - t = replacetext(t, "\[*\]", "
  • ") - t = replacetext(t, "\[hr\]", "
    ") - t = replacetext(t, "\[small\]", "") - t = replacetext(t, "\[/small\]", "") - t = replacetext(t, "\[list\]", "
      ") - t = replacetext(t, "\[/list\]", "
    ") + // Escape backslashed + + t = replacetext(t, "$", "$-") + t = replacetext(t, "\\\\", "$1") + t = replacetext(t, "\\**", "$2") + t = replacetext(t, "\\*", "$3") + t = replacetext(t, "\\__", "$4") + t = replacetext(t, "\\_", "$5") + t = replacetext(t, "\\^", "$6") + t = replacetext(t, "\\((", "$7") + t = replacetext(t, "\\))", "$8") + t = replacetext(t, "\\|", "$9") + t = replacetext(t, "\\%", "$0") + + // Escape single characters that will be used + + t = replacetext(t, "!", "$a") + + // Parse hr and small + + if(!limited) + t = replacetext(t, "((", "") + t = replacetext(t, "))", "") + t = replacetext(t, regex("^-{3,}$", "gm"), "
    ") + t = replacetext(t, regex("^\\(-{3,})$", "gm"), "$1") + + // Parse lists + + var/list/tlist = splittext(t, "\n") + var/tlistlen = tlist.len + var/listlevel = -1 + var/singlespace = -1 // if 0, double spaces are used before asterisks, if 1, single are + for(var/i = 1, i <= tlistlen, i++) + var/line = tlist[i] + var/count_asterisk = length(replacetext(line, regex("\[^\\*\]+", "g"), "")) + if(count_asterisk % 2 == 1 && findtext(line, regex("^\\s*\\*", "g"))) // there is an extra asterisk in the beggining + + var/count_w = length(replacetext(line, regex("^( *)\\*.*$", "g"), "$1")) // whitespace before asterisk + line = replacetext(line, regex("^ *(\\*.*)$", "g"), "$1") + + if(singlespace == -1 && count_w == 2) + if(listlevel == 0) + singlespace = 0 + else + singlespace = 1 + + if(singlespace == 0) + count_w = count_w % 2 ? round(count_w / 2 + 0.25) : count_w / 2 + + line = replacetext(line, regex("\\*", ""), "
  • ") - t = replacetext(t, "\[hr\]", "
    ") - t = replacetext(t, "\[small\]", "") - t = replacetext(t, "\[/small\]", "") - t = replacetext(t, "\[list\]", "
      ") - t = replacetext(t, "\[/list\]", "
    ") - t = "[t]" - else // If it is a crayon, and he still tries to use these, make them empty! + else var/obj/item/toy/crayon/C = P - t = replacetext(t, "\[*\]", "") - t = replacetext(t, "\[hr\]", "") - t = replacetext(t, "\[small\]", "") - t = replacetext(t, "\[/small\]", "") - t = replacetext(t, "\[list\]", "") - t = replacetext(t, "\[/list\]", "") - t = "[t]" -// t = replacetext(t, "#", "") // Junk converted to nothing! - -//Count the fields + // Count the fields var/laststart = 1 while(1) var/i = findtext(t, "", laststart) @@ -253,22 +221,23 @@ /obj/item/paper/proc/openhelp(mob/user) user << browse({"Paper Help + You can use backslash (\\) to escape special characters.
    +
    Crayon&Pen commands


    - \[br\] : Creates a linebreak.
    - \[center\] - \[/center\] : Centers the text.
    - \[b\] - \[/b\] : Makes the text bold.
    - \[i\] - \[/i\] : Makes the text italic.
    - \[u\] - \[/u\] : Makes the text underlined.
    - \[large\] - \[/large\] : Increases the size of the text.
    - \[sign\] : Inserts a signature of your name in a foolproof way.
    - \[field\] : Inserts an invisible field which lets you start type from there. Useful for forms.
    + # text : Defines a header.
    + |text| : Centers the text.
    + **text** : Makes the text bold.
    + *text* : Makes the text italic.
    + ^text^ : Increases the size of the text.
    + %s : Inserts a signature of your name in a foolproof way.
    + %f : Inserts an invisible field which lets you start type from there. Useful for forms.

    Pen exclusive commands

    - \[small\] - \[/small\] : Decreases the size of the text.
    - \[list\] - \[/list\] : A list.
    - \[*\] : A dot used for lists.
    - \[hr\] : Adds a horizontal rule. + ((text)) : Decreases the size of the text.
    + * item : An unordered list item.
    +   * item: An unordered list child item.
    + --- : Adds a horizontal rule. "}, "window=paper_help") From 3b64e0ec35980a0bfb23ed74361641fecae0d4f2 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sat, 30 Sep 2017 10:43:58 -0400 Subject: [PATCH 130/136] [s] Fixes config reading exploit --- .../controllers/configuration/config_entry.dm | 198 ++++++++++++ .../configuration/configuration.dm | 287 ++++++++++++++++++ code/modules/admin/verbs/debug.dm | 11 +- 3 files changed, 495 insertions(+), 1 deletion(-) create mode 100644 code/controllers/configuration/config_entry.dm create mode 100644 code/controllers/configuration/configuration.dm diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm new file mode 100644 index 0000000000..b439743a79 --- /dev/null +++ b/code/controllers/configuration/config_entry.dm @@ -0,0 +1,198 @@ +#undef CURRENT_RESIDENT_FILE + +#define LIST_MODE_NUM 0 +#define LIST_MODE_TEXT 1 +#define LIST_MODE_FLAG 2 + +/datum/config_entry + var/name //read-only, this is determined by the last portion of the derived entry type + var/value + var/default //read-only, just set value directly + + var/resident_file //the file which this belongs to, must be set + var/modified = FALSE //set to TRUE if the default has been overridden by a config entry + + var/protection = NONE + var/abstract_type = /datum/config_entry //do not instantiate if type matches this + + var/dupes_allowed = FALSE + +/datum/config_entry/New() + if(!resident_file) + CRASH("Config entry [type] has no resident_file set") + if(type == abstract_type) + CRASH("Abstract config entry [type] instatiated!") + name = lowertext(type2top(type)) + if(islist(value)) + var/list/L = value + default = L.Copy() + else + default = value + +/datum/config_entry/Destroy() + config.RemoveEntry(src) + return ..() + +/datum/config_entry/can_vv_get(var_name) + . = ..() + if(var_name == "value" || var_name == "default") + . &= !(protection & CONFIG_ENTRY_HIDDEN) + +/datum/config_entry/vv_edit_var(var_name, var_value) + var/static/list/banned_edits = list("name", "default", "resident_file", "protection", "abstract_type", "modified", "dupes_allowed") + if(var_name == "value") + if(protection & CONFIG_ENTRY_LOCKED) + return FALSE + . = ValidateAndSet("[var_value]") + if(.) + var_edited = TRUE + return + if(var_name in banned_edits) + return FALSE + return ..() + +/datum/config_entry/proc/VASProcCallGuard(str_val) + . = !(IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "ValidateAndSet" && GLOB.LastAdminCalledTargetRef == "\ref[src]") + if(!.) + log_admin_private("Config set of [type] to [str_val] attempted by [key_name(usr)]") + +/datum/config_entry/proc/ValidateAndSet(str_val) + VASProcCallGuard(str_val) + CRASH("Invalid config entry type!") + +/datum/config_entry/proc/ValidateKeyedList(str_val, list_mode, splitter) + str_val = trim(str_val) + var/key_pos = findtext(str_val, splitter) + var/key_name = null + var/key_value = null + + if(key_pos || list_mode == LIST_MODE_FLAG) + key_name = lowertext(copytext(str_val, 1, key_pos)) + key_value = copytext(str_val, key_pos + 1) + var/temp + var/continue_check + switch(list_mode) + if(LIST_MODE_FLAG) + temp = TRUE + continue_check = TRUE + if(LIST_MODE_NUM) + temp = text2num(key_value) + continue_check = !isnull(temp) + if(LIST_MODE_TEXT) + temp = key_value + continue_check = temp + if(continue_check && ValidateKeyName(key_name)) + value[key_name] = temp + return TRUE + return FALSE + +/datum/config_entry/proc/ValidateKeyName(key_name) + return TRUE + +/datum/config_entry/string + value = "" + abstract_type = /datum/config_entry/string + var/auto_trim = TRUE + +/datum/config_entry/string/vv_edit_var(var_name, var_value) + return var_name != "auto_trim" && ..() + +/datum/config_entry/string/ValidateAndSet(str_val) + if(!VASProcCallGuard(str_val)) + return FALSE + value = auto_trim ? trim(str_val) : str_val + return TRUE + +/datum/config_entry/number + value = 0 + abstract_type = /datum/config_entry/number + var/integer = TRUE + var/max_val = INFINITY + var/min_val = -INFINITY + +/datum/config_entry/number/ValidateAndSet(str_val) + if(!VASProcCallGuard(str_val)) + return FALSE + var/temp = text2num(trim(str_val)) + if(!isnull(temp)) + value = Clamp(integer ? round(temp) : temp, min_val, max_val) + if(value != temp && !var_edited) + log_config("Changing [name] from [temp] to [value]!") + return TRUE + return FALSE + +/datum/config_entry/number/vv_edit_var(var_name, var_value) + var/static/list/banned_edits = list("max_val", "min_val", "integer") + return !(var_name in banned_edits) && ..() + +/datum/config_entry/flag + value = FALSE + abstract_type = /datum/config_entry/flag + +/datum/config_entry/flag/ValidateAndSet(str_val) + if(!VASProcCallGuard(str_val)) + return FALSE + value = text2num(trim(str_val)) != 0 + return TRUE + +/datum/config_entry/number_list + abstract_type = /datum/config_entry/number_list + value = list() + +/datum/config_entry/number_list/ValidateAndSet(str_val) + if(!VASProcCallGuard(str_val)) + return FALSE + str_val = trim(str_val) + var/list/new_list = list() + var/list/values = splittext(str_val," ") + for(var/I in values) + var/temp = text2num(I) + if(isnull(temp)) + return FALSE + new_list += temp + if(!new_list.len) + return FALSE + value = new_list + return TRUE + +/datum/config_entry/keyed_flag_list + abstract_type = /datum/config_entry/keyed_flag_list + value = list() + dupes_allowed = TRUE + +/datum/config_entry/keyed_flag_list/ValidateAndSet(str_val) + if(!VASProcCallGuard(str_val)) + return FALSE + return ValidateKeyedList(str_val, LIST_MODE_FLAG, " ") + +/datum/config_entry/keyed_number_list + abstract_type = /datum/config_entry/keyed_number_list + value = list() + dupes_allowed = TRUE + var/splitter = " " + +/datum/config_entry/keyed_number_list/vv_edit_var(var_name, var_value) + return var_name != "splitter" && ..() + +/datum/config_entry/keyed_number_list/ValidateAndSet(str_val) + if(!VASProcCallGuard(str_val)) + return FALSE + return ValidateKeyedList(str_val, LIST_MODE_NUM, splitter) + +/datum/config_entry/keyed_string_list + abstract_type = /datum/config_entry/keyed_string_list + value = list() + dupes_allowed = TRUE + var/splitter = " " + +/datum/config_entry/keyed_string_list/vv_edit_var(var_name, var_value) + return var_name != "splitter" && ..() + +/datum/config_entry/keyed_string_list/ValidateAndSet(str_val) + if(!VASProcCallGuard(str_val)) + return FALSE + return ValidateKeyedList(str_val, LIST_MODE_TEXT, splitter) + +#undef LIST_MODE_NUM +#undef LIST_MODE_TEXT +#undef LIST_MODE_FLAG diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm new file mode 100644 index 0000000000..8df012e5de --- /dev/null +++ b/code/controllers/configuration/configuration.dm @@ -0,0 +1,287 @@ +GLOBAL_VAR_INIT(config_dir, "config/") +GLOBAL_PROTECT(config_dir) + +/datum/controller/configuration + name = "Configuration" + + var/hiding_entries_by_type = TRUE //Set for readability, admins can set this to FALSE if they want to debug it + var/list/entries + var/list/entries_by_type + + var/list/maplist + var/datum/map_config/defaultmap + + var/list/modes // allowed modes + var/list/gamemode_cache + var/list/votable_modes // votable modes + var/list/mode_names + var/list/mode_reports + var/list/mode_false_report_weight + +/datum/controller/configuration/New() + config = src + var/list/config_files = InitEntries() + LoadModes() + for(var/I in config_files) + LoadEntries(I) + if(Get(/datum/config_entry/flag/maprotation)) + loadmaplist(CONFIG_MAPS_FILE) + +/datum/controller/configuration/Destroy() + entries_by_type.Cut() + QDEL_LIST_ASSOC_VAL(entries) + QDEL_LIST_ASSOC_VAL(maplist) + QDEL_NULL(defaultmap) + + config = null + + return ..() + +/datum/controller/configuration/proc/InitEntries() + var/list/_entries = list() + entries = _entries + var/list/_entries_by_type = list() + entries_by_type = _entries_by_type + + . = list() + + for(var/I in typesof(/datum/config_entry)) //typesof is faster in this case + var/datum/config_entry/E = I + if(initial(E.abstract_type) == I) + continue + E = new I + _entries_by_type[I] = E + var/esname = E.name + var/datum/config_entry/test = _entries[esname] + if(test) + log_config("Error: [test.type] has the same name as [E.type]: [esname]! Not initializing [E.type]!") + qdel(E) + continue + _entries[esname] = E + .[E.resident_file] = TRUE + +/datum/controller/configuration/proc/RemoveEntry(datum/config_entry/CE) + entries -= CE.name + entries_by_type -= CE.type + +/datum/controller/configuration/proc/LoadEntries(filename) + log_config("Loading config file [filename]...") + var/list/lines = world.file2list("[GLOB.config_dir][filename]") + var/list/_entries = entries + for(var/L in lines) + if(!L) + continue + + if(copytext(L, 1, 2) == "#") + continue + + var/pos = findtext(L, " ") + var/entry = null + var/value = null + + if(pos) + entry = lowertext(copytext(L, 1, pos)) + value = copytext(L, pos + 1) + else + entry = lowertext(L) + + if(!entry) + continue + + var/datum/config_entry/E = _entries[entry] + if(!E) + log_config("Unknown setting in configuration: '[entry]'") + continue + + if(filename != E.resident_file) + log_config("Found [entry] in [filename] when it should have been in [E.resident_file]! Ignoring.") + continue + + var/validated = E.ValidateAndSet(value) + if(!validated) + log_config("Failed to validate setting \"[value]\" for [entry]") + else if(E.modified && !E.dupes_allowed) + log_config("Duplicate setting for [entry] ([value]) detected! Using latest.") + + if(validated) + E.modified = TRUE + +/datum/controller/configuration/can_vv_get(var_name) + return (var_name != "entries_by_type" || !hiding_entries_by_type) && ..() + +/datum/controller/configuration/vv_edit_var(var_name, var_value) + return !(var_name in list("entries_by_type", "entries")) && ..() + +/datum/controller/configuration/stat_entry() + if(!statclick) + statclick = new/obj/effect/statclick/debug(null, "Edit", src) + stat("[name]:", statclick) + +/datum/controller/configuration/proc/Get(entry_type) + if(IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Get" && GLOB.LastAdminCalledTargetRef == "\ref[src]") + log_admin_private("Config access of [entry_type] attempted by [key_name(usr)]") + return + var/datum/config_entry/E = entry_type + var/entry_is_abstract = initial(E.abstract_type) == entry_type + if(entry_is_abstract) + CRASH("Tried to retrieve an abstract config_entry: [entry_type]") + E = entries_by_type[entry_type] + if(!E) + CRASH("Missing config entry for [entry_type]!") + return E.value + +/datum/controller/configuration/proc/Set(entry_type, new_val) + if(IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Set" && GLOB.LastAdminCalledTargetRef == "\ref[src]") + log_admin_private("Config rewrite of [entry_type] to [new_val] attempted by [key_name(usr)]") + return + var/datum/config_entry/E = entry_type + var/entry_is_abstract = initial(E.abstract_type) == entry_type + if(entry_is_abstract) + CRASH("Tried to retrieve an abstract config_entry: [entry_type]") + E = entries_by_type[entry_type] + if(!E) + CRASH("Missing config entry for [entry_type]!") + return E.ValidateAndSet(new_val) + +/datum/controller/configuration/proc/LoadModes() + gamemode_cache = typecacheof(/datum/game_mode, TRUE) + modes = list() + mode_names = list() + mode_reports = list() + mode_false_report_weight = list() + votable_modes = list() + var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability) + for(var/T in gamemode_cache) + // I wish I didn't have to instance the game modes in order to look up + // their information, but it is the only way (at least that I know of). + var/datum/game_mode/M = new T() + + if(M.config_tag) + if(!(M.config_tag in modes)) // ensure each mode is added only once + modes += M.config_tag + mode_names[M.config_tag] = M.name + probabilities[M.config_tag] = M.probability + mode_reports[M.config_tag] = M.generate_report() + mode_false_report_weight[M.config_tag] = M.false_report_weight + if(M.votable) + votable_modes += M.config_tag + qdel(M) + votable_modes += "secret" + +/datum/controller/configuration/proc/loadmaplist(filename) + filename = "[GLOB.config_dir][filename]" + var/list/Lines = world.file2list(filename) + + var/datum/map_config/currentmap = null + for(var/t in Lines) + if(!t) + continue + + t = trim(t) + if(length(t) == 0) + continue + else if(copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/command = null + var/data = null + + if(pos) + command = lowertext(copytext(t, 1, pos)) + data = copytext(t, pos + 1) + else + command = lowertext(t) + + if(!command) + continue + + if (!currentmap && command != "map") + continue + + switch (command) + if ("map") + currentmap = new ("_maps/[data].json") + if(currentmap.defaulted) + log_config("Failed to load map config for [data]!") + if ("minplayers","minplayer") + currentmap.config_min_users = text2num(data) + if ("maxplayers","maxplayer") + currentmap.config_max_users = text2num(data) + if ("weight","voteweight") + currentmap.voteweight = text2num(data) + if ("default","defaultmap") + defaultmap = currentmap + if ("endmap") + LAZYINITLIST(maplist) + maplist[currentmap.map_name] = currentmap + currentmap = null + if ("disabled") + currentmap = null + else + WRITE_FILE(GLOB.config_error_log, "Unknown command in map vote config: '[command]'") + + +/datum/controller/configuration/proc/pick_mode(mode_name) + // I wish I didn't have to instance the game modes in order to look up + // their information, but it is the only way (at least that I know of). + // ^ This guy didn't try hard enough + for(var/T in gamemode_cache) + var/datum/game_mode/M = T + var/ct = initial(M.config_tag) + if(ct && ct == mode_name) + return new T + return new /datum/game_mode/extended() + +/datum/controller/configuration/proc/get_runnable_modes() + var/list/datum/game_mode/runnable_modes = new + var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability) + var/list/min_pop = Get(/datum/config_entry/keyed_number_list/min_pop) + var/list/max_pop = Get(/datum/config_entry/keyed_number_list/max_pop) + var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust) + for(var/T in gamemode_cache) + var/datum/game_mode/M = new T() + if(!(M.config_tag in modes)) + qdel(M) + continue + if(probabilities[M.config_tag]<=0) + qdel(M) + continue + if(min_pop[M.config_tag]) + M.required_players = min_pop[M.config_tag] + if(max_pop[M.config_tag]) + M.maximum_players = max_pop[M.config_tag] + if(M.can_start()) + var/final_weight = probabilities[M.config_tag] + if(SSpersistence.saved_modes.len == 3 && repeated_mode_adjust.len == 3) + var/recent_round = min(SSpersistence.saved_modes.Find(M.config_tag),3) + var/adjustment = 0 + while(recent_round) + adjustment += repeated_mode_adjust[recent_round] + recent_round = SSpersistence.saved_modes.Find(M.config_tag,recent_round+1,0) + final_weight *= ((100-adjustment)/100) + runnable_modes[M] = final_weight + return runnable_modes + +/datum/controller/configuration/proc/get_runnable_midround_modes(crew) + var/list/datum/game_mode/runnable_modes = new + var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability) + var/list/min_pop = Get(/datum/config_entry/keyed_number_list/min_pop) + var/list/max_pop = Get(/datum/config_entry/keyed_number_list/max_pop) + for(var/T in (gamemode_cache - SSticker.mode.type)) + var/datum/game_mode/M = new T() + if(!(M.config_tag in modes)) + qdel(M) + continue + if(probabilities[M.config_tag]<=0) + qdel(M) + continue + if(min_pop[M.config_tag]) + M.required_players = min_pop[M.config_tag] + if(max_pop[M.config_tag]) + M.maximum_players = max_pop[M.config_tag] + if(M.required_players <= crew) + if(M.maximum_players >= 0 && M.maximum_players < crew) + continue + runnable_modes[M] = probabilities[M.config_tag] + return runnable_modes diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index f8131ec5c7..cb5ce19d68 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -96,10 +96,16 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that to_chat(usr, .) SSblackbox.add_details("admin_verb","Advanced ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -GLOBAL_VAR_INIT(AdminProcCaller, null) +GLOBAL_VAR(AdminProcCaller) GLOBAL_PROTECT(AdminProcCaller) GLOBAL_VAR_INIT(AdminProcCallCount, 0) GLOBAL_PROTECT(AdminProcCallCount) +GLOBAL_VAR(LastAdminCalledTargetRef) +GLOBAL_PROTECT(LastAdminCalledTargetRef) +GLOBAL_VAR(LastAdminCalledTarget) +GLOBAL_PROTECT(LastAdminCalledTarget) +GLOBAL_VAR(LastAdminCalledProc) +GLOBAL_PROTECT(LastAdminCalledProc) /proc/WrapAdminProcCall(target, procname, list/arguments) var/current_caller = GLOB.AdminProcCaller @@ -108,6 +114,9 @@ GLOBAL_PROTECT(AdminProcCallCount) to_chat(usr, "Another set of admin called procs are still running, your proc will be run after theirs finish.") UNTIL(!GLOB.AdminProcCaller) to_chat(usr, "Running your proc") + GLOB.LastAdminCalledProc = procname + if(target != GLOBAL_PROC) + GLOB.LastAdminCalledTargetRef = "\ref[target]" GLOB.AdminProcCaller = ckey //if this runtimes, too bad for you ++GLOB.AdminProcCallCount . = world.WrapAdminProcCall(target, procname, arguments) From 3ec5a637e53757e15b7e655e1c983c45c10785e5 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 30 Sep 2017 17:29:32 +0200 Subject: [PATCH 131/136] Fixes dresser being unattackable (#31123) --- code/game/objects/structures/dresser.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index f52df98ad4..4e891d047f 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -13,6 +13,8 @@ if(do_after(user, 20, target = src)) to_chat(user, "You successfully [anchored ? "unwrench" : "wrench"] [src].") anchored = !anchored + else + return ..() /obj/structure/dresser/deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/mineral/wood (get_turf(src), 10) From f79ad840b23f72ea512aa7f5e487febaaee527a9 Mon Sep 17 00:00:00 2001 From: Raeschen Date: Sat, 30 Sep 2017 16:30:36 +0100 Subject: [PATCH 133/136] Changes MIN_AGE to be in line with server rule 0 --- code/_compile_options.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 964c956eca..86d96a9bfe 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -33,7 +33,7 @@ #define MAX_CHARTER_LEN 80 //MINOR TWEAKS/MISC -#define AGE_MIN 17 //youngest a character can be +#define AGE_MIN 18 //youngest a character can be #define AGE_MAX 85 //oldest a character can be #define WIZARD_AGE_MIN 30 //youngest a wizard can be #define SHOES_SLOWDOWN 0 //How much shoes slow you down by default. Negative values speed you up From 3b9e2be10627902974752efede66cc30062c3f55 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 30 Sep 2017 11:55:56 -0500 Subject: [PATCH 134/136] Automatic changelog generation for PR #3024 [ci skip] --- html/changelogs/AutoChangeLog-pr-3024.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3024.yml diff --git a/html/changelogs/AutoChangeLog-pr-3024.yml b/html/changelogs/AutoChangeLog-pr-3024.yml new file mode 100644 index 0000000000..cb263b6ffe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3024.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Paperwork now uses Markdown instead of BBCode, see the writing help for changes." From d6b3c59eb3859dea3df07e8d6d547ed50c83bb7a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 30 Sep 2017 11:56:22 -0500 Subject: [PATCH 135/136] Automatic changelog generation for PR #3028 [ci skip] --- html/changelogs/AutoChangeLog-pr-3028.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3028.yml diff --git a/html/changelogs/AutoChangeLog-pr-3028.yml b/html/changelogs/AutoChangeLog-pr-3028.yml new file mode 100644 index 0000000000..c0892a94d1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3028.yml @@ -0,0 +1,4 @@ +author: "Raeschen" +delete-after: True +changes: + - tweak: "Changed MIN_AGE to 18" From 1a6cce145f749f9ca20ea6c08a7e8eaf5df0e1e5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 30 Sep 2017 11:57:54 -0500 Subject: [PATCH 136/136] Automatic changelog generation for PR #2996 [ci skip] --- html/changelogs/AutoChangeLog-pr-2996.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2996.yml diff --git a/html/changelogs/AutoChangeLog-pr-2996.yml b/html/changelogs/AutoChangeLog-pr-2996.yml new file mode 100644 index 0000000000..2ab98f3845 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2996.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - spellcheck: "You can now find out if an item uses alt-clicking by examining it."
  • ") + while(listlevel < count_w) + line = "
      " + line + listlevel++ + while(listlevel > count_w) + line = "
    " + line + listlevel-- + + else while(listlevel >= 0) + line = "" + line + listlevel-- + + tlist[i] = line + // end for + + t = tlist[1] + for(var/i = 2, i <= tlistlen, i++) + t += "\n" + tlist[i] + + while(listlevel >= 0) + t += "" + listlevel-- + + else + t = replacetext(t, "((", "") + t = replacetext(t, "))", "") + + // Parse headers + + t = replacetext(t, regex("^#(?!#) ?(.+)$", "gm"), "

    $1

    ") + t = replacetext(t, regex("^##(?!#) ?(.+)$", "gm"), "

    $1

    ") + t = replacetext(t, regex("^###(?!#) ?(.+)$", "gm"), "

    $1

    ") + t = replacetext(t, regex("^#### ?(.+)$", "gm"), "
    $1
    ") + + // Parse most rules + + t = replacetext(t, regex("\\*(\[^\\*\]*)\\*", "g"), "$1") + t = replacetext(t, regex("_(\[^_\]*)_", "g"), "$1") + t = replacetext(t, "", "!") + t = replacetext(t, "
    ", "!") + t = replacetext(t, regex("\\!(\[^\\!\]+)\\!", "g"), "$1") + t = replacetext(t, regex("\\^(\[^\\^\]+)\\^", "g"), "$1") + t = replacetext(t, regex("\\|(\[^\\|\]+)\\|", "g"), "
    $1
    ") + t = replacetext(t, "!", "
    ") + + return t + +/proc/parsemarkdown_basic_step2(t) + if(length(t) <= 0) + return + + // Restore the single characters used + + t = replacetext(t, "$a", "!") + + // Redo the escaping + + t = replacetext(t, "$1", "\\") + t = replacetext(t, "$2", "**") + t = replacetext(t, "$3", "*") + t = replacetext(t, "$4", "__") + t = replacetext(t, "$5", "_") + t = replacetext(t, "$6", "^") + t = replacetext(t, "$7", "((") + t = replacetext(t, "$8", "))") + t = replacetext(t, "$9", "|") + t = replacetext(t, "$0", "%") + t = replacetext(t, "$-", "$") + + return t + +/proc/parsemarkdown_basic(t, limited=FALSE) + t = parsemarkdown_basic_step1(t, limited) + t = parsemarkdown_basic_step2(t) + return t + +/proc/parsemarkdown(t, mob/user=null, limited=FALSE) + if(length(t) <= 0) + return + + // Premanage whitespace + + t = replacetext(t, regex("\[^\\S\\r\\n \]", "g"), " ") + + t = parsemarkdown_basic_step1(t) + + t = replacetext(t, regex("%s(?:ign)?(?=\\s|$)", "igm"), user ? "[user.real_name]" : "") + t = replacetext(t, regex("%f(?:ield)?(?=\\s|$)", "igm"), "") + + t = parsemarkdown_basic_step2(t) + + // Manage whitespace + + t = replacetext(t, regex("(?:\\r\\n?|\\n)", "g"), "
    ") + + t = replacetext(t, " ", "  ") + + // Done return t diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index f50ddbdf7e..204ae83c9d 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -305,7 +305,7 @@ GLOBAL_LIST_EMPTY(allCasters) dat+="Creating new Feed Message..." dat+="
    Receiving Channel: [channel_name]
    " dat+="Message Author: [scanned_user]
    " - dat+="Message Body:
    [parsepencode(msg, user, SIGNFONT)]
    " + dat+="Message Body:
    [parsemarkdown(msg, user)]
    " dat+="Attach Photo: [(photo ? "Photo Attached" : "No Photo")]
    " dat+="Comments [allow_comments ? "Enabled" : "Disabled"]
    " dat+="
    Submit

    Cancel
    " @@ -555,7 +555,7 @@ GLOBAL_LIST_EMPTY(allCasters) if(msg =="" || msg=="\[REDACTED\]" || scanned_user == "Unknown" || channel_name == "" ) screen=6 else - GLOB.news_network.SubmitArticle("[parsepencode(msg, usr, SIGNFONT)]", scanned_user, channel_name, photo, 0, allow_comments) + GLOB.news_network.SubmitArticle("[parsemarkdown(msg, usr)]", scanned_user, channel_name, photo, 0, allow_comments) SSblackbox.inc("newscaster_stories",1) screen=4 msg = "" diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 2e7163bfa1..f573518000 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -433,7 +433,7 @@ GLOBAL_LIST_EMPTY(PDAs) if (in_range(src, U) && loc == U) if (mode == 1 && n) note = n - notehtml = parsepencode(n, U, SIGNFONT) + notehtml = parsemarkdown(n, U) notescanned = 0 else U << browse(null, "window=pda") diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm index 4a94090ed4..f42174320e 100644 --- a/code/modules/modular_computers/file_system/programs/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/file_browser.dm @@ -170,12 +170,19 @@ t = replacetext(t, "\[td\]", "") t = replacetext(t, "\[cell\]", "") t = replacetext(t, "\[tab\]", "    ") + + t = parsemarkdown_basic(t) + return t /datum/computer_file/program/filemanager/proc/prepare_printjob(t) // Additional stuff to parse if we want to print it and make a happy Head of Personnel. Forms FTW. t = replacetext(t, "\[field\]", "") t = replacetext(t, "\[sign\]", "") + t = parse_tags(t) + + t = replacetext(t, regex("(?:%s(?:ign)|%f(?:ield))(?=\\s|$)", "ig"), "") + return t /datum/computer_file/program/filemanager/ui_data(mob/user) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index e3d6154606..229b28a030 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -187,47 +187,15 @@ if(length(t) < 1) //No input means nothing needs to be parsed return -// t = copytext(sanitize(t),1,MAX_MESSAGE_LEN) - - t = replacetext(t, "\[center\]", "
    ") - t = replacetext(t, "\[/center\]", "
    ") - t = replacetext(t, "\[br\]", "
    ") - t = replacetext(t, "\n", "
    ") - t = replacetext(t, "\[b\]", "") - t = replacetext(t, "\[/b\]", "") - t = replacetext(t, "\[i\]", "") - t = replacetext(t, "\[/i\]", "") - t = replacetext(t, "\[u\]", "") - t = replacetext(t, "\[/u\]", "") - t = replacetext(t, "\[large\]", "") - t = replacetext(t, "\[/large\]", "") - t = replacetext(t, "\[sign\]", "[user.real_name]") - t = replacetext(t, "\[field\]", "") - t = replacetext(t, "\[tab\]", "    ") + t = parsemarkdown(t, user, iscrayon) if(!iscrayon) - t = replacetext(t, "\[*\]", "