From 37c1cf502eb9752803c77f4175143d1d8597b2ca Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 26 Jul 2017 15:45:14 -0500 Subject: [PATCH 001/164] Adds info about schema versioning to head of db changelog file --- SQL/database_changelog.txt.rej | 15 +++++++++++++++ code/world.dm | 20 ++++++++++---------- 2 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 SQL/database_changelog.txt.rej diff --git a/SQL/database_changelog.txt.rej b/SQL/database_changelog.txt.rej new file mode 100644 index 0000000000..1b201ec4aa --- /dev/null +++ b/SQL/database_changelog.txt.rej @@ -0,0 +1,15 @@ +diff a/SQL/database_changelog.txt b/SQL/database_changelog.txt (rejected hunks) +@@ -1,10 +1,10 @@ + Any time you make a change to the schema files, remember to increment the database schema version. Generally increment the minor number, major should be reserved for significant changes to the schema. Both values go up to 255. + +-The latest database version is 3.1; The query to update the schema revision table is: ++The latest database version is 3.0; The query to update the schema revision table is: + +-UPDATE `schema_revision` SET major = 3, minor = 1 LIMIT 1; ++INSERT INTO `schema_revision` (`major`, `minor`) VALUES (3, 0); + or +-UPDATE `SS13_schema_revision` SET major = 3, minor = 1 LIMIT 1; ++INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (3, 0); + + ---------------------------------------------------- + diff --git a/code/world.dm b/code/world.dm index b6badeb348..1fe2b5f25d 100644 --- a/code/world.dm +++ b/code/world.dm @@ -59,16 +59,16 @@ if(config.sql_enabled) if(SSdbcore.Connect()) log_world("Database connection established.") - var/datum/DBQuery/db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_version")]") - db_version.Execute() - if(db_version.NextRow()) - var/db_major = db_version.item[1] - var/db_minor = db_version.item[2] + var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_version")] ORDER BY date DESC LIMIT 1") + query_db_version.Execute() + if(query_db_version.NextRow()) + var/db_major = query_db_version.item[1] + var/db_minor = query_db_version.item[2] if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION) - message_admins("db schema ([db_major].[db_minor]) is behind latest tg schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") - log_sql("db schema ([db_major].[db_minor]) is behind latest tg schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") + message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") + log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") else - message_admins("Could not get schema version from db") + message_admins("Could not get schema version from database") else log_world("Your server failed to establish a connection with the database.") @@ -105,10 +105,10 @@ /world/Topic(T, addr, master, key) var/list/input = params2list(T) - + var/pinging = ("ping" in input) var/playing = ("players" in input) - + if(!pinging && !playing && config && config.log_world_topic) GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]" From 79e6963aca4951cf523945d1478d1eb38acf921d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 30 Jul 2017 19:58:28 -0500 Subject: [PATCH 002/164] Hallucinations 3.0 --- code/__DEFINES/logging.dm.rej | 9 + code/datums/datumvars.dm | 20 ++ .../diseases/advance/symptoms/hallucigen.dm | 2 +- code/game/machinery/doors/airlock.dm | 10 +- code/game/objects/effects/mines.dm | 2 +- code/modules/admin/admin_investigate.dm.rej | 10 + code/modules/flufftext/Hallucination.dm | 212 +++++++++------- code/modules/flufftext/Hallucination.dm.rej | 209 ++++++++++++++++ code/modules/mob/living/carbon/carbon.dm | 7 + code/modules/mob/living/carbon/life.dm | 3 +- .../simple_animal/guardian/types/fire.dm | 2 +- code/modules/mob/mob_helpers.dm | 3 + .../modules/projectiles/projectile/special.dm | 229 ++++++++++++++++++ .../chemistry/machinery/chem_dispenser.dm | 12 +- code/modules/surgery/organs/vocal_cords.dm | 5 +- strings/hallucination.json | 229 ++++++++++++++++++ 16 files changed, 866 insertions(+), 98 deletions(-) create mode 100644 code/__DEFINES/logging.dm.rej create mode 100644 code/modules/admin/admin_investigate.dm.rej create mode 100644 code/modules/flufftext/Hallucination.dm.rej create mode 100644 strings/hallucination.json diff --git a/code/__DEFINES/logging.dm.rej b/code/__DEFINES/logging.dm.rej new file mode 100644 index 0000000000..6a7a358a9c --- /dev/null +++ b/code/__DEFINES/logging.dm.rej @@ -0,0 +1,9 @@ +diff a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm (rejected hunks) +@@ -9,6 +9,7 @@ + #define INVESTIGATE_SUPERMATTER "supermatter" + #define INVESTIGATE_TELESCI "telesci" + #define INVESTIGATE_WIRES "wires" ++#define INVESTIGATE_HALLUCINATIONS "hallucinations" + + //Individual logging defines + #define INDIVIDUAL_ATTACK_LOG "Attack log" diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 60f932a88a..3672b850ca 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -929,6 +929,26 @@ manipulate_organs(C) href_list["datumrefresh"] = href_list["editorgans"] + else if(href_list["hallucinate"]) + if(!check_rights(0)) + return + + var/mob/living/carbon/C = locate(href_list["hallucinate"]) in GLOB.mob_list + if(!istype(C)) + to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + return + + var/list/hallucinations = subtypesof(/datum/hallucination) + var/result = input(usr, "Choose the hallucination to apply","Send Hallucination") as null|anything in hallucinations + if(!usr) + return + if(QDELETED(C)) + to_chat(usr, "Mob doesn't exist anymore") + return + + if(result) + new result(C, TRUE) + else if(href_list["makehuman"]) if(!check_rights(R_SPAWN)) return diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm index f913d49573..9bfd5b0baf 100644 --- a/code/datums/diseases/advance/symptoms/hallucigen.dm +++ b/code/datums/diseases/advance/symptoms/hallucigen.dm @@ -59,4 +59,4 @@ Bonus else if(prob(base_message_chance)) to_chat(M, "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]") - M.hallucination += (15 * power) + M.hallucination += (45 * power) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 624d853808..94047727bc 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -233,9 +233,13 @@ return else /*if(src.justzap)*/ return - else if(user.hallucination > 50 && ishuman(user) && prob(10) && src.operating == FALSE) - hallucinate_shock(user) - return + else if(user.hallucinating() && ishuman(user) && prob(4) && !operating) + var/mob/living/carbon/human/H = user + if(H.gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(G.siemens_coefficient)//not insulated + hallucinate_shock(H) + return if (cyclelinkedairlock) if (!shuttledocked && !emergency && !cyclelinkedairlock.shuttledocked && !cyclelinkedairlock.emergency && allowed(user)) if(cyclelinkedairlock.operating) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index c9b524836f..005d9c7595 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -127,7 +127,7 @@ var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0) spawn(0) - new /obj/effect/hallucination/delusion(victim.loc,victim,"demon",duration,0) + new /datum/hallucination/delusion(victim, TRUE, "demon",duration,0) var/obj/item/weapon/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc) chainsaw.flags |= NODROP diff --git a/code/modules/admin/admin_investigate.dm.rej b/code/modules/admin/admin_investigate.dm.rej new file mode 100644 index 0000000000..4f8c142c61 --- /dev/null +++ b/code/modules/admin/admin_investigate.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm (rejected hunks) +@@ -5,7 +5,7 @@ + F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
" + + +-/client/proc/investigate_show(subject in list("hrefs","notes, memos, watchlist", INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY) ) ++/client/proc/investigate_show(subject in list("hrefs","notes, memos, watchlist", INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS) ) + set name = "Investigate" + set category = "Admin" + if(!holder) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 0b1187e9bc..6ae32a9d6a 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -11,6 +11,8 @@ Gunshots/explosions/opening doors/less rare audio (done) */ +#define HAL_LINES_FILE "hallucination.json" + /mob/living/carbon var/image/halimage var/image/halbody @@ -64,13 +66,14 @@ Gunshots/explosions/opening doors/less rare audio (done) var/col_mod = null var/image/current_image = null var/image_layer = MOB_LAYER - var/active = 1 //qdelery + var/active = TRUE //qdelery /obj/effect/hallucination/simple/Initialize(mapload, var/mob/living/carbon/T) ..() target = T current_image = GetImage() - if(target.client) target.client.images |= current_image + if(target.client) + target.client.images |= current_image /obj/effect/hallucination/simple/proc/GetImage() var/image/I = image(image_icon,src,image_state,image_layer,dir=src.dir) @@ -82,10 +85,12 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/simple/proc/Show(update=1) if(active) - if(target.client) target.client.images.Remove(current_image) + if(target.client) + target.client.images.Remove(current_image) if(update) current_image = GetImage() - if(target.client) target.client.images |= current_image + if(target.client) + target.client.images |= current_image /obj/effect/hallucination/simple/update_icon(new_state,new_icon,new_px=0,new_py=0) image_state = new_state @@ -101,36 +106,39 @@ Gunshots/explosions/opening doors/less rare audio (done) Show() /obj/effect/hallucination/simple/Destroy() - if(target.client) target.client.images.Remove(current_image) - active = 0 + if(target.client) + target.client.images.Remove(current_image) + active = FALSE return ..() #define FAKE_FLOOD_EXPAND_TIME 20 #define FAKE_FLOOD_MAX_RADIUS 10 -/obj/effect/hallucination/fake_flood +/datum/hallucination/fake_flood //Plasma starts flooding from the nearby vent + var/turf/center var/list/flood_images = list() var/list/turf/flood_turfs = list() var/image_icon = 'icons/effects/tile_effects.dmi' var/image_state = "plasma" var/radius = 0 var/next_expand = 0 + cost = 25 -/obj/effect/hallucination/fake_flood/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/fake_flood/New(mob/living/carbon/T, forced = TRUE) ..() - target = T for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) if(!U.welded) - src.loc = U.loc + center = get_turf(U) break - flood_images += image(image_icon,src,image_state,MOB_LAYER) - flood_turfs += get_turf(src.loc) + feedback_details += "Vent Coords: [center.x],[center.y],[center.z]" + flood_images += image(image_icon,center,image_state,MOB_LAYER) + flood_turfs += center if(target.client) target.client.images |= flood_images next_expand = world.time + FAKE_FLOOD_EXPAND_TIME START_PROCESSING(SSobj, src) -/obj/effect/hallucination/fake_flood/process() +/datum/hallucination/fake_flood/process() if(next_expand <= world.time) radius++ if(radius > FAKE_FLOOD_MAX_RADIUS) @@ -138,10 +146,10 @@ Gunshots/explosions/opening doors/less rare audio (done) return Expand() if((get_turf(target) in flood_turfs) && !target.internal) - target.hallucinate("fake_alert", "tox_in_air") + new /datum/hallucination/fake_alert(target, TRUE, "tox_in_air") next_expand = world.time + FAKE_FLOOD_EXPAND_TIME -/obj/effect/hallucination/fake_flood/proc/Expand() +/datum/hallucination/fake_flood/proc/Expand() for(var/turf/FT in flood_turfs) for(var/dir in GLOB.cardinals) var/turf/T = get_step(FT, dir) @@ -152,7 +160,7 @@ Gunshots/explosions/opening doors/less rare audio (done) if(target.client) target.client.images |= flood_images -/obj/effect/hallucination/fake_flood/Destroy() +/datum/hallucination/fake_flood/Destroy() STOP_PROCESSING(SSobj, src) qdel(flood_turfs) flood_turfs = list() @@ -167,7 +175,7 @@ Gunshots/explosions/opening doors/less rare audio (done) image_icon = 'icons/mob/alien.dmi' image_state = "alienh_pounce" -/obj/effect/hallucination/simple/xeno/Initialize(mapload, var/mob/living/carbon/T) +/obj/effect/hallucination/simple/xeno/Initialize(mapload, mob/living/carbon/T) ..() name = "alien hunter ([rand(1, 1000)])" @@ -177,18 +185,19 @@ Gunshots/explosions/opening doors/less rare audio (done) target.Knockdown(100) target.visible_message("[target] flails around wildly.","[name] pounces on you!") -/obj/effect/hallucination/xeno_attack +/datum/hallucination/xeno_attack //Xeno crawls from nearby vent,jumps at you, and goes back in var/obj/machinery/atmospherics/components/unary/vent_pump/pump = null var/obj/effect/hallucination/simple/xeno/xeno = null + cost = 25 -/obj/effect/hallucination/xeno_attack/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/xeno_attack/New(mob/living/carbon/T, forced = TRUE) ..() - target = T for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) if(!U.welded) pump = U break + feedback_details += "Vent Coords: [pump.x],[pump.y],[pump.z]" if(pump) xeno = new(pump.loc,target) sleep(10) @@ -200,7 +209,7 @@ Gunshots/explosions/opening doors/less rare audio (done) sleep(10) var/xeno_name = xeno.name to_chat(target, "[xeno_name] begins climbing into the ventilation system...") - sleep(10) + sleep(30) qdel(xeno) to_chat(target, "[xeno_name] scrambles into the ventilation ducts!") qdel(src) @@ -209,7 +218,7 @@ Gunshots/explosions/opening doors/less rare audio (done) image_icon = 'icons/mob/animal.dmi' image_state = "clown" -/obj/effect/hallucination/simple/clown/Initialize(mapload, var/mob/living/carbon/T,duration) +/obj/effect/hallucination/simple/clown/Initialize(mapload, mob/living/carbon/T, duration) ..(loc, T) name = pick(GLOB.clown_names) QDEL_IN(src,duration) @@ -256,20 +265,21 @@ Gunshots/explosions/opening doors/less rare audio (done) image_state = "bubblegum" px = -32 -/obj/effect/hallucination/oh_yeah +/datum/hallucination/oh_yeah var/obj/effect/hallucination/simple/bubblegum/bubblegum var/image/fakebroken var/image/fakerune + cost = 75 -/obj/effect/hallucination/oh_yeah/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/oh_yeah/New(mob/living/carbon/T, forced = TRUE) . = ..() - target = T var/turf/closed/wall/wall for(var/turf/closed/wall/W in range(7,target)) wall = W break if(!wall) return INITIALIZE_HINT_QDEL + feedback_details += "Source: [wall.x],[wall.y],[wall.z]" fakebroken = image('icons/turf/floors.dmi', wall, "plating", layer = TURF_LAYER) var/turf/landing = get_turf(target) @@ -283,7 +293,7 @@ Gunshots/explosions/opening doors/less rare audio (done) bubblegum = new(wall, target) addtimer(CALLBACK(src, .proc/bubble_attack, landing), 10) -/obj/effect/hallucination/oh_yeah/proc/bubble_attack(turf/landing) +/datum/hallucination/oh_yeah/proc/bubble_attack(turf/landing) var/charged = FALSE //only get hit once while(get_turf(bubblegum) != landing && target && target.stat != DEAD) bubblegum.forceMove(get_step_towards(bubblegum, landing)) @@ -301,7 +311,7 @@ Gunshots/explosions/opening doors/less rare audio (done) sleep(30) qdel(src) -/obj/effect/hallucination/oh_yeah/Destroy() +/datum/hallucination/oh_yeah/Destroy() if(target.client) target.client.images.Remove(fakebroken) target.client.images.Remove(fakerune) @@ -310,23 +320,24 @@ Gunshots/explosions/opening doors/less rare audio (done) QDEL_NULL(bubblegum) return ..() -/obj/effect/hallucination/singularity_scare +/datum/hallucination/singularity_scare //Singularity moving towards you. //todo Hide where it moved with fake space images var/obj/effect/hallucination/simple/singularity/s = null + cost = 75 -/obj/effect/hallucination/singularity_scare/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/singularity_scare/New(mob/living/carbon/T, forced = TRUE) ..() - target = T var/turf/start = get_turf(T) var/screen_border = pick(SOUTH,EAST,WEST,NORTH) - for(var/i = 0,i<11,i++) + for(var/i in 1 to 13) start = get_step(start,screen_border) + feedback_details += "Source: [start.x],[start.y],[start.z]" s = new(start,target) s.parent = src - for(var/i = 0,i<11,i++) - sleep(5) - s.loc = get_step(get_turf(s),get_dir(s,target)) + for(var/i in 1 to 13) + sleep(10) + s.forceMove(get_step(get_turf(s),get_dir(s,target))) s.Show() s.Eat() qdel(s) @@ -337,64 +348,72 @@ Gunshots/explosions/opening doors/less rare audio (done) image_layer = MASSIVE_OBJ_LAYER px = -96 py = -96 - var/obj/effect/hallucination/singularity_scare/parent + var/datum/hallucination/singularity_scare/parent /obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir) var/target_dist = get_dist(src,target) if(target_dist<=3) //"Eaten" - target.hal_screwyhud = SCREWYHUD_CRIT + target.set_screwyhud(SCREWYHUD_DEAD) target.SetUnconscious(160) - addtimer(CALLBACK(parent, .proc/wake_and_restore), rand(30, 50)) + addtimer(CALLBACK(parent, /datum/hallucination/.proc/wake_and_restore), rand(30, 50)) -/obj/effect/hallucination/battle +/datum/hallucination/battle + cost = 15 -/obj/effect/hallucination/battle/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/battle/New(mob/living/carbon/T, forced = TRUE, battle_type) ..() - target = T var/hits = rand(3,6) - switch(rand(1,5)) - if(1) //Laser fight - for(var/i=0,i...wabbajack...wabbajack...") - target.playsound_local(target,'sound/magic/staff_change.ogg', 50, 1, -1) + if(wabbajack) + to_chat(target, "...wabbajack...wabbajack...") + target.playsound_local(target,'sound/magic/staff_change.ogg', 50, 1) delusion = A target.client.images |= A QDEL_IN(src, duration) -/obj/effect/hallucination/self_delusion/Destroy() +/datum/hallucination/self_delusion/Destroy() if(target.client) target.client.images.Remove(delusion) return ..() -/obj/effect/hallucination/fakeattacker/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/fakeattacker/New(mob/living/carbon/T, forced = TRUE) ..() - target = T var/mob/living/carbon/human/clone = null var/clone_weapon = null @@ -523,6 +544,7 @@ Gunshots/explosions/opening doors/less rare audio (done) if(H.stat || H.lying) continue clone = H + feedback_details += "Clone of: [H.real_name]" break if(!clone) @@ -604,7 +626,7 @@ Gunshots/explosions/opening doors/less rare audio (done) for(var/mob/O in oviewers(world.view , my_target)) to_chat(O, "[my_target] stumbles around.") -/obj/effect/fake_attacker/Initialize(mapload, var/mob/living/carbon/T) +/obj/effect/fake_attacker/Initialize(mapload, mob/living/carbon/T) ..() my_target = T QDEL_IN(src, 300) @@ -651,7 +673,7 @@ Gunshots/explosions/opening doors/less rare audio (done) if(!locate(/obj/effect/overlay) in my_target.loc) fake_blood(my_target) else - my_target.playsound_local(my_target, pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'), 25, 1, -1) + my_target.playsound_local(my_target, pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'), 25, 1) my_target.show_message("[src.name] has punched [my_target]!", 1) my_target.staminaloss += 30 if(prob(33)) @@ -674,14 +696,15 @@ Gunshots/explosions/opening doors/less rare audio (done) QDEL_IN(O, 300) -/obj/effect/hallucination/bolts +/datum/hallucination/bolts var/list/doors = list() + cost = 25 -/obj/effect/hallucination/bolts/Initialize(mapload, var/mob/living/carbon/T,var/door_number=-1) //-1 for severe, 1-2 for subtle +/datum/hallucination/bolts/New(mob/living/carbon/T, forced, door_number=-1) //-1 for severe, 1-2 for subtle ..() - target = T var/image/I = null var/count = 0 + feedback_details += "Door amount: [door_number]" for(var/obj/machinery/door/airlock/A in range(7, target)) if(count>door_number && door_number>0) break @@ -700,13 +723,30 @@ Gunshots/explosions/opening doors/less rare audio (done) sleep(rand(6,12)) qdel(src) -/obj/effect/hallucination/whispers +/datum/hallucination/whispers + cost = 15 -/obj/effect/hallucination/whispers/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/whispers/New(mob/living/carbon/T, forced = TRUE) ..() - target = T - var/speak_messages = list("I'm watching you...","[target.first_name()]!","Get out!","Kchck-Chkck? Kchchck!","Did you hear that?","What did you do ?","Why?","Give me that!","HELP!!","EI NATH!!", "RUN!!", "Kill me!","O bidai nabora se'sma!", "[text2ratvar("Divinity, grant...")]") - var/radio_messages = list("Xenos!","Singularity loose!","Comms down!","They are arming the nuke!","They butchered Ian!","H-help!","[pick("Cult", "Wizard", "Ling", "Ops", "Revenant", "Murderer", "Harm", "I hear flashing", "Help")] in [pick(GLOB.teleportlocs)][prob(50)?"!":"!!"]","Where's [target.first_name()]?","Call the shuttle!","AI rogue!!") + var/speak_messages = list("[pick("I'm watching you...","I know what you're doing","What are you hiding?","I saw that")]",\ + "[pick("","Hey, ","Hi ","Hello ","Wait, ","It's ")][target.first_name()]!",\ + "[pick("Get out","Go away","Fuck off","OUT!")]",\ + "[pick("Kchck-Chkck? Kchchck!","EEEeeeeEEEE","#@§*&£","H-hhhhh...")]",\ + "[pick("Did you hear that?","Did you see that?","What was that?")]",\ + "[pick("Hail Ratvar","Hail Nar'Sie","Viva!","[generate_code_phrase()]","Are you mr. [pick(GLOB.possible_changeling_IDs)]?")]",\ + "[pick("Why?","What?","Wait, what?","Wait","Hold on","Uh...")]",\ + "Give me that!",\ + "HELP[pick(""," ME"," HIM"," HER"," THEM")]!!",\ + "RUN!!",\ + "I'm infected, [pick("stay away","don't get close","be careful","help me","kill me")]") + + var/radio_messages = list("Set [target.first_name()] to arrest!",\ + "[pick("Captain","Hos","Cmo","Rd","Ce","Hop","Janitor","AI","Viro","Qm","[target.first_name()]")] is [pick("rogue","cult","clockcult","a revhead","a gang leader","a traitor","a ling","dead")]!",\ + "Help!",\ + "[pick("Cult", "Wizard", "Blob", "Ling", "Ops", "Swarmers", "Revenant", "Traitor", "Harm", "I hear flashing", "Help")] in [pick(GLOB.teleportlocs)][prob(50)?"!":"!!"]",\ + "Where's [target.first_name()]?"\ + ,"[pick("C","Ai, c","Someone c","Rec")]all the shuttle!"\ + ,"AI [pick("rogue", "is dead")]!!") var/list/mob/living/carbon/people = list() var/list/mob/living/carbon/person = null @@ -722,7 +762,9 @@ Gunshots/explosions/opening doors/less rare audio (done) people += H if(person) //Basic talk var/image/speech_overlay = image('icons/mob/talk.dmi', person, "default0", layer = ABOVE_MOB_LAYER) - to_chat(target, target.compose_message(person,understood_language,pick(speak_messages),null,person.get_spans())) + var/message = target.compose_message(person,understood_language,pick(speak_messages),null,person.get_spans()) + feedback_details += "Type: Talk, Source: [person.real_name], Message: [message]" + to_chat(target, message) if(target.client) target.client.images |= speech_overlay sleep(30) diff --git a/code/modules/flufftext/Hallucination.dm.rej b/code/modules/flufftext/Hallucination.dm.rej new file mode 100644 index 0000000000..78b5d879f2 --- /dev/null +++ b/code/modules/flufftext/Hallucination.dm.rej @@ -0,0 +1,209 @@ +diff a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm (rejected hunks) +@@ -60,9 +60,14 @@ GLOBAL_LIST_INIT(hallucinations_major, list( + var/halpick = pick(current) + new halpick(src, FALSE) + ++/mob/living/carbon/proc/set_screwyhud(hud_type) ++ hal_screwyhud = hud_type ++ update_health_hud() ++ + /datum/hallucination + var/mob/living/carbon/target + var/cost = 5 //affects the amount of hallucination reduced, and cooldown until the next hallucination ++ var/feedback_details //extra info for investigate + + /datum/hallucination/New(mob/living/carbon/T, forced = TRUE) + set waitfor = 0 +@@ -72,9 +77,13 @@ GLOBAL_LIST_INIT(hallucinations_major, list( + target.next_hallucination = world.time + (rand(cost * 0.5, cost * 3) * 10) + + /datum/hallucination/proc/wake_and_restore() +- target.hal_screwyhud = SCREWYHUD_NONE ++ target.set_screwyhud(SCREWYHUD_NONE) + target.SetSleeping(0) + ++/datum/hallucination/Destroy() ++ target.investigate_log("was afflicted with a hallucination of type [type]. [feedback_details]", INVESTIGATE_HALLUCINATIONS) ++ return ..() ++ + /obj/effect/hallucination + invisibility = INVISIBILITY_OBSERVER + var/mob/living/carbon/target = null +@@ -744,7 +771,9 @@ GLOBAL_LIST_INIT(hallucinations_major, list( + for(var/mob/living/carbon/human/H in GLOB.living_mob_list) + humans += H + person = pick(humans) +- to_chat(target, target.compose_message(person,understood_language,pick(radio_messages),"1459",person.get_spans())) ++ var/message = target.compose_message(person,understood_language,pick(radio_messages),"1459",person.get_spans()) ++ feedback_details += "Type: Radio, Source: [person.real_name], Message: [message]" ++ to_chat(target, message) + qdel(src) + + /datum/hallucination/message +@@ -763,43 +792,48 @@ GLOBAL_LIST_INIT(hallucinations_major, list( + "You're hallucinating.", \ + //Direct advice + "[pick_list_replacements(HAL_LINES_FILE, "advice")]") ++ feedback_details += "Message: [chosen]" + to_chat(target, chosen) + qdel(src) + + /datum/hallucination/sounds + cost = 15 + +-/datum/hallucination/sounds/New(mob/living/carbon/T, forced = TRUE) ++/datum/hallucination/sounds/New(mob/living/carbon/T, forced = TRUE, sound_type) + ..() ++ if(!sound_type) ++ sound_type = pick("airlock","explosion","far_explosion","glass","phone","summon_guns","alarm","beepsky","hallelujah","creepy","ratvar","shuttle_dock", ++ "wall_decon","door_hack","esword","blob_alert","tesla","malf_ai") ++ feedback_details += "Type: [sound_type]" + //Strange audio +- switch(rand(1,20)) +- if(1) ++ switch(sound_type) ++ if("airlock") + target.playsound_local(null,'sound/machines/airlock.ogg', 15, 1) +- if(2) ++ if("explosion") + if(prob(50)) + target.playsound_local(null,'sound/effects/explosion1.ogg', 50, 1) + else + target.playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1) +- if(3) ++ if("far_explosion") + target.playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1) +- if(4) ++ if("glass") + target.playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1) +- if(5) ++ if("phone") + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + sleep(15) + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + sleep(15) + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) +- if(6) ++ if("summon_guns") + target.playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1) +- if(7) ++ if("alarm") + target.playsound_local(null, 'sound/machines/alarm.ogg', 100, 0) +- if(8) ++ if("beepsky") + target.playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0) +- if(9) ++ if("hallelujah") + target.playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50) + //Rare audio +- if(10) ++ if("creepy") + //These sounds are (mostly) taken from Hidden: Source + var/static/list/hallucinations_creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\ + 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ +@@ -807,42 +841,42 @@ GLOBAL_LIST_INIT(hallucinations_major, list( + 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ + 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') + target.playsound_local(null, pick(hallucinations_creepyasssounds), 50, 1) +- if(11) ++ if("ratvar") + target.playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100) + sleep(150) + target.playsound_local(null, 'sound/effects/ratvar_reveal.ogg', 100) +- if(12) ++ if("shuttle_dock") + to_chat(target, "

Priority Announcement

") + to_chat(target, "

The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

") + target.playsound_local(null, 'sound/ai/shuttledock.ogg', 100) + //Deconstructing a wall +- if(13) ++ if("wall_decon") + target.playsound_local(null, 'sound/items/welder.ogg', 15, 1) + sleep(105) + target.playsound_local(null, 'sound/items/welder2.ogg', 15, 1) + sleep(15) + target.playsound_local(null, 'sound/items/ratchet.ogg', 15, 1) + //Hacking a door +- if(14) ++ if("door_hack") + target.playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1) + sleep(rand(10,30)) + for(var/i = rand(1,3), i>0, i--) + target.playsound_local(null, 'sound/weapons/empty.ogg', 15, 1) + sleep(rand(10,30)) + target.playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1) +- if(15) ++ if("esword") + target.playsound_local(null, 'sound/weapons/saberon.ogg',35,1) +- if(16) ++ if("blob_alert") + to_chat(target, "

Biohazard Alert

") + to_chat(target, "

Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.

") + target.playsound_local(null, 'sound/ai/outbreak5.ogg', 100, 0) +- if(17) //Tesla loose! ++ if("tesla") //Tesla loose! + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1) + sleep(20) + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1) + sleep(20) + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1) +- if(18) //AI is doomsdaying! ++ if("malf_ai") //AI is doomsdaying! + to_chat(target, "

Anomaly Alert

") + to_chat(target, "

Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.

") + target.playsound_local(null, 'sound/ai/aimalf.ogg', 100, 0) +@@ -854,9 +888,10 @@ GLOBAL_LIST_INIT(hallucinations_major, list( + /datum/hallucination/hudscrew/New(mob/living/carbon/T, forced = TRUE) + ..() + //Screwy HUD +- target.hal_screwyhud = pick(SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY) ++ target.set_screwyhud(pick(SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY)) ++ feedback_details += "Type: [target.hal_screwyhud]" + sleep(rand(100,250)) +- target.hal_screwyhud = SCREWYHUD_NONE ++ target.set_screwyhud(SCREWYHUD_NONE) + qdel(src) + + /datum/hallucination/fake_alert +@@ -867,6 +902,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list( + var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temphot","tempcold","pressure") + if(specific) + alert_type = specific ++ feedback_details += "Type: [alert_type]" + switch(alert_type) + if("oxy") + target.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy, override = TRUE) +@@ -962,6 +998,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list( + target.halitem.icon = 'icons/obj/grenade.dmi' + target.halitem.icon_state = "flashbang1" + target.halitem.name = "Flashbang" ++ feedback_details += "Type: [target.halitem.name]" + if(target.client) target.client.screen += target.halitem + QDEL_IN(target.halitem, rand(150, 350)) + qdel(src) +@@ -1006,7 +1043,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list( + /datum/hallucination/death/New(mob/living/carbon/T, forced = TRUE) + set waitfor = 0 + ..() +- target.hal_screwyhud = SCREWYHUD_DEAD ++ target.set_screwyhud(SCREWYHUD_DEAD) + target.Knockdown(300) + target.silent += 10 + var/area/area = get_area(target) +@@ -1025,7 +1062,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list( + to_chat(target, "DEAD: [fakemob.name] says, \"[pick("rip","hey [target.first_name()]","you too?","is the AI rogue?",\ + "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\"") + sleep(rand(70,90)) +- target.hal_screwyhud = SCREWYHUD_NONE ++ target.set_screwyhud(SCREWYHUD_NONE) + target.SetKnockdown(0) + target.silent = 0 + qdel(src) +@@ -1100,6 +1137,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list( + startlocs += T + var/turf/start = pick(startlocs) + var/proj_type = pick(subtypesof(/obj/item/projectile/hallucination)) ++ feedback_details += "Type: [proj_type]" + var/obj/item/projectile/hallucination/H = new proj_type(start) + target.playsound_local(start, H.hal_fire_sound, 60, 1) + H.hal_target = target diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 4415c0d7ab..cd5f179dd7 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -240,6 +240,12 @@ /mob/living/carbon/is_muzzled() return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) +/mob/living/carbon/hallucinating() + if(hallucination) + return TRUE + else + return FALSE + /mob/living/carbon/resist_buckle() if(restrained()) changeNext_move(CLICK_CD_BREAKOUT) @@ -811,3 +817,4 @@ .["Make AI"] = "?_src_=vars;makeai=\ref[src]" .["Modify bodypart"] = "?_src_=vars;editbodypart=\ref[src]" .["Modify organs"] = "?_src_=vars;editorgans=\ref[src]" + .["Hallucinate"] = "?_src_=vars;hallucinate=\ref[src]" diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 1d60ae4982..6bacfdd807 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -370,8 +370,7 @@ adjust_drugginess(-1) if(hallucination) - spawn handle_hallucinations() - hallucination = max(hallucination-2,0) + handle_hallucinations() //used in human and monkey handle_environment() /mob/living/carbon/proc/natural_bodytemperature_stabilization() diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm index b0a8ba5215..8f456abc53 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm @@ -21,7 +21,7 @@ /mob/living/simple_animal/hostile/guardian/fire/AttackingTarget() . = ..() if(. && ishuman(target) && target != summoner) - new /obj/effect/hallucination/delusion(target.loc,target,"custom",200,0, icon_state,icon) + new /datum/hallucination/delusion(target,TRUE,"custom",200,0, icon_state,icon) /mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj) ..() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index a704c2e43f..46f5db920b 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -325,6 +325,9 @@ It's fairly easy to fix if dealing with single letters but not so much with comp return B.eye_blind return 0 +/mob/proc/hallucinating() + return FALSE + /proc/is_special_character(mob/M) // returns 1 for special characters and 2 for heroes of gamemode //moved out of admins.dm because things other than admin procs were calling this. if(!SSticker.HasRoundStarted()) return 0 diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 4b1d5af6c4..5a8f49f45a 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -387,3 +387,232 @@ var/obj/effect/ebeam/B = b animate(B, alpha = 0, time = 32) return ..() + +/obj/item/projectile/hallucination + name = "bullet" + icon = null + icon_state = null + hitsound = "" + suppressed = TRUE + ricochets_max = 0 + ricochet_chance = 0 + damage = 0 + nodamage = TRUE + projectile_type = /obj/item/projectile/hallucination + log_override = TRUE + var/hal_icon_state + var/image/fake_icon + var/mob/living/carbon/hal_target + var/hal_fire_sound + var/hal_hitsound + var/hal_hitsound_wall + var/hal_impact_effect + var/hal_impact_effect_wall + var/hit_duration + var/hit_duration_wall + +/obj/item/projectile/hallucination/fire() + ..() + fake_icon = image('icons/obj/projectiles.dmi', src, hal_icon_state, ABOVE_MOB_LAYER) + if(hal_target.client) + hal_target.client.images += fake_icon + +/obj/item/projectile/hallucination/Destroy() + if(hal_target.client) + hal_target.client.images -= fake_icon + QDEL_NULL(fake_icon) + return ..() + +/obj/item/projectile/hallucination/Collide(atom/A) + if(!ismob(A)) + if(hal_hitsound_wall) + hal_target.playsound_local(loc, hal_hitsound_wall, 40, 1) + if(hal_impact_effect_wall) + spawn_hit(A, TRUE) + else if(A == hal_target) + if(hal_hitsound) + hal_target.playsound_local(A, hal_hitsound, 100, 1) + target_on_hit(A) + qdel(src) + return TRUE + +/obj/item/projectile/hallucination/proc/target_on_hit(mob/M) + if(M == hal_target) + to_chat(hal_target, "[M] is hit by \a [src] in the chest!") + hal_apply_effect() + else if(M in view(hal_target)) + to_chat(hal_target, "[M] is hit by \a [src] in the chest!!") + if(damage_type == BRUTE) + var/splatter_dir = dir + if(starting) + splatter_dir = get_dir(starting, get_turf(M)) + spawn_blood(M, splatter_dir) + else if(hal_impact_effect) + spawn_hit(M, FALSE) + +/obj/item/projectile/hallucination/proc/spawn_blood(mob/M, set_dir) + set waitfor = 0 + if(!hal_target.client) + return + + var/splatter_icon_state + if(set_dir in GLOB.diagonals) + splatter_icon_state = "splatter[pick(1, 2, 6)]" + else + splatter_icon_state = "splatter[pick(3, 4, 5)]" + + var/image/blood = image('icons/effects/blood.dmi', M, splatter_icon_state, ABOVE_MOB_LAYER) + var/target_pixel_x = 0 + var/target_pixel_y = 0 + switch(set_dir) + if(NORTH) + target_pixel_y = 16 + if(SOUTH) + target_pixel_y = -16 + layer = ABOVE_MOB_LAYER + if(EAST) + target_pixel_x = 16 + if(WEST) + target_pixel_x = -16 + if(NORTHEAST) + target_pixel_x = 16 + target_pixel_y = 16 + if(NORTHWEST) + target_pixel_x = -16 + target_pixel_y = 16 + if(SOUTHEAST) + target_pixel_x = 16 + target_pixel_y = -16 + layer = ABOVE_MOB_LAYER + if(SOUTHWEST) + target_pixel_x = -16 + target_pixel_y = -16 + layer = ABOVE_MOB_LAYER + hal_target.client.images += blood + animate(blood, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = 5) + sleep(5) + hal_target.client.images -= blood + qdel(blood) + +/obj/item/projectile/hallucination/proc/spawn_hit(atom/A, is_wall) + set waitfor = 0 + if(!hal_target.client) + return + + var/image/hit_effect = image('icons/effects/blood.dmi', A, is_wall ? hal_impact_effect_wall : hal_impact_effect, ABOVE_MOB_LAYER) + hit_effect.pixel_x = A.pixel_x + rand(-4,4) + hit_effect.pixel_y = A.pixel_y + rand(-4,4) + hal_target.client.images += hit_effect + sleep(is_wall ? hit_duration_wall : hit_duration) + hal_target.client.images -= hit_effect + qdel(hit_effect) + + +/obj/item/projectile/hallucination/proc/hal_apply_effect() + return + +/obj/item/projectile/hallucination/bullet + name = "bullet" + hal_icon_state = "bullet" + hal_fire_sound = "gunshot" + hal_hitsound = 'sound/weapons/pierce.ogg' + hal_hitsound_wall = "ricochet" + hal_impact_effect = "impact_bullet" + hal_impact_effect_wall = "impact_bullet" + hit_duration = 5 + hit_duration_wall = 5 + +/obj/item/projectile/hallucination/bullet/hal_apply_effect() + hal_target.adjustStaminaLoss(60) + +/obj/item/projectile/hallucination/laser + name = "laser" + damage_type = BURN + hal_icon_state = "laser" + hal_fire_sound = 'sound/weapons/laser.ogg' + hal_hitsound = 'sound/weapons/sear.ogg' + hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg' + hal_impact_effect = "impact_laser" + hal_impact_effect_wall = "impact_laser_wall" + hit_duration = 4 + hit_duration_wall = 10 + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + +/obj/item/projectile/hallucination/laser/hal_apply_effect() + hal_target.adjustStaminaLoss(20) + hal_target.blur_eyes(2) + +/obj/item/projectile/hallucination/taser + name = "electrode" + damage_type = BURN + hal_icon_state = "spark" + color = "#FFFF00" + hal_fire_sound = 'sound/weapons/taser.ogg' + hal_hitsound = 'sound/weapons/taserhit.ogg' + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/taser/hal_apply_effect() + hal_target.Knockdown(100) + hal_target.stuttering += 20 + if(hal_target.dna && hal_target.dna.check_mutation(HULK)) + hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + else if(hal_target.status_flags & CANKNOCKDOWN) + addtimer(CALLBACK(hal_target, /mob/living/carbon.proc/do_jitter_animation, 20), 5) + +/obj/item/projectile/hallucination/disabler + name = "disabler beam" + damage_type = STAMINA + hal_icon_state = "omnilaser" + hal_fire_sound = 'sound/weapons/taser2.ogg' + hal_hitsound = 'sound/weapons/tap.ogg' + hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg' + hal_impact_effect = "impact_laser_blue" + hal_impact_effect_wall = null + hit_duration = 4 + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + +/obj/item/projectile/hallucination/disabler/hal_apply_effect() + hal_target.adjustStaminaLoss(25) + +/obj/item/projectile/hallucination/ebow + name = "bolt" + damage_type = TOX + hal_icon_state = "cbbolt" + hal_fire_sound = 'sound/weapons/genhit.ogg' + hal_hitsound = null + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/ebow/hal_apply_effect() + hal_target.Knockdown(100) + hal_target.stuttering += 5 + hal_target.adjustStaminaLoss(8) + +/obj/item/projectile/hallucination/change + name = "bolt of change" + damage_type = BURN + hal_icon_state = "ice_1" + hal_fire_sound = 'sound/magic/staff_change.ogg' + hal_hitsound = null + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/change/hal_apply_effect() + new /datum/hallucination/self_delusion(hal_target, TRUE, wabbajack = FALSE) + +/obj/item/projectile/hallucination/death + name = "bolt of death" + damage_type = BURN + hal_icon_state = "pulse1_bl" + hal_fire_sound = 'sound/magic/wandodeath.ogg' + hal_hitsound = null + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/death/hal_apply_effect() + new /datum/hallucination/death(hal_target, TRUE) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 27cad406fa..3811512a02 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -101,9 +101,11 @@ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "chem_dispenser", name, 550, 550, master_ui, state) + if(user.hallucinating()) + ui.set_autoupdate(FALSE) //to not ruin the immersion by constantly changing the fake chemicals ui.open() -/obj/machinery/chem_dispenser/ui_data() +/obj/machinery/chem_dispenser/ui_data(mob/user) var/data = list() data["amount"] = amount data["energy"] = cell.charge ? cell.charge * powerefficiency : "0" //To prevent NaN in the UI. @@ -128,10 +130,16 @@ data["beakerTransferAmounts"] = null var chemicals[0] + var/is_hallucinating = FALSE + if(user.hallucinating()) + is_hallucinating = TRUE for(var/re in dispensable_reagents) var/datum/reagent/temp = GLOB.chemical_reagents_list[re] if(temp) - chemicals.Add(list(list("title" = temp.name, "id" = temp.id))) + var/chemname = temp.name + if(is_hallucinating && prob(5)) + chemname = "[pick_list_replacements("hallucination.json", "chemicals")]" + chemicals.Add(list(list("title" = chemname, "id" = temp.id))) data["chemicals"] = chemicals return data diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index ff44804e75..0f5f1de91d 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -290,9 +290,8 @@ //HALLUCINATE else if((findtext(message, hallucinate_words))) cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - new /obj/effect/hallucination/delusion(get_turf(L),L,null,150 * power_multiplier,0) + for(var/mob/living/carbon/C in listeners) + new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) //WAKE UP else if((findtext(message, wakeup_words))) diff --git a/strings/hallucination.json b/strings/hallucination.json new file mode 100644 index 0000000000..b28c70db4a --- /dev/null +++ b/strings/hallucination.json @@ -0,0 +1,229 @@ +{ + "suspicion": [ + "I'm watching you...", + "I know what you're doing", + "What are you hiding?", + "I saw that" + ], + + "greetings": [ + "", + "Hey, ", + "Hi ", + "Hello ", + "Wait, ", + "It's " + ], + + "getout": [ + "Get out", + "Get out!", + "Go away", + "Fuck off", + "OUT!", + "Out!" + ], + + "weird": [ + "Kchck-Chkck? Kchchck!", + "Kchckchk...", + "EEEeeeeEEEE", + "khhhhh", + "#@§*&£", + "H**p m*", + "H-hhhhh..." + ], + + "didyouhearthat": [ + "Did you hear that?", + "Did you see that?", + "What was that?" + ], + + "imatraitor": [ + "Hail Ratvar", + "Hail Nar'Sie", + "Hey, i've got some TC left, want something?", + "Viva!", + "I'll spare you if you don't tell anybody about me", + "Hey, are you a traitor too?", + "You're my target, but @pick(excuses)", + "Are you mr. @pick(ling_names)?" + ], + + "excuses": [ + "i like you, so i'll spare you", + "i don't really feel like following objectives today", + "i'm not robust enough to fight you", + "who cares", + "i'll kill you later" + ] + + "ling_names": [ + "Alpha", + "Beta", + "Gamma", + "Delta", + "Epsilon", + "Eta", + "Theta", + "Lambda", + "Mu", + "Xi", + "Rho", + "Sigma", + "Tau", + "Upsilon", + "Phi", + "Psi", + "Omega" + ] + + "doubt": [ + "Why?", + "What?", + "Wait, what?", + "Wait", + "Hold on", + "Uh..." + ], + + "aggressive": [ + "Give me that!", + "I'm going to kill you!", + "Fuck you!" + ], + + "help": [ + "HELP", + "HELP ME", + "HELP HIM", + "HELP HER", + "HELP THEM", + "HELP US", + "HELP YOURSELF" + ], + + "escape": [ + "RUN!!", + "They're behind me!", + "It's here!", + "Follow me!", + "Follow me" + ] + + "infection_advice": [ + "stay away", + "don't get close", + "be careful", + "help me", + "kill me" + ] + + "people": [ + "Captain", + "Hos", + "Cmo", + "Rd", + "Ce", + "Hop", + "Janitor", + "AI", + "Viro", + "Qm", + "[target.first_name()]" + ] + + "accusations": [ + "rogue", + "cult", + "a cultist", + "clockcult", + "a clock cultist", + "a revhead", + "a rev", + "a gang leader", + "a gangster", + "a traitor", + "a tator", + "a ling", + "a changeling" + ] + + "threat": [ + "Cult", + "Wizard", + "Blob", + "Ling", + "Ops", + "Swarmers", + "Revenant", + "Traitor", + "Harm", + "I hear flashing", + "Help" + ] + + "location": [ + "bridge", + "armory", + "sec", + "security", + "science", + "engineering", + "cargo", + "medbay", + "atmos", + "maint", + "hops office", + "captains office", + "chapel", + "library", + "tool storage", + "botany", + "kitchen", + "the ai sat" + ] + + "advice": [ + "Hmm...not sure about that.", + "Yes. You're doing the right thing.", + "No. Stop what you're doing.", + "You should be wary of that person.", + "Trust that person.", + "That person wants to kill you.", + "Kill that person. You know who.", + "You should go somewhere else. Quickly.", + "Good luck. You'll need it.", + "You have my permission. Do it." + ] + + "chemicals": [ + "Ooze", + "Fire", + "Earth", + "Lightning", + "Air", + "Magic", + "Spiders", + "Button", + "Surprise", + "Happiness", + "Despair", + "Blood", + "Awesome", + "Infinity", + "Electronics", + "Time", + "Space", + "Pain", + "Guts", + "Life", + "Death", + "Phlebotinium", + "Mana", + "Energy", + "?????" + ] + +} From 53dd97ca8aae5ef17f648262d5eb3af85064362d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 31 Jul 2017 21:25:46 -0500 Subject: [PATCH 003/164] Fixes the fruity pebbles in the code --- code/world.dm.rej | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 code/world.dm.rej diff --git a/code/world.dm.rej b/code/world.dm.rej new file mode 100644 index 0000000000..cde7698a21 --- /dev/null +++ b/code/world.dm.rej @@ -0,0 +1,10 @@ +diff a/code/world.dm b/code/world.dm (rejected hunks) +@@ -59,7 +59,7 @@ + if(config.sql_enabled) + if(SSdbcore.Connect()) + log_world("Database connection established.") +- var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_version")] ORDER BY date DESC LIMIT 1") ++ var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1") + query_db_version.Execute() + if(query_db_version.NextRow()) + var/db_major = query_db_version.item[1] From a2e487c86ed5b556d2655ccf7fad86aa0014ce3b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 1 Aug 2017 16:59:50 -0500 Subject: [PATCH 004/164] Makes GetComponent() faster using typecache magic --- code/__HELPERS/type2type.dm | 15 +++++++++++++++ code/datums/components/component.dm.rej | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 code/datums/components/component.dm.rej diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 36a81e90e2..7df96c3da2 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -537,3 +537,18 @@ if(!istype(the_matrix) || the_matrix.len != 20) return "#ffffffff" return rgb(the_matrix[1]*255, the_matrix[6]*255, the_matrix[11]*255, the_matrix[16]*255) + +/proc/type2parent(child) + var/string_type = "[child]" + var/last_slash = findlasttext(string_type, "/") + if(last_slash == 1) + switch(child) + if(/datum) + return null + if(/obj || /mob) + return /atom/movable + if(/area || /turf) + return /atom + else + return /datum + return text2path(copytext(string_type, 1, last_slash)) \ No newline at end of file diff --git a/code/datums/components/component.dm.rej b/code/datums/components/component.dm.rej new file mode 100644 index 0000000000..7d216a39c5 --- /dev/null +++ b/code/datums/components/component.dm.rej @@ -0,0 +1,18 @@ +diff a/code/datums/components/component.dm b/code/datums/components/component.dm (rejected hunks) +@@ -22,8 +22,7 @@ + //lazy init the parent's dc list + var/list/dc = P.datum_components + if(!dc) +- dc = list() +- P.datum_components = dc ++ P.datum_components = dc = list() + + //set up the typecache + var/our_type = type +@@ -179,4 +178,4 @@ + helicopter.SendSignal(COMSIG_COMPONENT_REMOVING, C) + C.OnTransfer(src) + C.parent = src +- SendSignal(COMSIG_COMPONENT_ADDED, C) +\ No newline at end of file ++ SendSignal(COMSIG_COMPONENT_ADDED, C) From 468b14a01139e397f6482e198c3935ad5c3c11d8 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 2 Aug 2017 06:04:43 -0500 Subject: [PATCH 005/164] Update component.dm --- code/datums/components/component.dm | 168 +++++++++++++++++++++------- 1 file changed, 126 insertions(+), 42 deletions(-) diff --git a/code/datums/components/component.dm b/code/datums/components/component.dm index b9212d2786..5e25a581f8 100644 --- a/code/datums/components/component.dm +++ b/code/datums/components/component.dm @@ -1,8 +1,8 @@ /datum/component - var/enabled = TRUE // Enables or disables the components - var/dupe_mode = COMPONENT_DUPE_HIGHLANDER // How components of the same type are handled in the same parent - var/list/signal_procs // list of signals -> callbacks - var/datum/parent // parent datum + var/enabled = TRUE + var/dupe_mode = COMPONENT_DUPE_HIGHLANDER + var/list/signal_procs + var/datum/parent /datum/component/New(datum/P, ...) var/dm = dupe_mode @@ -11,26 +11,78 @@ if(old) switch(dm) if(COMPONENT_DUPE_HIGHLANDER) - P.RemoveComponent(old) - old = null //in case SendSignal() blocks + InheritComponent(old, FALSE) + qdel(old) if(COMPONENT_DUPE_UNIQUE) + old.InheritComponent(src, TRUE) qdel(src) return - P.SendSignal(COMSIG_COMPONENT_ADDED, list(src), FALSE) - LAZYADD(P.datum_components, src) + P.SendSignal(COMSIG_COMPONENT_ADDED, src) + + //lazy init the parent's dc list + var/list/dc = P.datum_components + if(!dc) + P.datum_components = dc = list() + + //set up the typecache + var/our_type = type + for(var/I in _GetInverseTypeListExceptRoot(our_type)) + var/test = dc[I] + if(test) //already another component of this type here + var/list/components_of_type + if(!islist(test)) + components_of_type = list(test) + dc[I] = components_of_type + else + components_of_type = test + if(I == our_type) //exact match, take priority + var/inserted = FALSE + for(var/J in 1 to components_of_type.len) + var/datum/component/C = components_of_type[J] + if(C.type != our_type) //but not over other exact matches + components_of_type.Insert(J, I) + inserted = TRUE + break + if(!inserted) + components_of_type += src + else //indirect match, back of the line with ya + components_of_type += src + else //only component of this type, no list + dc[I] = src + parent = P /datum/component/Destroy() - RemoveNoSignal() - return ..() - -/datum/component/proc/RemoveNoSignal() + enabled = FALSE var/datum/P = parent if(P) - LAZYREMOVE(P.datum_components, src) + _RemoveNoSignal() + P.SendSignal(COMSIG_COMPONENT_REMOVING, src) + LAZYCLEARLIST(signal_procs) + return ..() + +/datum/component/proc/_RemoveNoSignal() + var/datum/P = parent + if(P) + var/list/dc = P.datum_components + var/our_type = type + for(var/I in _GetInverseTypeListExceptRoot(our_type)) + var/list/components_of_type = dc[I] + if(islist(components_of_type)) // + var/list/subtracted = components_of_type - src + if(subtracted.len == 1) //only 1 guy left + dc[I] = subtracted[1] //make him special + else + dc[I] = subtracted + else //just us + dc -= I + if(!dc.len) + P.datum_components = null parent = null /datum/component/proc/RegisterSignal(sig_type, proc_on_self, override = FALSE) + if(QDELETED(src)) + return var/list/procs = signal_procs if(!procs) procs = list() @@ -43,45 +95,71 @@ procs[sig_type] = CALLBACK(src, proc_on_self) -/datum/var/list/datum_components //list of /datum/component +/datum/component/proc/ReceiveSignal(sigtype, ...) + var/list/sps = signal_procs + var/datum/callback/CB = LAZYACCESS(sps, sigtype) + if(!CB) + return FALSE + var/list/arguments = args.Copy() + arguments.Cut(1, 2) + return CB.InvokeAsync(arglist(arguments)) -// Send a signal to all other components in the container. -/datum/proc/SendSignal(sigtype, list/sig_args, async = FALSE) +/datum/component/proc/InheritComponent(datum/component/C, i_am_original) + return + +/datum/component/proc/OnTransfer(datum/new_parent) + return + +/datum/component/proc/_GetInverseTypeListExceptRoot(our_type_cached) + var/datum/component/current_type = our_type_cached + . = list() + while (current_type != /datum/component) + . += current_type + current_type = type2parent(current_type) + +/datum/var/list/datum_components //special typecache of /datum/component + +/datum/proc/SendSignal(sigtype, ...) var/list/comps = datum_components . = FALSE for(var/I in comps) var/datum/component/C = I if(!C.enabled) continue - var/list/sps = C.signal_procs - var/datum/callback/CB = LAZYACCESS(sps, sigtype) - if(!CB) - continue - if(!async) - . |= CB.Invoke(sig_args) - else - . |= CB.InvokeAsync(sig_args) + if(C.ReceiveSignal(arglist(args))) + ComponentActivated(C) + . = TRUE + +/datum/proc/ComponentActivated(datum/component/C) + return /datum/proc/GetComponent(c_type) - for(var/I in datum_components) - if(istype(I, c_type)) - return I + var/list/dc = datum_components + if(!dc) + return null + . = dc[c_type] + if(islist(.)) + return .[1] /datum/proc/GetExactComponent(c_type) - for(var/I in datum_components) - var/datum/component/C = I + var/list/dc = datum_components + if(!dc) + return null + var/datum/component/C = dc[c_type] + if(C) + if(islist(C)) + C = C[1] if(C.type == c_type) - return I + return C + return null /datum/proc/GetComponents(c_type) - . = list() - for(var/I in datum_components) - if(istype(I, c_type)) - . += I - -/datum/proc/AddComponents(list/new_types) - for(var/new_type in new_types) - AddComponent(new_type) + var/list/dc = datum_components + if(!dc) + return null + . = dc[c_type] + if(!islist(.)) + return list(.) /datum/proc/AddComponent(new_type, ...) var/nt = new_type @@ -89,9 +167,15 @@ var/datum/component/C = new nt(arglist(args)) return QDELING(C) ? GetComponent(new_type) : C -/datum/proc/RemoveComponent(datum/component/C) +/datum/proc/TakeComponent(datum/component/C) if(!C) return - C.RemoveNoSignal() - SendSignal(COMSIG_COMPONENT_REMOVING, list(C), FALSE) - qdel(C) + var/datum/helicopter = C.parent + if(helicopter == src) + //wat + return + C._RemoveNoSignal() + helicopter.SendSignal(COMSIG_COMPONENT_REMOVING, C) + C.OnTransfer(src) + C.parent = src + SendSignal(COMSIG_COMPONENT_ADDED, C) From 89e29a036cef4c545e8397cd1f5c8d8f941da69d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 2 Aug 2017 08:52:47 -0500 Subject: [PATCH 006/164] Action buttons for spells now include their description --- code/datums/action.dm | 3 ++- code/datums/action.dm.rej | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 code/datums/action.dm.rej diff --git a/code/datums/action.dm b/code/datums/action.dm index c8385c9ed3..a1048b86bf 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -168,7 +168,7 @@ /datum/action/item_action/toggle_firemode name = "Toggle Firemode" - + /datum/action/item_action/rcl name = "Change Cable Color" button_icon_state = "rcl_rainbow" @@ -482,6 +482,7 @@ var/obj/effect/proc_holder/spell/S = target S.action = src name = S.name + desc = S.desc button_icon = S.action_icon button_icon_state = S.action_icon_state background_icon_state = S.action_background_icon_state diff --git a/code/datums/action.dm.rej b/code/datums/action.dm.rej new file mode 100644 index 0000000000..5be10bbb99 --- /dev/null +++ b/code/datums/action.dm.rej @@ -0,0 +1,9 @@ +diff a/code/datums/action.dm b/code/datums/action.dm (rejected hunks) +@@ -491,7 +491,6 @@ + S.action = src + name = S.name + desc = S.desc +- button_icon = S.action_icon + icon_icon = S.action_icon + button_icon_state = S.action_icon_state + background_icon_state = S.action_background_icon_state From 0ec200f540aa957002ca18a5f6fc81d00ac52ac0 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Thu, 3 Aug 2017 06:11:26 -0700 Subject: [PATCH 007/164] Delete action.dm.rej --- code/datums/action.dm.rej | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 code/datums/action.dm.rej diff --git a/code/datums/action.dm.rej b/code/datums/action.dm.rej deleted file mode 100644 index 5be10bbb99..0000000000 --- a/code/datums/action.dm.rej +++ /dev/null @@ -1,9 +0,0 @@ -diff a/code/datums/action.dm b/code/datums/action.dm (rejected hunks) -@@ -491,7 +491,6 @@ - S.action = src - name = S.name - desc = S.desc -- button_icon = S.action_icon - icon_icon = S.action_icon - button_icon_state = S.action_icon_state - background_icon_state = S.action_background_icon_state From ac86f2735a3f25f296eab18e9543827032780402 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 4 Aug 2017 09:33:07 -0500 Subject: [PATCH 008/164] flora.dm initialize hint --- code/game/objects/structures/flora.dm | 56 +++++++++++------------ code/game/objects/structures/flora.dm.rej | 28 ++++++++++++ 2 files changed, 56 insertions(+), 28 deletions(-) create mode 100644 code/game/objects/structures/flora.dm.rej diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index e478ff5d92..76b1462304 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -45,14 +45,14 @@ /obj/structure/flora/tree/pine/Initialize() icon_state = "pine_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/tree/pine/xmas name = "xmas tree" icon_state = "pine_c" /obj/structure/flora/tree/pine/xmas/Initialize() - ..() + . = ..() icon_state = "pine_c" /obj/structure/flora/tree/dead @@ -64,7 +64,7 @@ icon_state = "palm1" /obj/structure/flora/tree/palm/Initialize() - ..() + . = ..() icon_state = pick("palm1","palm2") pixel_x = 0 @@ -76,7 +76,7 @@ /obj/structure/flora/tree/dead/Initialize() icon_state = "tree_[rand(1, 6)]" - ..() + . = ..() /obj/structure/flora/tree/jungle name = "tree" @@ -106,7 +106,7 @@ /obj/structure/flora/grass/brown/Initialize() icon_state = "snowgrass[rand(1, 3)]bb" - ..() + . = ..() /obj/structure/flora/grass/green @@ -114,14 +114,14 @@ /obj/structure/flora/grass/green/Initialize() icon_state = "snowgrass[rand(1, 3)]gb" - ..() + . = ..() /obj/structure/flora/grass/both icon_state = "snowgrassall1" /obj/structure/flora/grass/both/Initialize() icon_state = "snowgrassall[rand(1, 3)]" - ..() + . = ..() //bushes @@ -133,7 +133,7 @@ /obj/structure/flora/bush/Initialize() icon_state = "snowbush[rand(1, 6)]" - ..() + . = ..() //newbushes @@ -145,112 +145,112 @@ /obj/structure/flora/ausbushes/Initialize() if(icon_state == "firstbush_1") icon_state = "firstbush_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/reedbush icon_state = "reedbush_1" /obj/structure/flora/ausbushes/reedbush/Initialize() icon_state = "reedbush_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/leafybush icon_state = "leafybush_1" /obj/structure/flora/ausbushes/leafybush/Initialize() icon_state = "leafybush_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/palebush icon_state = "palebush_1" /obj/structure/flora/ausbushes/palebush/Initialize() icon_state = "palebush_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/stalkybush icon_state = "stalkybush_1" /obj/structure/flora/ausbushes/stalkybush/Initialize() icon_state = "stalkybush_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/grassybush icon_state = "grassybush_1" /obj/structure/flora/ausbushes/grassybush/Initialize() icon_state = "grassybush_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/fernybush icon_state = "fernybush_1" /obj/structure/flora/ausbushes/fernybush/Initialize() icon_state = "fernybush_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/sunnybush icon_state = "sunnybush_1" /obj/structure/flora/ausbushes/sunnybush/Initialize() icon_state = "sunnybush_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/genericbush icon_state = "genericbush_1" /obj/structure/flora/ausbushes/genericbush/Initialize() icon_state = "genericbush_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/pointybush icon_state = "pointybush_1" /obj/structure/flora/ausbushes/pointybush/Initialize() icon_state = "pointybush_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/lavendergrass icon_state = "lavendergrass_1" /obj/structure/flora/ausbushes/lavendergrass/Initialize() icon_state = "lavendergrass_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/ywflowers icon_state = "ywflowers_1" /obj/structure/flora/ausbushes/ywflowers/Initialize() icon_state = "ywflowers_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/brflowers icon_state = "brflowers_1" /obj/structure/flora/ausbushes/brflowers/Initialize() icon_state = "brflowers_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/ppflowers icon_state = "ppflowers_1" /obj/structure/flora/ausbushes/ppflowers/Initialize() icon_state = "ppflowers_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/sparsegrass icon_state = "sparsegrass_1" /obj/structure/flora/ausbushes/sparsegrass/Initialize() icon_state = "sparsegrass_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/fullgrass icon_state = "fullgrass_1" /obj/structure/flora/ausbushes/fullgrass/Initialize() icon_state = "fullgrass_[rand(1, 3)]" - ..() + . = ..() /obj/item/weapon/twohanded/required/kirbyplants name = "potted plant" @@ -319,7 +319,7 @@ desc = "A pile of rocks" /obj/structure/flora/rock/pile/Initialize() - ..() + . = ..() icon_state = "[icon_state][rand(1,3)]" //Jungle grass @@ -333,7 +333,7 @@ /obj/structure/flora/grass/jungle/Initialize() icon_state = "[icon_state][rand(1, 5)]" - ..() + . = ..() /obj/structure/flora/grass/jungle/b icon_state = "grassb" @@ -348,7 +348,7 @@ density = FALSE /obj/structure/flora/rock/jungle/Initialize() - ..() + . = ..() icon_state = "[initial(icon_state)][rand(1,5)]" @@ -361,7 +361,7 @@ /obj/structure/flora/junglebush/Initialize() icon_state = "[icon_state][rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/junglebush/b icon_state = "bushb" diff --git a/code/game/objects/structures/flora.dm.rej b/code/game/objects/structures/flora.dm.rej new file mode 100644 index 0000000000..8257ec2122 --- /dev/null +++ b/code/game/objects/structures/flora.dm.rej @@ -0,0 +1,28 @@ +diff a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm (rejected hunks) +@@ -89,7 +89,7 @@ + + /obj/structure/flora/tree/jungle/Initialize() + icon_state = "[icon_state][rand(1, 6)]" +- ..() ++ . = ..() + + //grass + /obj/structure/flora/grass +@@ -307,7 +307,7 @@ + density = 1 + + /obj/structure/flora/rock/Initialize() +- ..() ++ . = ..() + icon_state = "[icon_state][rand(1,3)]" + + /obj/structure/flora/rock/pile +@@ -381,5 +381,5 @@ + pixel_y = -16 + + /obj/structure/flora/rock/pile/largejungle/Initialize() +- ..() +- icon_state = "[initial(icon_state)][rand(1,3)]" +\ No newline at end of file ++ . = ..() ++ icon_state = "[initial(icon_state)][rand(1,3)]" From b0361c2c646f43b0a36d702452ac0719e8b4ed89 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 5 Aug 2017 12:20:27 -0500 Subject: [PATCH 009/164] The inhands of the Dark Blessing chaplain weapon is now visible. --- code/game/objects/items/weapons/holy_weapons.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 238022d209..8e1cf3301e 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -320,6 +320,8 @@ desc = "Particularly twisted dieties grant gifts of dubious value." icon_state = "arm_blade" item_state = "arm_blade" + lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' + righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' flags = ABSTRACT | NODROP w_class = WEIGHT_CLASS_HUGE sharpness = IS_SHARP From 42fc6497d406e4a4f40d7f7a6ef7ef976bc30391 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 6 Aug 2017 03:13:11 -0500 Subject: [PATCH 010/164] Fixes hair sticking through hats. --- code/modules/clothing/clothing.dm | 1 + code/modules/clothing/head/collectable.dm | 9 +++++++++ code/modules/clothing/head/collectable.dm.rej | 9 +++++++++ code/modules/clothing/head/hardhat.dm | 1 + code/modules/clothing/head/helmet.dm | 1 + code/modules/clothing/head/jobs.dm | 4 ++++ code/modules/clothing/head/misc.dm | 6 +++++- code/modules/clothing/head/misc.dm.rej | 16 ++++++++++++++++ code/modules/clothing/head/misc_special.dm | 2 ++ icons/mob/hair_extensions.dmi | Bin 26997 -> 26993 bytes 10 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 code/modules/clothing/head/collectable.dm.rej create mode 100644 code/modules/clothing/head/misc.dm.rej diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 013fbd8bc4..9b75bb817f 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -253,6 +253,7 @@ BLIND // can't see anything slot_flags = SLOT_HEAD var/blockTracking = 0 //For AI tracking var/can_toggle = null + dynamic_hair_suffix = "+generic" /obj/item/clothing/head/Initialize() . = ..() diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 8ec8d00c77..6c7acefe8f 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -4,6 +4,7 @@ /obj/item/clothing/head/collectable name = "collectable hat" desc = "A rare collectable hat." + dynamic_hair_suffix = "+detective" /obj/item/clothing/head/collectable/petehat name = "ultra rare Pete's hat!" @@ -14,6 +15,7 @@ name = "collectable slime cap!" desc = "It just latches right in place!" icon_state = "slime" + dynamic_hair_suffix = "" /obj/item/clothing/head/collectable/xenom name = "collectable xenomorph helmet!" @@ -25,6 +27,7 @@ desc = "A rare chef's hat meant for hat collectors!" icon_state = "chef" item_state = "chef" + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/chef @@ -53,6 +56,7 @@ name = "collectable police officer's hat" desc = "A collectable police officer's Hat. This hat emphasizes that you are THE LAW." icon_state = "policehelm" + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/warden @@ -95,6 +99,7 @@ desc = "The fur feels... a bit too realistic." icon_state = "kitty" item_state = "kitty" + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/kitty @@ -103,6 +108,7 @@ desc = "Not as lucky as the feet!" icon_state = "bunny" item_state = "bunny" + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/rabbit @@ -125,6 +131,7 @@ name = "collectable HoS hat" desc = "Now you too can beat prisoners, set silly sentences, and arrest for no reason!" icon_state = "hoscap" + dynamic_hair_suffix = "" /obj/item/clothing/head/collectable/HoP name = "collectable HoP hat" @@ -138,6 +145,7 @@ icon_state = "thunderdome" item_state = "thunderdome" resistance_flags = 0 + flags_inv = HIDEHAIR /obj/item/clothing/head/collectable/swat name = "collectable SWAT helmet" @@ -145,3 +153,4 @@ icon_state = "swat" item_state = "swat" resistance_flags = 0 + flags_inv = HIDEHAIR diff --git a/code/modules/clothing/head/collectable.dm.rej b/code/modules/clothing/head/collectable.dm.rej new file mode 100644 index 0000000000..82a9962cb8 --- /dev/null +++ b/code/modules/clothing/head/collectable.dm.rej @@ -0,0 +1,9 @@ +diff a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm (rejected hunks) +@@ -4,7 +4,6 @@ + /obj/item/clothing/head/collectable + name = "collectable hat" + desc = "A rare collectable hat." +- dynamic_hair_suffix = "+detective" + + + /obj/item/clothing/head/collectable/petehat diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 28fe8cacfb..6eefb458ed 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -10,6 +10,7 @@ flags_inv = 0 actions_types = list(/datum/action/item_action/toggle_helmet_light) resistance_flags = FIRE_PROOF + dynamic_hair_suffix = "+generic" dog_fashion = /datum/dog_fashion/head diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index f100df4366..24d8049ac7 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -12,6 +12,7 @@ strip_delay = 60 resistance_flags = 0 flags_cover = HEADCOVERSEYES + flags_inv = HIDEHAIR dog_fashion = /datum/dog_fashion/head/helmet diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 23b3da72ef..6a127f571b 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -7,6 +7,7 @@ desc = "The commander in chef's head wear." strip_delay = 10 equip_delay_other = 10 + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/chef /obj/item/clothing/head/chefhat/suicide_act(mob/user) @@ -62,6 +63,7 @@ item_state = "cage" worn_x_dimension = 64 worn_y_dimension = 64 + dynamic_hair_suffix = "" /obj/item/clothing/head/witchunter_hat @@ -99,6 +101,7 @@ desc = "A beret, a mime's favorite headwear." icon_state = "beret" dog_fashion = /datum/dog_fashion/head/beret + dynamic_hair_suffix = "" /obj/item/clothing/head/beret/black name = "black beret" @@ -118,6 +121,7 @@ icon_state = "hoscap" armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0, fire = 50, acid = 60) strip_delay = 80 + dynamic_hair_suffix = "" /obj/item/clothing/head/HoS/syndicate name = "syndicate cap" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 3eabbad438..ac82fc92db 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -56,6 +56,7 @@ name = "nurse's hat" desc = "It allows quick identification of trained medical personnel." icon_state = "nursehat" + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/nurse @@ -110,6 +111,7 @@ name = "rabbit ears" desc = "Wearing these makes you look useless, and only good for your sex appeal." icon_state = "bunny" + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/rabbit @@ -136,12 +138,14 @@ desc = "Yarr." icon_state = "bandana" item_state = "bandana" + dynamic_hair_suffix = "" /obj/item/clothing/head/bowler name = "bowler-hat" desc = "Gentleman, elite aboard!" icon_state = "bowler" item_state = "bowler" + dynamic_hair_suffix = "" /obj/item/clothing/head/witchwig name = "witch costume wig" @@ -183,7 +187,6 @@ item_state = "fedora" armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 50) desc = "A really cool hat if you're a mobster. A really lame hat if you're not." - dynamic_hair_suffix = "+detective" pockets = /obj/item/weapon/storage/internal/pocket/small /obj/item/clothing/head/fedora/suicide_act(mob/user) @@ -277,6 +280,7 @@ icon_state = "crown" armor = list(melee = 15, bullet = 0, laser = 0,energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) resistance_flags = FIRE_PROOF + dynamic_hair_suffix = "" /obj/item/clothing/head/crown/fancy name = "magnificent crown" diff --git a/code/modules/clothing/head/misc.dm.rej b/code/modules/clothing/head/misc.dm.rej new file mode 100644 index 0000000000..df85f74b20 --- /dev/null +++ b/code/modules/clothing/head/misc.dm.rej @@ -0,0 +1,16 @@ +diff a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm (rejected hunks) +@@ -250,7 +250,7 @@ + name = "jester hat" + desc = "A hat with bells, to add some merriness to the suit." + icon_state = "jester_hat" +- dynamic_hair_suffix = "null" ++ dynamic_hair_suffix = "" + + /obj/item/clothing/head/rice_hat + name = "rice hat" +@@ -302,4 +302,4 @@ + name = "jester hat" + desc = "A hat with bells, to add some merriness to the suit." + icon_state = "jester_hat2" +- dynamic_hair_suffix = "null" ++ dynamic_hair_suffix = "" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 4c14fc0422..d15c7dd5f4 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -125,6 +125,7 @@ desc = "A pair of kitty ears. Meow!" icon_state = "kitty" color = "#999999" + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/kitty @@ -150,6 +151,7 @@ flags_inv = 0 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) brightness_on = 1 //luminosity when on + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/reindeer diff --git a/icons/mob/hair_extensions.dmi b/icons/mob/hair_extensions.dmi index bd2adda94bd5bf652747baf6a360b8d63976bb47..5a4ee36157718e997c538c12d07849980ec37898 100644 GIT binary patch delta 653 zcmV;80&@NJ(gE?(0gxnrVtQ0qbVOxyV{&P5bZKvH004NLotUw18!-?>Yw0Tpy9^K{ zwo|GJYy>XsUkH}s9=SOlms#>o(ch=Au1S?)DS!_=4rh0kx_94Se!RZB=eO76#@0lO zJGrONUyg^1gr3~VJw6-{i6y4~@uPL>>`v}3k=RfFDRNyh9p_|y!IgoJXMl~*E%NP%zOpqkVum$2H}J^60}no zNdOgyoHK*_G_uHlRKOdWDbfOV3Ytv819|2o8)!MN{=8ZqfItzvUNQ`wb@95fft2wD z-YW1WS@@dBEAV(JM!P?D}->(W3ag5Rc#H_$$ntfNI#b*U6|1x5J1$~0lfS_3FS zB}09^f|Em&z?}pvxt#)g0+r6C5GaCar>I5HD5?@W2|5IS>_-DrHVx!NJq0+9nR8Vl5-*fi`YvXjJm-- zT4hF?MwR)0imG_CE$Y7;1{%YwM;&+*4}B0_xT24!Dt`p*V|&=4GJMST=u^HWwLXxO z3rFHBd(#VO!mK62L-BAbw4~OD$gCwc35*YXSxao)NMh=Hw?oJIn8wH^;eY-wxpyz` n&+hr{_4pTcrA1-|Eu^CW03ZNKL_t(|ob26UY#V8_qXN=q2tPDb delta 653 zcmV;80&@NF(gF3-0gxnrW_naubVOxyV{&P5bZKvH004NLrI;~q8!-%pXZu$O$ylIh zlXUb_Bq%Z@f1#i(p2VI`R4LuL{`Vc~TRQcrqlXW&o*wzgyLVq-zP-M?=eO76#@0lO zJGrNipN@x%gr3~VJw6-{i6y4~=SS<**`3^7BC+rOL*UNmE*sx}9S=dQxs!W39wwuO zn>)GBe*tF{2q@q=BqkW!vX+QKKe#k5C^fH*3PnM=s^!{A^1~?jWl+lvJ~3;FlSzpT z8)UWIP$W;yw*`MABU_tre@X>xxvERFj$yYW#%g^j6|ADQEY_qMuK+~ zBMGn;k#lDFtVR}pnF{=3Geuh9jzW_ud@;|QWP`2f)t^_(Ll`WF*GnG2&boNr*kI21 zGH_hrO|qV6l;Z_9{>0Q1ez7E7;YO!{N`(KRF5X~MRkDs3S=FUd&=r>B=PJ{LLTe4M z7?lk7{0dJZO#*ikxF~lH?j2M*mqM@{rk$b|!K187>?HVqNU>iLPU|$3F_BBpu>G}g zOSHW#h~1>dA_ zYxw-iA#zf9-PsQuetGyEyuur%UrS=b=e6A{Pa|F#Vem4LIA!Vsi5yIFP9$)ldx^tg zIox@x%y@HusWM-2MQ?`2eR%_6vv~EmGjBrT>)3@WzQk4eC2-f<;}RF-&o+U7VrWUN z4`uDbk@(8q^a7hRYl#En_kZL`OKN?P&01oUz$4>i))HGcl9>A58}aoarct&@__uF5 n_wMEW**(9#9)ANQOqhb69q$JK03ZNKL_t(|ob27Rn*!EmTyaCq From fbabd14798d583e4370e8de8403533da0fbc1a94 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 7 Aug 2017 12:26:15 -0500 Subject: [PATCH 011/164] Fixes adminhelp sending the wrong message to players --- code/modules/admin/verbs/adminhelp.dm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 0177798e25..44755c46fc 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -194,7 +194,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) AddInteraction("[key_name_admin(usr)] PM'd [LinkedReplyName()]") message_admins("Ticket [TicketHref("#[id]")] created") else - MessageNoRecipient(parsed_message) + MessageNoRecipient(msg, parsed_message) //send it to irc if nobody is on and tell us how many were on var/admin_number_present = send2irc_adminless_only(initiator_ckey, "Ticket #[id]: [name]") @@ -249,18 +249,19 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) //message from the initiator without a target, all admins will see this //won't bug irc -/datum/admin_help/proc/MessageNoRecipient(msg) +/datum/admin_help/proc/MessageNoRecipient(msg, parsed_msg) var/ref_src = "\ref[src]" - var/chat_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [msg]" + //Message to be sent to all admins + var/admin_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [parsed_msg]" AddInteraction("[LinkedReplyName(ref_src)]: [msg]") + //send this msg to all admins - for(var/client/X in GLOB.admins) if(X.prefs.toggles & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' window_flash(X, ignorepref = TRUE) - to_chat(X, chat_msg) + to_chat(X, admin_msg) //show it to the person adminhelping too to_chat(initiator, "PM to-Admins: [msg]") From 40a8449f11d378ab1e0a48e7ed54c694003a5571 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 7 Aug 2017 12:26:20 -0500 Subject: [PATCH 012/164] GM completion check and mulligan now check to see if players are logged out --- code/game/gamemodes/game_mode.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index f6fef13305..2a0cd230d5 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -111,7 +111,7 @@ var/list/living_crew = list() for(var/mob/Player in GLOB.mob_list) - if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player)) + if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) && !isbrain(Player) && Player.client) living_crew += Player if(living_crew.len / GLOB.joined_player_list.len <= config.midround_antag_life_check) //If a lot of the player base died, we start fresh message_admins("Convert_roundtype failed due to too many dead people. Limit is [config.midround_antag_life_check * 100]% living crew") @@ -208,7 +208,7 @@ return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark. for(var/mob/Player in GLOB.living_mob_list) - if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player)) + if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player) && Player.client) if(Player.mind.special_role) //Someone's still antaging! living_antag_player = Player return 0 From 764ebb2e5e4d50f9a266cd1a792d656c661d3a65 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 8 Aug 2017 22:24:01 -0500 Subject: [PATCH 013/164] Fixes the Hierophant not spawning its crusher trophy --- code/modules/mining/equipment/kinetic_crusher.dm | 2 +- .../mob/living/simple_animal/hostile/megafauna/hierophant.dm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index a1251381b4..06845ba0cb 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -284,7 +284,7 @@ L.adjustBruteLoss(bonus_value) /obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user) - if(!target.anchored || ismegafauna(target)) //megafauna will always be pushed + if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed step(target, get_dir(user, target)) //bubblegum diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 11c59a2d28..0ca966df35 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -57,6 +57,7 @@ Difficulty: Hard ranged_cooldown_time = 40 aggro_vision_range = 21 //so it can see to one side of the arena to the other loot = list(/obj/item/weapon/hierophant_club) + crusher_loot = list(/obj/item/weapon/hierophant_club) wander = FALSE var/burst_range = 3 //range on burst aoe var/beam_range = 5 //range on cross blast beams From cc7ad81f79ba7026a3458ed420a33361c1fc3907 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 8 Aug 2017 22:28:16 -0500 Subject: [PATCH 014/164] Adds helpers to avoid << use --- code/__DEFINES/misc.dm | 2 +- code/__HELPERS/_logging.dm | 43 +++++++++++-------- code/__HELPERS/game.dm | 4 +- code/__HELPERS/mobs.dm | 3 -- code/__HELPERS/priority_announce.dm | 7 +-- code/__HELPERS/text.dm | 2 +- code/controllers/configuration.dm | 28 ++++++------ code/controllers/subsystem/pai.dm | 1 - code/controllers/subsystem/persistence.dm | 8 ++-- code/controllers/subsystem/shuttle.dm | 2 - code/controllers/subsystem/ticker.dm | 34 +++++++-------- code/controllers/subsystem/title.dm | 2 +- code/datums/antagonists/devil.dm | 2 +- code/datums/antagonists/ninja.dm | 2 +- code/datums/status_effects/buffs.dm | 4 +- code/datums/weather/weather.dm | 6 +-- code/game/area/areas.dm | 2 +- code/game/area/areas.dm.rej | 10 +++++ code/game/gamemodes/antag_spawner.dm | 2 +- code/game/gamemodes/blob/powers.dm | 4 +- code/game/gamemodes/blob/theblob.dm | 2 +- .../gamemodes/changeling/powers/shriek.dm | 4 +- .../gamemodes/clock_cult/clock_scripture.dm | 2 +- code/game/gamemodes/cult/cult_comms.dm | 10 ++--- code/game/gamemodes/cult/supply.dm | 1 - code/game/gamemodes/cult/talisman.dm | 4 +- .../gamemodes/malfunction/Malf_Modules.dm | 3 +- code/game/gamemodes/miniantags/morph/morph.dm | 2 +- .../gamemodes/miniantags/revenant/revenant.dm | 2 +- .../miniantags/slaughter/slaughterevent.dm | 2 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 3 +- code/game/gamemodes/wizard/artefact.dm | 2 +- code/game/machinery/cloning.dm | 2 +- .../game/machinery/computer/communications.dm | 2 +- code/game/machinery/computer/pod.dm | 2 +- code/game/machinery/doors/airlock_types.dm | 2 +- code/game/mecha/equipment/mecha_equipment.dm | 5 +-- code/game/mecha/mecha.dm | 8 ++-- code/game/mecha/mecha_actions.dm | 2 +- code/game/objects/effects/mines.dm | 2 +- code/game/sound.dm | 6 +-- code/game/sound.dm.rej | 9 ++++ code/modules/admin/NewBan.dm | 28 ++++++------ code/modules/admin/admin.dm | 2 +- code/modules/admin/admin_investigate.dm.rej | 10 +++++ code/modules/admin/admin_ranks.dm | 4 +- code/modules/admin/secrets.dm | 2 +- code/modules/admin/topic.dm | 10 ++--- code/modules/admin/verbs/BrokenInhands.dm | 2 +- code/modules/admin/verbs/adminhelp.dm | 4 +- code/modules/admin/verbs/adminpm.dm | 6 +-- code/modules/admin/verbs/playsound.dm | 4 +- code/modules/admin/verbs/pray.dm | 2 +- code/modules/client/client_procs.dm | 2 +- code/modules/client/preferences_savefile.dm | 4 +- .../client/preferences_savefile.dm.rej | 10 +++++ code/modules/client/preferences_toggles.dm | 2 +- code/modules/detectivework/detective_work.dm | 5 --- code/modules/error_handler/error_handler.dm | 6 +-- code/modules/events/holiday/halloween.dm | 2 +- code/modules/events/portal_storm.dm | 4 +- code/modules/events/wizard/fakeexplosion.dm | 3 +- code/modules/events/wizard/imposter.dm | 2 +- code/modules/goonchat/browserOutput.dm | 7 ++- code/modules/goonchat/jsErrorHandler.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 2 +- .../carbon/alien/special/alien_embryo.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 2 +- .../mob/living/carbon/human/interactive.dm | 2 +- .../mob/living/carbon/monkey/punpun.dm | 22 +++++----- code/modules/mob/living/living_defense.dm | 2 +- code/modules/mob/living/silicon/ai/say.dm | 4 +- .../mob/living/silicon/pai/personality.dm | 10 ++--- .../mob/living/simple_animal/friendly/cat.dm | 2 +- .../mob/living/simple_animal/friendly/dog.dm | 10 ++--- .../hostile/megafauna/colossus.dm | 2 +- .../mob/living/simple_animal/parrot.dm | 8 ++-- code/modules/mob/mob_helpers.dm | 2 +- code/modules/power/apc.dm | 5 +-- code/modules/power/power.dm | 1 - code/modules/power/singularity/narsie.dm | 2 +- code/modules/power/supermatter/supermatter.dm | 4 +- code/modules/spells/spell_types/knock.dm | 2 +- .../spells/spell_types/mind_transfer.dm | 4 +- code/modules/vehicles/bicycle.dm | 2 +- 85 files changed, 241 insertions(+), 217 deletions(-) create mode 100644 code/game/area/areas.dm.rej create mode 100644 code/game/sound.dm.rej create mode 100644 code/modules/admin/admin_investigate.dm.rej create mode 100644 code/modules/client/preferences_savefile.dm.rej diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index e0ab84f832..0eeb62d67f 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -8,7 +8,7 @@ //You can use these defines to get the typepath of the currently running proc/verb (yes procs + verbs are objects) /* eg: /mob/living/carbon/human/death() - world << THIS_PROC_TYPE_STR //You can only output the string versions + to_chat(world, THIS_PROC_TYPE_STR) //You can only output the string versions Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a string with () (eg: the _WITH_ARGS defines) to make it look nicer) */ #define THIS_PROC_TYPE ..... diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 2dd2e42129..05b6aa1a15 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -1,3 +1,10 @@ +//wrapper macros for easier grepping +#define DIRECT_OUTPUT(A, B) A << B +#define SEND_IMAGE(target, image) DIRECT_OUTPUT(target, image) +#define SEND_SOUND(target, sound) DIRECT_OUTPUT(target, sound) +#define SEND_TEXT(target, text) DIRECT_OUTPUT(target, text) +#define WRITE_FILE(file, text) DIRECT_OUTPUT(file, text) + //print a warning message to world.log #define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].") /proc/warning(msg) @@ -20,13 +27,13 @@ /proc/log_admin(text) GLOB.admin_log.Add(text) if (config.log_admin) - GLOB.world_game_log << "\[[time_stamp()]]ADMIN: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]ADMIN: [text]") //Items using this proc are stripped from public logs - use with caution /proc/log_admin_private(text) GLOB.admin_log.Add(text) if (config.log_admin) - GLOB.world_game_log << "\[[time_stamp()]]ADMINPRIVATE: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]ADMINPRIVATE: [text]") /proc/log_adminsay(text) if (config.log_adminchat) @@ -38,65 +45,65 @@ /proc/log_game(text) if (config.log_game) - GLOB.world_game_log << "\[[time_stamp()]]GAME: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]GAME: [text]") /proc/log_vote(text) if (config.log_vote) - GLOB.world_game_log << "\[[time_stamp()]]VOTE: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]VOTE: [text]") /proc/log_access(text) if (config.log_access) - GLOB.world_game_log << "\[[time_stamp()]]ACCESS: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]ACCESS: [text]") /proc/log_say(text) if (config.log_say) - GLOB.world_game_log << "\[[time_stamp()]]SAY: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]SAY: [text]") /proc/log_prayer(text) if (config.log_prayer) - GLOB.world_game_log << "\[[time_stamp()]]PRAY: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]PRAY: [text]") /proc/log_law(text) if (config.log_law) - GLOB.world_game_log << "\[[time_stamp()]]LAW: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]LAW: [text]") /proc/log_ooc(text) if (config.log_ooc) - GLOB.world_game_log << "\[[time_stamp()]]OOC: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]OOC: [text]") /proc/log_whisper(text) if (config.log_whisper) - GLOB.world_game_log << "\[[time_stamp()]]WHISPER: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]WHISPER: [text]") /proc/log_emote(text) if (config.log_emote) - GLOB.world_game_log << "\[[time_stamp()]]EMOTE: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]EMOTE: [text]") /proc/log_attack(text) if (config.log_attack) - GLOB.world_attack_log << "\[[time_stamp()]]ATTACK: [text]" + WRITE_FILE(GLOB.world_attack_log, "\[[time_stamp()]]ATTACK: [text]") /proc/log_pda(text) if (config.log_pda) - GLOB.world_game_log << "\[[time_stamp()]]PDA: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]PDA: [text]") /proc/log_comment(text) if (config.log_pda) //reusing the PDA option because I really don't think news comments are worth a config option - GLOB.world_game_log << "\[[time_stamp()]]COMMENT: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]COMMENT: [text]") /proc/log_chat(text) if (config.log_pda) - GLOB.world_game_log << "\[[time_stamp()]]CHAT: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]CHAT: [text]") /proc/log_sql(text) if(config.sql_enabled) - GLOB.world_game_log << "\[[time_stamp()]]SQL: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]SQL: [text]") //This replaces world.log so it displays both in DD and the file /proc/log_world(text) - GLOB.world_runtime_log << text - world.log << text + WRITE_FILE(GLOB.world_runtime_log, text) + SEND_TEXT(world.log, text) // Helper procs for building detailed log lines diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index d150e86f45..9b1507771a 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -418,7 +418,7 @@ /proc/showCandidatePollWindow(mob/M, poll_time, Question, list/candidates, ignore_category, time_passed, flashwindow = TRUE) set waitfor = 0 - M << 'sound/misc/notice2.ogg' //Alerting them to their consideration + 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)) @@ -426,7 +426,7 @@ to_chat(M, "Choice registered: Yes.") if(time_passed + poll_time <= world.time) to_chat(M, "Sorry, you answered too late to be considered!") - M << 'sound/machines/buzz-sigh.ogg' + SEND_SOUND(M, 'sound/machines/buzz-sigh.ogg') candidates -= M else candidates += M diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 7c6746f477..ee80354987 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -1,6 +1,3 @@ -//wrapper macro for sending images that makes grepping easy -#define SEND_IMAGE(target, image) target << image - /proc/random_blood_type() return pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm index 70bb8b2db6..a617437ac3 100644 --- a/code/__HELPERS/priority_announce.dm +++ b/code/__HELPERS/priority_announce.dm @@ -24,11 +24,12 @@ announcement += "
[html_encode(text)]
" announcement += "
" + var/s = sound(sound) for(var/mob/M in GLOB.player_list) if(!isnewplayer(M) && M.can_hear()) to_chat(M, announcement) if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS) - M << sound(sound) + SEND_SOUND(M, s) /proc/print_command_report(text = "", title = null, announce=TRUE) if(!title) @@ -55,6 +56,6 @@ to_chat(M, "[title]
[message]

") if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS) if(alert) - M << sound('sound/misc/notice1.ogg') + SEND_SOUND(M, sound('sound/misc/notice1.ogg')) else - M << sound('sound/misc/notice2.ogg') + SEND_SOUND(M, sound('sound/misc/notice2.ogg')) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index cd5d0c6af5..60c95f4740 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -553,7 +553,7 @@ GLOBAL_LIST_INIT(binary, list("0","1")) var/list/tosend = list() tosend["data"] = finalized - log << json_encode(tosend) + WRITE_FILE(log, json_encode(tosend)) //Used for applying byonds text macros to strings that are loaded at runtime /proc/apply_text_macros(string) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index c32c481291..abf2c1f937 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -275,7 +275,7 @@ if(M.config_tag) if(!(M.config_tag in modes)) // ensure each mode is added only once - GLOB.config_error_log << "Adding game mode [M.name] ([M.config_tag]) to configuration." + WRITE_FILE(GLOB.config_error_log, "Adding game mode [M.name] ([M.config_tag]) to configuration.") modes += M.config_tag mode_names[M.config_tag] = M.name probabilities[M.config_tag] = M.probability @@ -548,7 +548,7 @@ if("irc_announce_new_game") irc_announce_new_game = TRUE else - GLOB.config_error_log << "Unknown setting in configuration: '[name]'" + WRITE_FILE(GLOB.config_error_log, "Unknown setting in configuration: '[name]'") else if(type == "game_options") switch(name) @@ -611,13 +611,13 @@ if(mode_name in modes) continuous[mode_name] = 1 else - GLOB.config_error_log << "Unknown continuous configuration definition: [mode_name]." + WRITE_FILE(GLOB.config_error_log, "Unknown continuous configuration definition: [mode_name].") if("midround_antag") var/mode_name = lowertext(value) if(mode_name in modes) midround_antag[mode_name] = 1 else - GLOB.config_error_log << "Unknown midround antagonist configuration definition: [mode_name]." + WRITE_FILE(GLOB.config_error_log, "Unknown midround antagonist configuration definition: [mode_name].") if("midround_antag_time_check") midround_antag_time_check = text2num(value) if("midround_antag_life_check") @@ -633,9 +633,9 @@ if(mode_name in modes) min_pop[mode_name] = text2num(mode_value) else - GLOB.config_error_log << "Unknown minimum population configuration definition: [mode_name]." + WRITE_FILE(GLOB.config_error_log, "Unknown minimum population configuration definition: [mode_name].") else - GLOB.config_error_log << "Incorrect minimum population configuration definition: [mode_name] [mode_value]." + WRITE_FILE(GLOB.config_error_log, "Incorrect minimum population configuration definition: [mode_name] [mode_value].") if("max_pop") var/pop_pos = findtext(value, " ") var/mode_name = null @@ -647,9 +647,9 @@ if(mode_name in modes) max_pop[mode_name] = text2num(mode_value) else - GLOB.config_error_log << "Unknown maximum population configuration definition: [mode_name]." + WRITE_FILE(GLOB.config_error_log, "Unknown maximum population configuration definition: [mode_name].") else - GLOB.config_error_log << "Incorrect maximum population configuration definition: [mode_name] [mode_value]." + WRITE_FILE(GLOB.config_error_log, "Incorrect maximum population configuration definition: [mode_name] [mode_value].") if("shuttle_refuel_delay") shuttle_refuel_delay = text2num(value) if("show_game_type_odds") @@ -677,9 +677,9 @@ if(prob_name in modes) probabilities[prob_name] = text2num(prob_value) else - GLOB.config_error_log << "Unknown game mode probability configuration definition: [prob_name]." + WRITE_FILE(GLOB.config_error_log, "Unknown game mode probability configuration definition: [prob_name].") else - GLOB.config_error_log << "Incorrect probability configuration definition: [prob_name] [prob_value]." + WRITE_FILE(GLOB.config_error_log, "Incorrect probability configuration definition: [prob_name] [prob_value].") if("protect_roles_from_antagonist") protect_roles_from_antagonist = 1 @@ -726,7 +726,7 @@ // Value is in the form "LAWID,NUMBER" var/list/L = splittext(value, ",") if(L.len != 2) - GLOB.config_error_log << "Invalid LAW_WEIGHT: " + t + WRITE_FILE(GLOB.config_error_log, "Invalid LAW_WEIGHT: " + t) continue var/lawid = L[1] var/weight = text2num(L[2]) @@ -781,7 +781,7 @@ if("mice_roundstart") mice_roundstart = text2num(value) else - GLOB.config_error_log << "Unknown setting in configuration: '[name]'" + WRITE_FILE(GLOB.config_error_log, "Unknown setting in configuration: '[name]'") else if(type == "policies") policies[name] = value @@ -839,7 +839,7 @@ if ("disabled") currentmap = null else - GLOB.config_error_log << "Unknown command in map vote config: '[command]'" + WRITE_FILE(GLOB.config_error_log, "Unknown command in map vote config: '[command]'") /datum/configuration/proc/loadsql(filename) @@ -883,7 +883,7 @@ if("feedback_tableprefix") global.sqlfdbktableprefix = value else - GLOB.config_error_log << "Unknown setting in configuration: '[name]'" + WRITE_FILE(GLOB.config_error_log, "Unknown setting in configuration: '[name]'") /datum/configuration/proc/pick_mode(mode_name) // I wish I didn't have to instance the game modes in order to look up diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm index e5e83c85fc..2a1a04e21d 100644 --- a/code/controllers/subsystem/pai.dm +++ b/code/controllers/subsystem/pai.dm @@ -149,7 +149,6 @@ SUBSYSTEM_DEF(pai) continue if(!(ROLE_PAI in G.client.prefs.be_special)) continue - //G << 'sound/misc/server-ready.ogg' //Alerting them to their consideration to_chat(G, "[user] is requesting a pAI personality! Use the pAI button to submit yourself as one.") addtimer(CALLBACK(src, .proc/spam_again), spam_delay) var/list/available = list() diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index f4eebe95be..a0dc7c526d 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -49,7 +49,7 @@ SUBSYSTEM_DEF(persistence) satchel_string = pick_n_take(expanded_old_satchels) old_secret_satchels = jointext(expanded_old_satchels,"#") - secret_satchels[SSmapping.config.map_name] << old_secret_satchels + WRITE_FILE(secret_satchels[SSmapping.config.map_name], old_secret_satchels) var/list/chosen_satchel = splittext(satchel_string,"|") if(!chosen_satchel || isemptylist(chosen_satchel) || chosen_satchel.len != 3) //Malformed @@ -171,7 +171,7 @@ SUBSYSTEM_DEF(persistence) if(isemptylist(savable_obj)) continue old_secret_satchels += "[F.x]|[F.y]|[pick(savable_obj)]#" - secret_satchels[SSmapping.config.map_name] << old_secret_satchels + WRITE_FILE(secret_satchels[SSmapping.config.map_name], old_secret_satchels) /datum/controller/subsystem/persistence/proc/CollectChiselMessages() var/savefile/chisel_messages_sav = new /savefile("data/npc_saves/ChiselMessages.sav") @@ -181,14 +181,14 @@ SUBSYSTEM_DEF(persistence) log_world("Saved [saved_messages.len] engraved messages on map [SSmapping.config.map_name]") - chisel_messages_sav[SSmapping.config.map_name] << json_encode(saved_messages) + WRITE_FILE(chisel_messages_sav[SSmapping.config.map_name], json_encode(saved_messages)) /datum/controller/subsystem/persistence/proc/SaveChiselMessage(obj/structure/chisel_message/M) saved_messages += list(M.pack()) // dm eats one list /datum/controller/subsystem/persistence/proc/CollectTrophies() - trophy_sav << json_encode(saved_trophies) + WRITE_FILE(trophy_sav, json_encode(saved_trophies)) /datum/controller/subsystem/persistence/proc/SaveTrophy(obj/structure/displaycase/trophy/T) if(!T.added_roundstart && T.showpiece) diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index f0c11a0d83..0186589f16 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -101,8 +101,6 @@ SUBSYSTEM_DEF(shuttle) T.color = "#00ffff" #endif - //world.log << "[transit_turfs.len] transit turfs registered" - /datum/controller/subsystem/shuttle/fire() for(var/thing in mobile) if(!thing) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 08fe58e167..3c2de6eeb9 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -225,7 +225,7 @@ SUBSYSTEM_DEF(ticker) round_start_time = world.time to_chat(world, "Welcome to [station_name()], enjoy your stay!") - world << sound('sound/ai/welcome.ogg') + SEND_SOUND(world, sound('sound/ai/welcome.ogg')) current_state = GAME_STATE_PLAYING Master.SetRunLevel(RUNLEVEL_GAME) @@ -300,7 +300,7 @@ SUBSYSTEM_DEF(ticker) if("nuclear emergency") //Nuke wasn't on station when it blew up flick("intro_nuke",cinematic) sleep(35) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) station_explosion_detonation(bomb) flick("station_intact_fade_red",cinematic) cinematic.icon_state = "summary_nukefail" @@ -308,12 +308,12 @@ SUBSYSTEM_DEF(ticker) cinematic.icon_state = null flick("intro_cult",cinematic) sleep(25) - world << sound('sound/magic/enter_blood.ogg') + SEND_SOUND(world, sound('sound/magic/enter_blood.ogg')) sleep(28) - world << sound('sound/machines/terminal_off.ogg') + SEND_SOUND(world, sound('sound/machines/terminal_off.ogg')) sleep(20) flick("station_corrupted",cinematic) - world << sound('sound/effects/ghost.ogg') + SEND_SOUND(world, sound('sound/effects/ghost.ogg')) actually_blew_up = FALSE if("gang war") //Gang Domination (just show the override screen) cinematic.icon_state = "intro_malf_still" @@ -323,19 +323,19 @@ SUBSYSTEM_DEF(ticker) if("fake") //The round isn't over, we're just freaking people out for fun flick("intro_nuke",cinematic) sleep(35) - world << sound('sound/items/bikehorn.ogg') + SEND_SOUND(world, sound('sound/items/bikehorn.ogg')) flick("summary_selfdes",cinematic) actually_blew_up = FALSE else flick("intro_nuke",cinematic) sleep(35) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) station_explosion_detonation(bomb) if(NUKE_MISS_STATION || NUKE_SYNDICATE_BASE) //nuke was nowhere nearby //TODO: a really distant explosion animation sleep(50) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosionfar.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 @@ -346,42 +346,42 @@ SUBSYSTEM_DEF(ticker) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red",cinematic) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosionfar.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) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosionfar.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) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosionfar.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) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosionfar.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) - world << sound('sound/ambience/signal.ogg') + 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) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) station_explosion_detonation(bomb) cinematic.icon_state = "summary_selfdes" //If its actually the end of the round, wait for it to end. @@ -636,7 +636,7 @@ SUBSYSTEM_DEF(ticker) if(living_player_count() < config.hard_popcap) if(next_in_line && next_in_line.client) to_chat(next_in_line, "A slot has opened! You have approximately 20 seconds to join. \>\>Join Game\<\<") - next_in_line << sound('sound/misc/notice1.ogg') + SEND_SOUND(next_in_line, sound('sound/misc/notice1.ogg')) next_in_line.LateChoices() return queued_players -= next_in_line //Client disconnected, remove he @@ -804,7 +804,7 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/save_mode(the_mode) var/F = file("data/mode.txt") fdel(F) - F << the_mode + WRITE_FILE(F, the_mode) /datum/controller/subsystem/ticker/proc/SetRoundEndSound(the_sound) set waitfor = FALSE @@ -858,4 +858,4 @@ SUBSYSTEM_DEF(ticker) 'sound/roundend/disappointed.ogg'\ ) - world << sound(round_end_sound) + SEND_SOUND(world, sound(round_end_sound)) diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index 6c5466d8d9..a0bcb5feec 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -53,7 +53,7 @@ SUBSYSTEM_DEF(title) /datum/controller/subsystem/title/Shutdown() if(file_path) var/F = file("data/previous_title.dat") - F << file_path + WRITE_FILE(F, file_path) for(var/thing in GLOB.clients) if(!thing) diff --git a/code/datums/antagonists/devil.dm b/code/datums/antagonists/devil.dm index c8f00d1995..077fb94e52 100644 --- a/code/datums/antagonists/devil.dm +++ b/code/datums/antagonists/devil.dm @@ -280,7 +280,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", if(!D) return to_chat(world, "\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\"") - world << 'sound/hallucinations/veryfar_noise.ogg' + SEND_SOUND(world, sound('sound/hallucinations/veryfar_noise.ogg')) give_appropriate_spells() D.convert_to_archdevil() if(istype(D.loc, /obj/effect/dummy/slaughter/)) diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm index 6948740687..4efb17f154 100644 --- a/code/datums/antagonists/ninja.dm +++ b/code/datums/antagonists/ninja.dm @@ -141,7 +141,7 @@ /datum/antagonist/ninja/greet() - owner.current << sound('sound/effects/ninja_greeting.ogg') + SEND_SOUND(owner.current, sound('sound/effects/ninja_greeting.ogg')) to_chat(owner.current, "I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!") to_chat(owner.current, "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!") to_chat(owner.current, "Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.") diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 485ca00515..c15ede7b3e 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -37,7 +37,7 @@ icon_state = "shadow_mend" /datum/status_effect/void_price/tick() - owner << sound('sound/magic/summon_karp.ogg', volume = 25) + SEND_SOUND(owner, sound('sound/magic/summon_karp.ogg', volume = 25)) owner.adjustBruteLoss(3) @@ -247,7 +247,7 @@ for(var/datum/mind/B in SSticker.mode.cult) if(isliving(B.current)) var/mob/living/M = B.current - M << 'sound/hallucinations/veryfar_noise.ogg' + SEND_SOUND(M, sound('sound/hallucinations/veryfar_noise.ogg')) to_chat(M, "The Cult's Master, [owner], has fallen in \the [A]!") /datum/status_effect/cult_master/tick() diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index 7b43bf6396..f4f2fc089c 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -69,7 +69,7 @@ if(telegraph_message) to_chat(M, telegraph_message) if(telegraph_sound) - M << sound(telegraph_sound) + SEND_SOUND(M, sound(telegraph_sound)) addtimer(CALLBACK(src, .proc/start), telegraph_duration) /datum/weather/proc/start() @@ -83,7 +83,7 @@ if(weather_message) to_chat(M, weather_message) if(weather_sound) - M << sound(weather_sound) + SEND_SOUND(M, sound(weather_sound)) START_PROCESSING(SSweather, src) addtimer(CALLBACK(src, .proc/wind_down), weather_duration) @@ -98,7 +98,7 @@ if(end_message) to_chat(M, end_message) if(end_sound) - M << sound(end_sound) + SEND_SOUND(M, sound(end_sound)) STOP_PROCESSING(SSweather, src) addtimer(CALLBACK(src, .proc/end), end_duration) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 3f0b780205..d38a4d3467 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -448,7 +448,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) var/sound = pick(ambientsounds) if(!L.client.played) - L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE) + SEND_SOUND(L, sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE)) L.client.played = 1 sleep(600) //ewww - this is very very bad if(L.&& L.client) diff --git a/code/game/area/areas.dm.rej b/code/game/area/areas.dm.rej new file mode 100644 index 0000000000..3c097d1229 --- /dev/null +++ b/code/game/area/areas.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/area/areas.dm b/code/game/area/areas.dm (rejected hunks) +@@ -432,7 +432,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) + // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch + if(L.client && !L.client.ambience_playing && L.client.prefs.toggles & SOUND_SHIP_AMBIENCE) + L.client.ambience_playing = 1 +- L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ) ++ SEND_SOUND(L, sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ)) + + if(!(L.client && (L.client.prefs.toggles & SOUND_AMBIENCE))) + return //General ambience check is below the ship ambience so one can play without the other diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 8da7cb3169..8a6d0063b9 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -110,7 +110,7 @@ SSticker.mode.apprentices += M.mind M.mind.special_role = "apprentice" SSticker.mode.update_wiz_icons_added(M.mind) - M << sound('sound/effects/magic.ogg') + SEND_SOUND(M, sound('sound/effects/magic.ogg')) var/newname = copytext(sanitize(input(M, "You are [wizard_name]'s apprentice. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN) if (!newname) newname = randomname diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index deef4367e0..f6bf8539e0 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -171,8 +171,8 @@ if(candidates.len) //if we got at least one candidate, they're a blobbernaut now. var/client/C = pick(candidates) blobber.key = C.key - blobber << 'sound/effects/blobattack.ogg' - blobber << 'sound/effects/attackblob.ogg' + SEND_SOUND(blobber, sound('sound/effects/blobattack.ogg')) + SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg')) to_chat(blobber, "You are a blobbernaut!") to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed.") to_chat(blobber, "You can communicate with other blobbernauts and GLOB.overminds via :b") diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 0c216f1c38..9bce7319f8 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -235,7 +235,7 @@ if(istype(I, /obj/item/device/analyzer)) user.changeNext_move(CLICK_CD_MELEE) to_chat(user, "The analyzer beeps once, then reports:
") - user << 'sound/machines/ping.ogg' + SEND_SOUND(user, sound('sound/machines/ping.ogg')) chemeffectreport(user) typereport(user) else diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 099d991062..7afce8aa27 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -16,10 +16,10 @@ C.confused += 25 C.Jitter(50) else - C << sound('sound/effects/screech.ogg') + SEND_SOUND(C, sound('sound/effects/screech.ogg')) if(issilicon(M)) - M << sound('sound/weapons/flash.ogg') + SEND_SOUND(M, sound('sound/weapons/flash.ogg')) M.Knockdown(rand(100,200)) for(var/obj/machinery/light/L in range(4, user)) diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm index 4a1ca367ce..382aaec10d 100644 --- a/code/game/gamemodes/clock_cult/clock_scripture.dm +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -150,7 +150,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or if(prob(ratvarian_prob)) message = text2ratvar(message) to_chat(invoker, "\"[message]\"") - invoker << 'sound/magic/clockwork/invoke_general.ogg' + SEND_SOUND(invoker, sound('sound/magic/clockwork/invoke_general.ogg')) return TRUE /datum/clockwork_scripture/proc/check_offstation_penalty() diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index a7fb90d253..647b47e7fa 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -103,13 +103,13 @@ if(B.current) B.current.update_action_buttons_icon() if(!B.current.incapacitated()) - B.current << 'sound/hallucinations/im_here1.ogg' + SEND_SOUND(B.current, 'sound/hallucinations/im_here1.ogg') to_chat(B.current, "Acolyte [Nominee] has asserted that they are worthy of leading the cult. A vote will be called shortly.") sleep(100) var/list/asked_cultists = list() for(var/datum/mind/B in SSticker.mode.cult) if(B.current && B.current != Nominee && !B.current.incapacitated()) - B.current << 'sound/magic/exit_blood.ogg' + SEND_SOUND(B.current, 'sound/magic/exit_blood.ogg') asked_cultists += B.current var/list/yes_voters = pollCandidates("[Nominee] seeks to lead your cult, do you support [Nominee.p_them()]?", poll_time = 300, group = asked_cultists) if(QDELETED(Nominee) || Nominee.incapacitated()) @@ -280,7 +280,7 @@ for(var/datum/mind/B in SSticker.mode.cult) if(B.current && B.current.stat != DEAD && B.current.client) to_chat(B.current, "Master [ranged_ability_user] has marked [GLOB.blood_target] in the [A.name] as the cult's top priority, get there immediately!") - B.current << pick(sound('sound/hallucinations/over_here2.ogg',0,1,75), sound('sound/hallucinations/over_here3.ogg',0,1,75)) + SEND_SOUND(B.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'),0,1,75)) B.current.client.images += GLOB.blood_target_image attached_action.owner.update_action_buttons_icon() remove_ranged_ability("The marking rite is complete! It will last for 90 seconds.") @@ -324,7 +324,7 @@ return FALSE if(cooldown > world.time) if(!PM.active) - owner << "You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can pulse again!" + to_chat(owner, "You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can pulse again!") return FALSE return ..() @@ -367,7 +367,7 @@ if(!attached_action.throwing) attached_action.throwing = TRUE attached_action.throwee = target - ranged_ability_user << 'sound/weapons/thudswoosh.ogg' + SEND_SOUND(ranged_ability_user, sound('sound/weapons/thudswoosh.ogg')) to_chat(ranged_ability_user,"You reach through the veil with your mind's eye and seize [target]!") return else diff --git a/code/game/gamemodes/cult/supply.dm b/code/game/gamemodes/cult/supply.dm index 71b8c941b1..23270c3d6c 100644 --- a/code/game/gamemodes/cult/supply.dm +++ b/code/game/gamemodes/cult/supply.dm @@ -29,7 +29,6 @@ return 0 /obj/item/weapon/paper/talisman/supply/Topic(href, href_list) - world.log << "[usr], [href], [href_list]" if(QDELETED(src) || usr.incapacitated() || !in_range(src, usr)) return diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index e8b77c1172..c5b94d983f 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -270,7 +270,7 @@ if(target.use(25)) new /obj/structure/constructshell(T) to_chat(user, "The talisman clings to the metal and twists it into a construct shell!") - user << sound('sound/effects/magic.ogg',0,1,25) + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) invoke(user, 1) qdel(src) else @@ -281,7 +281,7 @@ new /obj/item/stack/sheet/runed_metal(T,quantity) target.use(quantity) to_chat(user, "The talisman clings to the plasteel, transforming it into runed metal!") - user << sound('sound/effects/magic.ogg',0,1,25) + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) invoke(user, 1) if(uses <= 0) qdel(src) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 8c8108962e..5bc162ee8f 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -375,8 +375,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( minor_announce("[key] SECONDS UNTIL DOOMSDAY DEVICE ACTIVATION!", "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4", TRUE) /obj/machinery/doomsday_device/proc/detonate(z_level = ZLEVEL_STATION) - for(var/mob/M in GLOB.player_list) - M << 'sound/machines/alarm.ogg' + sound_to_playing_players('sound/machines/alarm.ogg') sleep(100) for(var/mob/living/L in GLOB.mob_list) var/turf/T = get_turf(L) diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index dcd2ef2673..af27833d15 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -224,7 +224,7 @@ player_mind.special_role = "Morph" SSticker.mode.traitors |= player_mind to_chat(S, S.playstyle_string) - S << 'sound/magic/mutate.ogg' + SEND_SOUND(S, sound('sound/magic/mutate.ogg')) message_admins("[key_name_admin(S)] has been made into a morph by an event.") log_game("[key_name(S)] was spawned as a morph by an event.") spawned_mobs += S diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index afbc597c29..e16c21e2e2 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -74,7 +74,7 @@ generated_objectives_and_spells = TRUE mind.remove_all_antag() mind.wipe_memory() - src << 'sound/effects/ghost.ogg' + SEND_SOUND(src, sound('sound/effects/ghost.ogg')) var/datum/objective/revenant/objective = new objective.owner = mind mind.objectives += objective diff --git a/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm b/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm index e9b417de1a..bcb2218fe6 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm @@ -42,7 +42,7 @@ SSticker.mode.traitors |= player_mind to_chat(S, S.playstyle_string) to_chat(S, "You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.") - S << 'sound/magic/demon_dies.ogg' + SEND_SOUND(S, 'sound/magic/demon_dies.ogg') message_admins("[key_name_admin(S)] has been made into a slaughter demon by an event.") log_game("[key_name(S)] was spawned as a slaughter demon by an event.") spawned_mobs += S diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 755f6dd0c9..d36cab4881 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -421,8 +421,7 @@ yes_code = FALSE safety = TRUE update_icon() - for(var/mob/M in GLOB.player_list) - M << 'sound/machines/alarm.ogg' + sound_to_playing_players('sound/machines/alarm.ogg') if(SSticker && SSticker.mode) SSticker.mode.explosion_in_progress = 1 sleep(100) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 5f65c2a96d..6f1ae8e1dd 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -476,7 +476,7 @@ GiveHint(target) else if(istype(I, /obj/item/weapon/bikehorn)) to_chat(target, "HONK") - target << 'sound/items/airhorn.ogg' + SEND_SOUND(target, 'sound/items/airhorn.ogg') target.adjustEarDamage(0,3) GiveHint(target) cooldown = world.time +cooldown_time diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 06c4cce2bc..9fdcea6aaf 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -403,7 +403,7 @@ flash_color(mob_occupant, flash_color="#960000", flash_time=100) to_chat(mob_occupant, "Agony blazes across your consciousness as your body is torn apart.
Is this what dying is like? Yes it is.
") playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 50, 0) - mob_occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50) + SEND_SOUND(mob_occupant, sound('sound/hallucinations/veryfar_noise.ogg',0,1,50)) QDEL_IN(mob_occupant, 40) /obj/machinery/clonepod/relaymove(mob/user) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 66c4bfa463..c2d2d1055d 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -89,7 +89,7 @@ playsound(src, 'sound/machines/terminal_alert.ogg', 25, 0) if(prob(25)) for(var/mob/living/silicon/ai/AI in active_ais()) - AI << sound('sound/machines/terminal_alert.ogg', volume = 10) //Very quiet for balance reasons + SEND_SOUND(AI, sound('sound/machines/terminal_alert.ogg', volume = 10)) //Very quiet for balance reasons if("logout") authenticated = 0 playsound(src, 'sound/machines/terminal_off.ogg', 50, 0) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 60ac43cb41..3f18cc29e9 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -21,7 +21,7 @@ return if(!connected) - viewers(null, null) << "Cannot locate mass driver connector. Cancelling firing sequence!" + say("Cannot locate mass driver connector. Cancelling firing sequence!") return for(var/obj/machinery/door/poddoor/M in range(range, src)) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 72840241b3..2c31cb1d21 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -389,7 +389,7 @@ new /obj/effect/temp_visual/cult/sac(loc) var/atom/throwtarget throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) - L << pick(sound('sound/hallucinations/turn_around1.ogg',0,1,50), sound('sound/hallucinations/turn_around2.ogg',0,1,50)) + SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) flash_color(L, flash_color="#960000", flash_time=20) L.Knockdown(40) L.throw_at(throwtarget, 5, 1,src) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 4fdf06b530..f51e1be8bb 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -37,10 +37,7 @@ src.update_chassis_page() chassis.occupant_message("The [src] is destroyed!") chassis.log_append_to_last("[src] is destroyed.",1) - if(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon)) - chassis.occupant << sound('sound/mecha/weapdestr.ogg',volume=50) - else - chassis.occupant << sound('sound/mecha/critdestr.ogg',volume=50) + SEND_SOUND(chassis.occupant, sound(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon) ? 'sound/mecha/weapdestr.ogg' : 'sound/mecha/critdestr.ogg', volume=50)) chassis = null return ..() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 5564cd2c0a..cd385d3de3 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -596,7 +596,7 @@ /obj/mecha/proc/setInternalDamage(int_dam_flag) internal_damage |= int_dam_flag log_append_to_last("Internal damage of type [int_dam_flag].",1) - occupant << sound('sound/machines/warning-buzzer.ogg',wait=0) + SEND_SOUND(occupant, sound('sound/machines/warning-buzzer.ogg',wait=0)) diag_hud_set_mechstat() return @@ -707,7 +707,7 @@ icon_state = initial(icon_state) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) if(!internal_damage) - occupant << sound('sound/mecha/nominal.ogg',volume=50) + SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) AI.cancel_camera() AI.controlled_mech = src AI.remote_control = src @@ -860,7 +860,7 @@ setDir(dir_in) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) if(!internal_damage) - occupant << sound('sound/mecha/nominal.ogg',volume=50) + SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) return 1 else return 0 @@ -914,7 +914,7 @@ setDir(dir_in) log_message("[mmi_as_oc] moved in as pilot.") if(!internal_damage) - occupant << sound('sound/mecha/nominal.ogg',volume=50) + SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) GrantActions(brainmob) return TRUE diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index 050498d8f1..4102ba914b 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -242,7 +242,7 @@ chassis.occupant_message("Zoom mode [chassis.zoom_mode?"en":"dis"]abled.") if(chassis.zoom_mode) owner.client.change_view(12) - owner << sound('sound/mecha/imag_enh.ogg',volume=50) + SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50)) else owner.client.change_view(world.view) //world.view - default mob view size UpdateButtonIcon() diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index c9b524836f..6c02c9b4d1 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -121,7 +121,7 @@ if(!victim.client || !istype(victim)) return to_chat(victim, "RIP AND TEAR") - victim << 'sound/misc/e1m1.ogg' + SEND_SOUND(victim, sound('sound/misc/e1m1.ogg')) var/old_color = victim.client.color var/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0) var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0) diff --git a/code/game/sound.dm b/code/game/sound.dm index c728071e50..f0891eaefb 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -78,7 +78,7 @@ S.y = 1 S.falloff = (falloff ? falloff : FALLOFF_SOUNDS) - src << S + SEND_SOUND(src, S) /proc/sound_to_playing_players(sound, volume = 100, vary) sound = get_sfx(sound) @@ -94,13 +94,13 @@ next_channel = 1 /mob/proc/stop_sound_channel(chan) - src << sound(null, repeat = 0, wait = 0, channel = chan) + SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = chan)) /client/proc/playtitlemusic() UNTIL(SSticker.login_music) //wait for SSticker init to set the login music if(prefs && (prefs.toggles & SOUND_LOBBY)) - src << sound(SSticker.login_music, repeat = 0, wait = 0, volume = 85, channel = CHANNEL_LOBBYMUSIC) // MAD JAMS + SEND_SOUND(src, sound(SSticker.login_music, repeat = 0, wait = 0, volume = 85, channel = CHANNEL_LOBBYMUSIC) // MAD JAMS) /proc/get_rand_frequency() return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs. diff --git a/code/game/sound.dm.rej b/code/game/sound.dm.rej new file mode 100644 index 0000000000..003c8b9975 --- /dev/null +++ b/code/game/sound.dm.rej @@ -0,0 +1,9 @@ +diff a/code/game/sound.dm b/code/game/sound.dm (rejected hunks) +@@ -145,7 +145,3 @@ + if ("can_open") + soundin = pick('sound/effects/can_open1.ogg', 'sound/effects/can_open2.ogg', 'sound/effects/can_open3.ogg') + return soundin +- +-/proc/playsound_global(file, repeat = 0, wait, channel, volume) +- for(var/V in GLOB.clients) +- V << sound(file, repeat, wait, channel, volume) diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 1ff2360923..5ea980a91d 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -109,14 +109,14 @@ GLOBAL_PROTECT(Banlist) else GLOB.Banlist.dir.Add("[ckey][computerid]") GLOB.Banlist.cd = "/base/[ckey][computerid]" - GLOB.Banlist["key"] << ckey - GLOB.Banlist["id"] << computerid - GLOB.Banlist["ip"] << address - GLOB.Banlist["reason"] << reason - GLOB.Banlist["bannedby"] << bannedby - GLOB.Banlist["temp"] << temp + WRITE_FILE(GLOB.Banlist["key"], ckey) + WRITE_FILE(GLOB.Banlist["id"], computerid) + WRITE_FILE(GLOB.Banlist["ip"], address) + WRITE_FILE(GLOB.Banlist["reason"], reason) + WRITE_FILE(GLOB.Banlist["bannedby"], bannedby) + WRITE_FILE(GLOB.Banlist["temp"], temp) if (temp) - GLOB.Banlist["minutes"] << bantimestamp + WRITE_FILE(GLOB.Banlist["minutes"], bantimestamp) if(!temp) create_message("note", ckey, bannedby, "Permanently banned - [reason]", null, null, 0, 0) else @@ -211,17 +211,17 @@ GLOBAL_PROTECT(Banlist) GLOB.Banlist.cd = "/base" GLOB.Banlist.dir.Add("trash[i]trashid[i]") GLOB.Banlist.cd = "/base/trash[i]trashid[i]" - GLOB.Banlist["key"] << "trash[i]" + WRITE_FILE(GLOB.Banlist["key"], "trash[i]") else GLOB.Banlist.cd = "/base" GLOB.Banlist.dir.Add("[last]trashid[i]") GLOB.Banlist.cd = "/base/[last]trashid[i]" - GLOB.Banlist["key"] << last - GLOB.Banlist["id"] << "trashid[i]" - GLOB.Banlist["reason"] << "Trashban[i]." - GLOB.Banlist["temp"] << a - GLOB.Banlist["minutes"] << GLOB.CMinutes + rand(1,2000) - GLOB.Banlist["bannedby"] << "trashmin" + WRITE_FILE(GLOB.Banlist["key"], last) + WRITE_FILE(GLOB.Banlist["id"], "trashid[i]") + WRITE_FILE(GLOB.Banlist["reason"], "Trashban[i].") + WRITE_FILE(GLOB.Banlist["temp"], a) + WRITE_FILE(GLOB.Banlist["minutes"], GLOB.CMinutes + rand(1,2000)) + WRITE_FILE(GLOB.Banlist["bannedby"], "trashmin") last = "trash[i]" GLOB.Banlist.cd = "/base" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 7c20421d3c..5943e753a0 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -595,7 +595,7 @@ log_admin("[key_name(usr)] delayed the round start.") else to_chat(world, "The game will start in [newtime] seconds.") - world << 'sound/ai/attention.ogg' + SEND_SOUND(world, sound('sound/ai/attention.ogg')) log_admin("[key_name(usr)] set the pre-game delay to [newtime] seconds.") SSblackbox.add_details("admin_verb","Delay Game Start") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/admin_investigate.dm.rej b/code/modules/admin/admin_investigate.dm.rej new file mode 100644 index 0000000000..77df29a749 --- /dev/null +++ b/code/modules/admin/admin_investigate.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm (rejected hunks) +@@ -2,7 +2,7 @@ + if(!message || !subject) + return + var/F = file("[GLOB.log_directory]/[subject].html") +- F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
" ++ WRITE_FILE(F, "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
") + + + /client/proc/investigate_show(subject in list("hrefs","notes, memos, watchlist", INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS) ) diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 73c2d8067e..828fbb2e91 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -142,7 +142,7 @@ GLOBAL_PROTECT(admin_ranks) else if(!SSdbcore.Connect()) log_world("Failed to connect to database in load_admin_ranks(). Reverting to legacy system.") - GLOB.world_game_log << "Failed to connect to database in load_admin_ranks(). Reverting to legacy system." + WRITE_FILE(GLOB.world_game_log, "Failed to connect to database in load_admin_ranks(). Reverting to legacy system.") config.admin_legacy_system = 1 load_admin_ranks() return @@ -220,7 +220,7 @@ GLOBAL_PROTECT(admin_ranks) else if(!SSdbcore.Connect()) log_world("Failed to connect to database in load_admins(). Reverting to legacy system.") - GLOB.world_game_log << "Failed to connect to database in load_admins(). Reverting to legacy system." + WRITE_FILE(GLOB.world_game_log, "Failed to connect to database in load_admins(). Reverting to legacy system.") config.admin_legacy_system = 1 load_admins() return diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index be09ebd3ef..58181d663a 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -390,7 +390,7 @@ SSblackbox.add_details("admin_secrets_fun_used","Chinese Cartoons") message_admins("[key_name_admin(usr)] made everything kawaii.") for(var/mob/living/carbon/human/H in GLOB.mob_list) - H << sound('sound/ai/animes.ogg') + SEND_SOUND(H, sound('sound/ai/animes.ogg')) if(H.dna.species.id == "human") if(H.dna.features["tail_human"] == "None" || H.dna.features["ears"] == "None") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 5436590e83..ec8c2e19b4 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -506,10 +506,10 @@ ban_unban_log_save("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") message_admins("[key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") GLOB.Banlist.cd = "/base/[banfolder]" - GLOB.Banlist["reason"] << reason - GLOB.Banlist["temp"] << temp - GLOB.Banlist["minutes"] << minutes - GLOB.Banlist["bannedby"] << usr.ckey + WRITE_FILE(GLOB.Banlist["reason"], reason) + WRITE_FILE(GLOB.Banlist["temp"], temp) + WRITE_FILE(GLOB.Banlist["minutes"], minutes) + WRITE_FILE(GLOB.Banlist["bannedby"], usr.ckey) GLOB.Banlist.cd = "/base" SSblackbox.inc("ban_edit",1) unbanpanel() @@ -1697,7 +1697,7 @@ message_admins("[key_name(H)] got their cookie, spawned by [key_name(src.owner)].") SSblackbox.inc("admin_cookies_spawned",1) to_chat(H, "Your prayers have been answered!! You received the best cookie!") - H << 'sound/effects/pray_chaplain.ogg' + SEND_SOUND(H, sound('sound/effects/pray_chaplain.ogg')) else if(href_list["adminsmite"]) if(!check_rights(R_ADMIN|R_FUN)) diff --git a/code/modules/admin/verbs/BrokenInhands.dm b/code/modules/admin/verbs/BrokenInhands.dm index 89eccf285d..732ae9e91c 100644 --- a/code/modules/admin/verbs/BrokenInhands.dm +++ b/code/modules/admin/verbs/BrokenInhands.dm @@ -28,7 +28,7 @@ if(text) var/F = file("broken_icons.txt") fdel(F) - F << text + WRITE_FILE(F, text) to_chat(world, "Completely successfully and written to [F]") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 0177798e25..eef4fbd9e7 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -258,7 +258,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) for(var/client/X in GLOB.admins) if(X.prefs.toggles & SOUND_ADMINHELP) - X << 'sound/effects/adminhelp.ogg' + SEND_SOUND(X, sound('sound/effects/adminhelp.ogg')) window_flash(X, ignorepref = TRUE) to_chat(X, chat_msg) @@ -346,7 +346,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(initiator) initiator.giveadminhelpverb() - initiator << 'sound/effects/adminhelp.ogg' + SEND_SOUND(initiator, sound('sound/effects/adminhelp.ogg')) to_chat(initiator, "- AdminHelp Rejected! -") to_chat(initiator, "Your admin help was rejected. The adminhelp verb has been returned to you so that you may try again.") diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 31fb08da36..db29021463 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -167,7 +167,7 @@ //play the recieving admin the adminhelp sound (if they have them enabled) if(recipient.prefs.toggles & SOUND_ADMINHELP) - recipient << 'sound/effects/adminhelp.ogg' + SEND_SOUND(recipient, sound('sound/effects/adminhelp.ogg')) else if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT @@ -182,7 +182,7 @@ admin_ticket_log(recipient, "PM From [key_name_admin(src)]: [keywordparsedmsg]") //always play non-admin recipients the adminhelp sound - recipient << 'sound/effects/adminhelp.ogg' + SEND_SOUND(recipient, sound('sound/effects/adminhelp.ogg')) //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn if(config.popup_admin_pm) @@ -301,7 +301,7 @@ window_flash(C, ignorepref = TRUE) //always play non-admin recipients the adminhelp sound - C << 'sound/effects/adminhelp.ogg' + SEND_SOUND(C, 'sound/effects/adminhelp.ogg') C.ircreplyamount = IRCREPLYCOUNT diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index eb4c3a5f10..2bac326710 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -30,7 +30,7 @@ for(var/mob/M in GLOB.player_list) if(M.client.prefs.toggles & SOUND_MIDI) - M << admin_sound + SEND_SOUND(M, admin_sound) SSblackbox.add_details("admin_verb","Play Global Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -68,5 +68,5 @@ message_admins("[key_name_admin(src)] stopped all currently playing sounds.") for(var/mob/M in GLOB.player_list) if(M.client) - M << sound(null) + SEND_SOUND(M, sound(null)) SSblackbox.add_details("admin_verb","Stop All Playing Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index a385e68560..bf0e4e1fcc 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -40,7 +40,7 @@ to_chat(C, msg) if(C.prefs.toggles & SOUND_PRAYERS) if(usr.job == "Chaplain") - C << 'sound/effects/pray.ogg' + SEND_SOUND(C, sound('sound/effects/pray.ogg')) to_chat(usr, "Your prayers have been received by the gods.") SSblackbox.add_details("admin_verb","Prayer") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 4455af7ca9..fddc3a38d4 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -73,7 +73,7 @@ return //Logs all hrefs - GLOB.world_href_log << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" + WRITE_FILE(GLOB.world_href_log, "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
") // Admin PM if(href_list["priv_msg"]) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index c52767f1d9..193dd77c3d 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -273,7 +273,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car slot = sanitize_integer(slot, 1, max_save_slots, initial(default_slot)) if(slot != default_slot) default_slot = slot - S["default_slot"] << slot + WRITE_FILE(S["default_slot"] , slot) S.cd = "/character[slot]" var/needs_update = savefile_needs_update(S) @@ -292,7 +292,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car pref_species = new rando_race() if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000") - S["features["mcolor"]"] << "#FFF" + WRITE_FILE(S["features["mcolor"]"] , "#FFF") //Character S["OOC_Notes"] >> metadata diff --git a/code/modules/client/preferences_savefile.dm.rej b/code/modules/client/preferences_savefile.dm.rej new file mode 100644 index 0000000000..3cdbf2cd44 --- /dev/null +++ b/code/modules/client/preferences_savefile.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm (rejected hunks) +@@ -193,7 +193,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car + return 0 + S.cd = "/" + +- WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX //updates (or failing that the sanity checks) will ensure data is not invalid at load. Assume up-to-date) ++ WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //updates (or failing that the sanity checks) will ensure data is not invalid at load. Assume up-to-date + + //general preferences + WRITE_FILE(S["ooccolor"], ooccolor) diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index d56b6e0619..1d04964a8b 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -229,7 +229,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggleprayersounds)() set name = "Stop Sounds" set category = "Preferences" set desc = "Stop Current Sounds" - usr << sound(null) + SEND_SOUND(usr, sound(null)) SSblackbox.add_details("preferences_verb","Stop Self Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index 1ab499fcb5..6c91fee8c5 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -17,19 +17,16 @@ if(M.wear_suit) fibertext = "Material from \a [M.wear_suit]." if(prob(10*item_multiplier) && !(fibertext in suit_fibers)) - //world.log << "Added fibertext: [fibertext]" suit_fibers += fibertext if(!(M.wear_suit.body_parts_covered & CHEST)) if(M.w_uniform) fibertext = "Fibers from \a [M.w_uniform]." if(prob(12*item_multiplier) && !(fibertext in suit_fibers)) //Wearing a suit means less of the uniform exposed. - //world.log << "Added fibertext: [fibertext]" suit_fibers += fibertext if(!(M.wear_suit.body_parts_covered & HANDS)) if(M.gloves) fibertext = "Material from a pair of [M.gloves.name]." if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) - //world.log << "Added fibertext: [fibertext]" suit_fibers += fibertext else if(M.w_uniform) fibertext = "Fibers from \a [M.w_uniform]." @@ -39,12 +36,10 @@ if(M.gloves) fibertext = "Material from a pair of [M.gloves.name]." if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) - //world.log << "Added fibertext: [fibertext]" suit_fibers += "Material from a pair of [M.gloves.name]." else if(M.gloves) fibertext = "Material from a pair of [M.gloves.name]." if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) - //world.log << "Added fibertext: [fibertext]" suit_fibers += "Material from a pair of [M.gloves.name]." diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index e2cce14db3..93605ea78a 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -55,7 +55,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) var/skipcount = abs(error_cooldown[erroruid]) - 1 error_cooldown[erroruid] = 0 if(skipcount > 0) - world.log << "\[[time_stamp()]] Skipped [skipcount] runtimes in [E.file],[E.line]." + SEND_TEXT(world.log, "\[[time_stamp()]] Skipped [skipcount] runtimes in [E.file],[E.line].") GLOB.error_cache.log_error(E, skip_count = skipcount) error_last_seen[erroruid] = world.time @@ -92,9 +92,9 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) if(GLOB.error_cache) GLOB.error_cache.log_error(E, desclines) - world.log << "\[[time_stamp()]] Runtime in [E.file],[E.line]: [E]" + SEND_TEXT(world.log, "\[[time_stamp()]] Runtime in [E.file],[E.line]: [E]") for(var/line in desclines) - world.log << line + SEND_TEXT(world.log, line) /* This logs the runtime in the old format */ diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 8f634003f5..1386995c28 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -70,7 +70,7 @@ if(!H.client || !istype(H)) return to_chat(H, "Honk...") - H << 'sound/spookoween/scary_clown_appear.ogg' + SEND_SOUND(H, sound('sound/spookoween/scary_clown_appear.ogg')) var/turf/T = get_turf(H) if(T) new /obj/effect/hallucination/simple/clown(T, H, 50) diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 888b87cc02..9658d8b144 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -68,11 +68,11 @@ /datum/round_event/portal_storm/announce() set waitfor = 0 - playsound_global('sound/magic/lightning_chargeup.ogg', repeat=0, channel=1, volume=100) + sound_to_playing_players('sound/magic/lightning_chargeup.ogg') sleep(80) priority_announce("Massive bluespace anomaly detected en route to [station_name()]. Brace for impact.") sleep(20) - playsound_global('sound/magic/lightningbolt.ogg', repeat=0, channel=1, volume=100) + sound_to_playing_players('sound/magic/lightningbolt.ogg') /datum/round_event/portal_storm/tick() spawn_effects() diff --git a/code/modules/events/wizard/fakeexplosion.dm b/code/modules/events/wizard/fakeexplosion.dm index f6ffab2da8..3dee4a1f49 100644 --- a/code/modules/events/wizard/fakeexplosion.dm +++ b/code/modules/events/wizard/fakeexplosion.dm @@ -6,6 +6,5 @@ earliest_start = 0 /datum/round_event/wizard/fake_explosion/start() - for(var/mob/M in GLOB.player_list) - M << 'sound/machines/alarm.ogg' + 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 diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index ffec648771..1ba052c4c0 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -55,4 +55,4 @@ I.log_message("Is an imposter!", INDIVIDUAL_ATTACK_LOG) to_chat(I, "You are an imposter! Trick and confuse the crew to misdirect malice from your handsome original!") - I << sound('sound/effects/magic.ogg') + SEND_SOUND(I, sound('sound/effects/magic.ogg')) diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 7b236ea56f..5e22e7bdc8 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -100,7 +100,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic sendClientData() //do not convert to to_chat() - owner << {"If you can see this, update byond."} + SEND_TEXT(owner, "If you can see this, update byond.") pingLoop() @@ -172,7 +172,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic /proc/icon2base64(icon/icon, iconKey = "misc") if (!isicon(icon)) return FALSE - GLOB.iconCache[iconKey] << icon + WRITE_FILE(GLOB.iconCache[iconKey], icon) var/iconData = GLOB.iconCache.ExportText(iconKey) var/list/partial = splittext(iconData, "{") return replacetext(copytext(partial[2], 3, -5), "\n", "") @@ -224,7 +224,6 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic //Ok so I did my best but I accept that some calls to this will be for shit like sound and images //It stands that we PROBABLY don't want to output those to the browser output so just handle them here if (istype(message, /image) || istype(message, /sound) || istype(target, /savefile)) - target << message CRASH("Invalid message! [message]") if(!istext(message)) @@ -255,7 +254,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic continue //Send it to the old style output window. - C << original_message + SEND_TEXT(C, original_message) if(!C.chatOutput || C.chatOutput.broken) // A player who hasn't updated his skin file. continue diff --git a/code/modules/goonchat/jsErrorHandler.dm b/code/modules/goonchat/jsErrorHandler.dm index 67ea5faca3..ce257ce660 100644 --- a/code/modules/goonchat/jsErrorHandler.dm +++ b/code/modules/goonchat/jsErrorHandler.dm @@ -32,7 +32,7 @@ CRASH("Debug Error Handling encountered an error! This is highly ironic! File: '[fileName]' has exceeded the filesize limit of: [src.logFileLimit] bytes") message = "\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: \[[C && C.key ? C.key : "Unknown Client"]\] triggered: [message]" - logFile << message + WRITE_FILE(logFile, message) return 1 /datum/debugFileOutput/proc/clear(fileName) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 2ede4c360e..da769c23cb 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -351,7 +351,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp source.plane = old_plane to_chat(src, "(Click to re-enter)") if(sound) - src << sound(sound) + SEND_SOUND(src, sound(sound)) /mob/dead/observer/proc/dead_tele() set category = "Ghost" diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 86ea3d64e9..01626c5694 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -87,7 +87,7 @@ var/atom/xeno_loc = get_turf(owner) var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc) new_xeno.key = ghost.key - new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention + SEND_SOUND(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100)) //To get the player's attention new_xeno.canmove = 0 //so we don't move during the bursting animation new_xeno.notransform = 1 new_xeno.invisibility = INVISIBILITY_MAXIMUM diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 8bf10c39ba..dcc2655e9a 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -337,7 +337,7 @@ // you need earmuffs, inacusiate, or replacement else if(ears.ear_damage >= 5) to_chat(src, "Your ears start to ring!") - src << sound('sound/weapons/flash_ring.ogg',0,1,0,250) + SEND_SOUND(src, sound('sound/weapons/flash_ring.ogg',0,1,0,250)) return effect_amount //how soundbanged we are diff --git a/code/modules/mob/living/carbon/human/interactive.dm b/code/modules/mob/living/carbon/human/interactive.dm index e439f8ef9e..2ed81b9f88 100644 --- a/code/modules/mob/living/carbon/human/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive.dm @@ -97,7 +97,7 @@ if(voice_saved) return var/savefile/S = new /savefile("data/npc_saves/snpc.sav") - S["knownStrings"] << knownStrings + WRITE_FILE(S["knownStrings"], knownStrings) //botPool funcs /mob/living/carbon/human/interactive/proc/takeDelegate(mob/living/carbon/human/interactive/from,doReset=TRUE) diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm index 901f2ceabc..b56028634f 100644 --- a/code/modules/mob/living/carbon/monkey/punpun.dm +++ b/code/modules/mob/living/carbon/monkey/punpun.dm @@ -51,23 +51,23 @@ /mob/living/carbon/monkey/punpun/proc/Write_Memory(dead, gibbed) var/savefile/S = new /savefile("data/npc_saves/Punpun.sav") if(gibbed) - S["ancestor_name"] << null - S["ancestor_chain"] << 1 - S["relic_hat"] << null - S["relic_mask"] << null + WRITE_FILE(S["ancestor_name"], null) + WRITE_FILE(S["ancestor_chain"], 1) + WRITE_FILE(S["relic_hat"], null) + WRITE_FILE(S["relic_mask"], null) return if(dead) - S["ancestor_name"] << ancestor_name - S["ancestor_chain"] << ancestor_chain + 1 + WRITE_FILE(S["ancestor_name"], ancestor_name) + WRITE_FILE(S["ancestor_chain"], ancestor_chain + 1) if(!ancestor_name) //new monkey name this round - S["ancestor_name"] << name + WRITE_FILE(S["ancestor_name"], name) if(head) - S["relic_hat"] << head.type + WRITE_FILE(S["relic_hat"], head.type) else - S["relic_hat"] << null + WRITE_FILE(S["relic_hat"], null) if(wear_mask) - S["relic_mask"] << wear_mask.type + WRITE_FILE(S["relic_mask"], wear_mask.type) else - S["relic_mask"] << null + WRITE_FILE(S["relic_mask"], null) if(!dead) memory_saved = 1 diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 0c693b4749..578eaec93e 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -316,7 +316,7 @@ GLOB.cult_narsie.souls += 1 if((GLOB.cult_narsie.souls == GLOB.cult_narsie.soul_goal) && (GLOB.cult_narsie.resolved == FALSE)) GLOB.cult_narsie.resolved = TRUE - world << sound('sound/machines/alarm.ogg') + sound_to_playing_players('sound/machines/alarm.ogg') addtimer(CALLBACK(GLOBAL_PROC, .proc/cult_ending_helper, 1), 120) addtimer(CALLBACK(GLOBAL_PROC, .proc/ending_helper), 270) if(client) diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index 2e800f7de0..f0e079b594 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -163,9 +163,9 @@ if(M.client && M.can_hear() && (M.client.prefs.toggles & SOUND_ANNOUNCEMENTS)) var/turf/T = get_turf(M) if(T.z == z_level) - M << voice + SEND_SOUND(M, voice) else - only_listener << voice + SEND_SOUND(only_listener, voice) return 1 return 0 diff --git a/code/modules/mob/living/silicon/pai/personality.dm b/code/modules/mob/living/silicon/pai/personality.dm index 869009f255..4b2bc45118 100644 --- a/code/modules/mob/living/silicon/pai/personality.dm +++ b/code/modules/mob/living/silicon/pai/personality.dm @@ -17,12 +17,12 @@ var/savefile/F = new /savefile(src.savefile_path(user)) - F["name"] << src.name - F["description"] << src.description - F["role"] << src.role - F["comments"] << src.comments + WRITE_FILE(F["name"], name) + WRITE_FILE(F["description"], description) + WRITE_FILE(F["role"], role) + WRITE_FILE(F["comments"], comments) - F["version"] << 1 + WRITE_FILE(F["version"], 1) return 1 diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index ef0b35cdc3..62e0fb8fdd 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -130,7 +130,7 @@ family[C.type] += 1 else family[C.type] = 1 - S["family"] << family + WRITE_FILE(S["family"], family) memory_saved = 1 /mob/living/simple_animal/pet/cat/Runtime/proc/Deploy_The_Cats() diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 54a06cb37f..eab0ed31de 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -344,14 +344,14 @@ /mob/living/simple_animal/pet/dog/corgi/Ian/proc/Write_Memory(dead) var/savefile/S = new /savefile("data/npc_saves/Ian.sav") if(!dead) - S["age"] << age + 1 + WRITE_FILE(S["age"], age + 1) if((age + 1) > record_age) - S["record_age"] << record_age + 1 + WRITE_FILE(S["record_age"], record_age + 1) if(inventory_head) - S["saved_head"] << inventory_head.type + WRITE_FILE(S["saved_head"], inventory_head.type) else - S["age"] << 0 - S["saved_head"] << null + WRITE_FILE(S["age"], 0) + WRITE_FILE(S["saved_head"], null) memory_saved = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 6cebdd9500..6b528651f4 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -283,7 +283,7 @@ Difficulty: Very Hard for(var/obj/O in (contents-component_parts)) stored_items += O.type - S["stored_items"] << stored_items + WRITE_FILE(S["stored_items"], stored_items) memory_saved = TRUE /obj/machinery/smartfridge/black_box/proc/ReadMemory() diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 86bbcfdc45..6be40e0d43 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -936,10 +936,10 @@ /mob/living/simple_animal/parrot/Poly/proc/Write_Memory() var/savefile/S = new /savefile("data/npc_saves/Poly.sav") if(islist(speech_buffer)) - S["phrases"] << speech_buffer - S["roundssurvived"] << rounds_survived - S["longestsurvival"] << longest_survival - S["longestdeathstreak"] << longest_deathstreak + WRITE_FILE(S["phrases"], speech_buffer) + WRITE_FILE(S["roundssurvived"], rounds_survived) + WRITE_FILE(S["longestsurvival"], longest_survival) + WRITE_FILE(S["longestdeathstreak"], longest_deathstreak) memory_saved = 1 /mob/living/simple_animal/parrot/Poly/ghost diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index a704c2e43f..1c795a51fe 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -384,7 +384,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp if(O.client) to_chat(O, "[message][(enter_link) ? " [enter_link]" : ""]") if(ghost_sound) - O << sound(ghost_sound) + SEND_SOUND(O, sound(ghost_sound)) if(flashwindow) window_flash(O.client) if(source) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index e36c639eb9..105727d21d 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -892,7 +892,7 @@ transfer_in_progress = TRUE user.visible_message("[user] slots [card] into [src]...", "Transfer process initiated. Sending request for AI approval...") playsound(src, 'sound/machines/click.ogg', 50, 1) - occupier << sound('sound/misc/notice2.ogg') //To alert the AI that someone's trying to card them if they're tabbed out + SEND_SOUND(occupier, sound('sound/misc/notice2.ogg')) //To alert the AI that someone's trying to card them if they're tabbed out if(alert(occupier, "[user] is attempting to transfer you to \a [card.name]. Do you consent to this?", "APC Transfer", "Yes - Transfer Me", "No - Keep Me Here") == "No - Keep Me Here") to_chat(user, "AI denied transfer request. Process terminated.") playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) @@ -986,9 +986,6 @@ else main_status = 2 - //if(debug) - // world.log << "Status: [main_status] - Excess: [excess] - Last Equip: [lastused_equip] - Last Light: [lastused_light] - Longterm: [longtermpower]" - if(cell && !shorted) // draw power from cell as before to power the area var/cellused = min(cell.charge, GLOB.CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index b0d07e88d5..f130e7be11 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -216,7 +216,6 @@ //remove the old powernet and replace it with a new one throughout the network. /proc/propagate_network(obj/O, datum/powernet/PN) - //world.log << "propagating new network" var/list/worklist = list() var/list/found_machines = list() var/index = 1 diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 90c33bb6b3..df969d869e 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -71,7 +71,7 @@ sleep(1150) if(resolved == FALSE) resolved = TRUE - world << sound('sound/machines/alarm.ogg') + 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) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 816cd97874..f635d8e227 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -219,7 +219,7 @@ var/turf/T = get_turf(src) for(var/mob/M in GLOB.mob_list) if(M.z == z) - M << 'sound/magic/charge.ogg' + SEND_SOUND(M, 'sound/magic/charge.ogg') to_chat(M, "You feel reality distort for a moment...") if(combined_gas > MOLE_PENALTY_THRESHOLD) investigate_log("has collapsed into a singularity.", INVESTIGATE_SUPERMATTER) @@ -457,7 +457,7 @@ visible_message("[src] is consumed by the singularity!") for(var/mob/M in GLOB.mob_list) if(M.z == z) - M << 'sound/effects/supermatter.ogg' //everyone goan know bout this + SEND_SOUND(M, 'sound/effects/supermatter.ogg') //everyone goan know bout this to_chat(M, "A horrible screeching fills your ears, and a wave of dread washes over you...") qdel(src) return gain diff --git a/code/modules/spells/spell_types/knock.dm b/code/modules/spells/spell_types/knock.dm index b68491d15d..bbb2b3877f 100644 --- a/code/modules/spells/spell_types/knock.dm +++ b/code/modules/spells/spell_types/knock.dm @@ -13,7 +13,7 @@ action_icon_state = "knock" /obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets,mob/user = usr) - user << sound('sound/magic/knock.ogg') + SEND_SOUND(user, sound('sound/magic/knock.ogg')) for(var/turf/T in targets) for(var/obj/machinery/door/door in T.contents) INVOKE_ASYNC(src, .proc/open_door, door) diff --git a/code/modules/spells/spell_types/mind_transfer.dm b/code/modules/spells/spell_types/mind_transfer.dm index fafb8afde6..023af548d0 100644 --- a/code/modules/spells/spell_types/mind_transfer.dm +++ b/code/modules/spells/spell_types/mind_transfer.dm @@ -75,5 +75,5 @@ Also, you never added distance checking after target is selected. I've went ahea //Here we knock both mobs out for a time. caster.Unconscious(unconscious_amount_caster) victim.Unconscious(unconscious_amount_victim) - caster << sound('sound/magic/mandswap.ogg') - victim << sound('sound/magic/mandswap.ogg')// only the caster and victim hear the sounds, that way no one knows for sure if the swap happened + SEND_SOUND(caster, sound('sound/magic/mandswap.ogg')) + SEND_SOUND(victim, sound('sound/magic/mandswap.ogg'))// only the caster and victim hear the sounds, that way no one knows for sure if the swap happened diff --git a/code/modules/vehicles/bicycle.dm b/code/modules/vehicles/bicycle.dm index 2d9b3c8258..cd93196b69 100644 --- a/code/modules/vehicles/bicycle.dm +++ b/code/modules/vehicles/bicycle.dm @@ -13,7 +13,7 @@ /obj/vehicle/bicycle/buckle_mob(mob/living/M, force = 0, check_loc = 1) if(prob(easter_egg_chance) || (SSevents.holidays && SSevents.holidays[APRIL_FOOLS])) - M << sound(pick(bike_music), repeat = 1, wait = 0, volume = 80, channel = CHANNEL_BICYCLE) + SEND_SOUND(M, sound(pick(bike_music), repeat = 1, wait = 0, volume = 80, channel = CHANNEL_BICYCLE)) . = ..() /obj/vehicle/bicycle/unbuckle_mob(mob/living/buckled_mob,force = 0) From 514ebfe21b792a7628093b5aa7824814cb530150 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 8 Aug 2017 22:36:27 -0500 Subject: [PATCH 015/164] updates brain damage lines --- strings/brain_damage_lines.json | 13 +++++++------ strings/brain_damage_lines.json.rej | 10 ++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 strings/brain_damage_lines.json.rej diff --git a/strings/brain_damage_lines.json b/strings/brain_damage_lines.json index ce3e726dbc..e25af310c3 100644 --- a/strings/brain_damage_lines.json +++ b/strings/brain_damage_lines.json @@ -1,17 +1,17 @@ { "brain_damage": [ - "IM A PONY NEEEEEEIIIIIIIIIGH", + "@pick(semicolon)IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", - "CAPTAINS A COMDOM", - "@pick(faggot_traitor) @pick(george) @pick(mellens) is grifing me HALP!!!", + "@pick(semicolon)CAPTAINS A COMDOM", + "@pick(semicolon)@pick(faggot_traitor) @pick(george) @pick(mellens) is grifing me HALP!!!", "can u give me @pick(mutations)?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", - "I WANNA PET TEH monkeyS", + "@pick(semicolon)I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#", "shiggey diggey!!", - "A PIRATE APPEAR", + "@pick(semicolon)A PIRATE APPEAR", "FUS RO DAH", "fucking 4rries!", "stat me", @@ -136,7 +136,8 @@ "random_gibberish": [ "g", "squid", - "r" + "r", + "carbon dioxide" ], "y_replacements": [ diff --git a/strings/brain_damage_lines.json.rej b/strings/brain_damage_lines.json.rej new file mode 100644 index 0000000000..6d8e1cdb62 --- /dev/null +++ b/strings/brain_damage_lines.json.rej @@ -0,0 +1,10 @@ +diff a/strings/brain_damage_lines.json b/strings/brain_damage_lines.json (rejected hunks) +@@ -131,7 +131,7 @@ + "", + "IS TIS A BUG??", + "SI IST A BUGG/", +- "BUG!!!" ++ "BUG!!!" + ], + + "semicolon": [ From 805aa06807fcf20efd2896ef9e97615a50eb3978 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 9 Aug 2017 11:23:09 -0500 Subject: [PATCH 016/164] adds bear tails/ears to humans as well --- .../new_player/sprite_accessories_Citadel.dm | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm index 8e724f1aa5..55572d8187 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm @@ -31,6 +31,16 @@ color_src = 0 icon = 'icons/mob/mam_bodyparts.dmi' +/datum/sprite_accessory/mam_tails/human/bear + name = "Bear" + icon_state = "bear" + icon = 'icons/mob/mam_bodyparts.dmi' + +/datum/sprite_accessory/mam_ears/human/bear + name = "Bear" + icon_state = "bear" + icon = 'icons/mob/mam_bodyparts.dmi' + /datum/sprite_accessory/tails/human/catbig name = "Cat, Big" icon_state = "catbig" @@ -234,16 +244,9 @@ extra = 1 extra_color_src = MUTCOLORS2 -/datum/sprite_accessory/mam_ears/catbig - name = "Cat, Big" - icon_state = "cat" - hasinner = 1 - icon = 'icons/mob/mutant_bodyparts.dmi' - /datum/sprite_accessory/mam_tails/bear name = "Bear" icon_state = "bear" - extra_color_src = MUTCOLORS2 icon = 'icons/mob/mam_bodyparts.dmi' /datum/sprite_accessory/mam_ears/bear @@ -251,6 +254,12 @@ icon_state = "bear" icon = 'icons/mob/mam_bodyparts.dmi' +/datum/sprite_accessory/mam_ears/catbig + name = "Cat, Big" + icon_state = "cat" + hasinner = 1 + icon = 'icons/mob/mutant_bodyparts.dmi' + /datum/sprite_accessory/mam_tails/catbig name = "Cat, Big" icon_state = "catbig" From cad81a26e25599ac296388bb73c4c6038e51b188 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 10 Aug 2017 06:13:49 -0500 Subject: [PATCH 017/164] Automatic changelog generation for PR #2320 [ci skip] --- html/changelogs/AutoChangeLog-pr-2320.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2320.yml diff --git a/html/changelogs/AutoChangeLog-pr-2320.yml b/html/changelogs/AutoChangeLog-pr-2320.yml new file mode 100644 index 0000000000..695f23e7de --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2320.yml @@ -0,0 +1,4 @@ +author: "LetterJay" +delete-after: True +changes: + - tweak: "Adds the option for bear ears and tails for humans as well." From f6da0f89c3f6d2288048f40f7c8f915d966a3098 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 10 Aug 2017 08:09:25 -0500 Subject: [PATCH 018/164] decapitalizes flyswatter in weaponry.dm --- code/game/objects/items/weapons/weaponry.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index ee6b2ea2c2..b49dc1c510 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -540,7 +540,7 @@ return 1 /obj/item/weapon/melee/flyswatter - name = "Flyswatter" + name = "flyswatter" desc = "Useful for killing insects of all sizes." icon = 'icons/obj/weapons.dmi' icon_state = "flyswatter" From bd8289b29f588948524b3745136620d099408bf2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 10 Aug 2017 10:49:22 -0500 Subject: [PATCH 019/164] Massively improves downloading/viewing logs. --- code/modules/admin/verbs/getlogs.dm | 32 ++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index fe3fe61b3f..9f08eb5e0e 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -13,7 +13,17 @@ return message_admins("[key_name_admin(src)] accessed file: [path]") - src << ftp(file(path)) + //this is copypasta because making it a proc would mean locking out adminproccalls, + // and that system is buggy enough with false positives that I don't want to risk locking admins out of legit calls. + switch(alert("View (in game), Open (in your system's text editor), or Download file [path]?", "Log File Opening", "View", "Open", "Download")) + if ("View") + src << browse("
[html_encode(file2text(file(path)))]
", list2params(list("window" = "viewfile.[path]"))) + if ("Open") + src << run(file(path)) + if ("Download") + src << ftp(file(path)) + else + return to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.") return @@ -27,7 +37,15 @@ set desc = "Shows server log for this round." if(fexists("[GLOB.world_game_log]")) - src << ftp(GLOB.world_game_log) + switch(alert("View (in game), Open (in your system's text editor), or Download file [GLOB.world_game_log]?", "Log File Opening", "View", "Open", "Download")) + if ("View") + src << browse("
[html_encode(file2text(GLOB.world_game_log))]
", list2params(list("window" = "viewfile.[GLOB.world_game_log]"))) + if ("Open") + src << run(GLOB.world_game_log) + if ("Download") + src << ftp(GLOB.world_game_log) + else + return else to_chat(src, "Server log not found, try using .getserverlog.") return @@ -41,7 +59,15 @@ set desc = "Shows server attack log for this round." if(fexists("[GLOB.world_attack_log]")) - src << ftp(GLOB.world_attack_log) + switch(alert("View (in game), Open (in your system's text editor), or Download file [GLOB.world_attack_log]?", "Log File Opening", "View", "Open", "Download")) + if ("View") + src << browse("
[html_encode(file2text(GLOB.world_attack_log))]
", list2params(list("window" = "viewfile.[GLOB.world_attack_log]"))) + if ("Open") + src << run(GLOB.world_attack_log) + if ("Download") + src << ftp(GLOB.world_attack_log) + else + return else to_chat(src, "Server attack log not found, try using .getserverlog.") return From 4686340d3caaed764abcc748fd2db8da7037d739 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 11 Aug 2017 02:47:05 -0500 Subject: [PATCH 020/164] Fixes help text for embedded objects --- code/_onclick/hud/alert.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index b944f32754..e1f1410837 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -205,7 +205,7 @@ or something covering your eyes." /obj/screen/alert/embeddedobject name = "Embedded Object" desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \ -If you're feeling frisky, click yourself in help intent to pull the object out." +If you're feeling frisky, examine yourself and click the underlined item to pull the object out." icon_state = "embeddedobject" /obj/screen/alert/embeddedobject/Click() From fa19568a06d6260f91bdc49d7d50d1f9e440b2d9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 11 Aug 2017 02:49:11 -0500 Subject: [PATCH 021/164] Ports weapons to Initialize() --- code/game/objects/weapons.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm index 0598d88a59..69c6c89870 100644 --- a/code/game/objects/weapons.dm +++ b/code/game/objects/weapons.dm @@ -2,8 +2,8 @@ name = "weapon" icon = 'icons/obj/weapons.dmi' -/obj/item/weapon/New() - ..() +/obj/item/weapon/Initialize() + . = ..() if(!hitsound) if(damtype == "fire") hitsound = 'sound/items/welder.ogg' From dab46b002c030ea273c714ac69bd3095ffb4c967 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 11 Aug 2017 02:50:20 -0500 Subject: [PATCH 022/164] Ports weaponry to Initialize --- code/game/objects/items/weapons/weaponry.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index ee6b2ea2c2..10449b394e 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -77,8 +77,8 @@ var/notches = 0 //HOW MANY PEOPLE HAVE BEEN SLAIN WITH THIS BLADE var/obj/item/weapon/disk/nuclear/nuke_disk //OUR STORED NUKE DISK -/obj/item/weapon/claymore/highlander/New() - ..() +/obj/item/weapon/claymore/highlander/Initialize() + . = ..() START_PROCESSING(SSobj, src) /obj/item/weapon/claymore/highlander/Destroy() @@ -555,8 +555,8 @@ //Things in this list will be instantly splatted. Flyman weakness is handled in the flyman species weakness proc. var/list/strong_against -/obj/item/weapon/melee/flyswatter/New() - ..() +/obj/item/weapon/melee/flyswatter/Initialize() + . = ..() strong_against = typecacheof(list( /mob/living/simple_animal/hostile/poison/bees/, /mob/living/simple_animal/butterfly, From 6c6d8e5193d7abacfaa035044e1e66f4740b3733 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 11 Aug 2017 02:52:25 -0500 Subject: [PATCH 023/164] Fixes cable cuff inhand --- code/game/objects/items/weapons/handcuffs.dm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 802c2d499a..40fa7d2520 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -90,8 +90,8 @@ desc = "Looks like some cables tied together. Could be used to tie something up." icon_state = "cuff_red" item_state = "coil_red" - lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' - righthand_file = 'icons/mob/inhands/items_righthand.dmi' + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' materials = list(MAT_METAL=150, MAT_GLASS=75) origin_tech = "engineering=2" breakouttime = 300 //Deciseconds = 30s @@ -145,9 +145,7 @@ /obj/item/weapon/restraints/handcuffs/cable/white icon_state = "cuff_white" - item_state = "cuff_white" - lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + item_state = "coil_white" /obj/item/weapon/restraints/handcuffs/alien icon_state = "handcuffAlien" @@ -212,7 +210,6 @@ name = "zipties" desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use." icon_state = "cuff_white" - item_state = "cuff_white" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' materials = list() @@ -222,6 +219,7 @@ /obj/item/weapon/restraints/handcuffs/cable/zipties/used desc = "A pair of broken zipties." icon_state = "cuff_white_used" + item_state = "cuff_white" /obj/item/weapon/restraints/handcuffs/cable/zipties/used/attack() return From 62a7d4301f3bffdedffb2ca1eea0ef54ed8616e7 Mon Sep 17 00:00:00 2001 From: ktccd Date: Fri, 11 Aug 2017 20:13:01 +0200 Subject: [PATCH 024/164] Refactored flavortext. Flavortext is now stored in DNA features and can thus be stolen by changelings and restored by cloners/pods/etc. Also added genitals_use_skintone to the random features proc, 'cause it was missing (my bad, I was even newer at messing with DNA back then :S). --- code/__HELPERS/mobs.dm | 6 ++++-- code/datums/dna.dm | 2 ++ code/modules/client/preferences.dm | 20 ++++++++++---------- code/modules/client/preferences_savefile.dm | 15 ++++++++++----- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 7c6746f477..924f8daf08 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -116,6 +116,7 @@ "xenohead" = "None", "xenotail" = "None", "exhibitionist" = FALSE, + "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = pick(GLOB.cock_shapes_list), "cock_length" = 6, @@ -158,8 +159,9 @@ "womb_cum_rate" = CUM_RATE, "womb_cum_mult" = CUM_RATE_MULT, "womb_efficiency" = CUM_EFFICIENCY, - "womb_fluid" = "femcum")) - + "womb_fluid" = "femcum", + "flavor_text" = "")) + /proc/random_hair_style(gender) switch(gender) if(MALE) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 550ea590bf..4bacf2d9e8 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -32,6 +32,7 @@ if(ishuman(destination)) var/mob/living/carbon/human/H = destination H.give_genitals(TRUE)//This gives the body the genitals of this DNA. Used for any transformations based on DNA + destination.flavor_text = destination.dna.features["flavor_text"] //Update the flavor_text to use new dna text /datum/dna/proc/copy_dna(datum/dna/new_dna) new_dna.unique_enzymes = unique_enzymes @@ -231,6 +232,7 @@ if(newfeatures) dna.features = newfeatures + flavor_text = dna.features["flavor_text"] //Update the flavor_text to use new dna text if(mrace) set_species(mrace, icon_update=0) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 1e07ee4ce0..4c23db3f86 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -130,7 +130,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) "womb_cum_rate" = CUM_RATE, "womb_cum_mult" = CUM_RATE_MULT, "womb_efficiency" = CUM_EFFICIENCY, - "womb_fluid" = "femcum" + "womb_fluid" = "femcum", + "flavor_text" = "" )//MAKE SURE TO UPDATE THE LIST IN MOBS.DM IF YOU'RE GOING TO ADD TO THIS LIST, OTHERWISE THINGS MIGHT GET FUCKEY var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity") @@ -175,7 +176,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) //citadel code var/arousable = TRUE //Allows players to disable arousal from the character creation menu - var/flavor_text = "" /datum/preferences/New(client/C) parent = C @@ -394,13 +394,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
" dat += "

" dat += "Set Flavor Text
" - if(lentext(flavor_text) <= 40) - if(!lentext(flavor_text)) + if(lentext(features["flavor_text"]) <= 40) + if(!lentext(features["flavor_text"])) dat += "\[...\]" else - dat += "[flavor_text]" + dat += "[features["flavor_text"]]" else - dat += "[TextPreview(flavor_text)]...
" + dat += "[TextPreview(features["flavor_text"])]...
" if(config.mutant_races)//really don't need this check, but fuck un-tabbing all those lines dat += "

Body

" dat += "Gender: [gender == MALE ? "Male" : "Female"]
" @@ -916,11 +916,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) if("flavor_text") - var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message + var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(features["flavor_text"])) as message if(msg != null) msg = copytext(msg, 1, MAX_MESSAGE_LEN) msg = html_encode(msg) - flavor_text = msg + features["flavor_text"] = msg if("metadata") var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null @@ -1628,7 +1628,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.backbag = backbag - character.dna.features = features.Copy() + character.dna.features = features.Copy() //Flavor text is now a DNA feature character.dna.real_name = character.real_name var/datum/species/chosen_species if(pref_species != /datum/species/human && config.mutant_races) @@ -1639,7 +1639,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) //citadel code character.give_genitals() - character.flavor_text = flavor_text + character.flavor_text = features["flavor_text"] //Let's update their flavor_text at least initially character.canbearoused = arousable if(icon_updates) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index c52767f1d9..a4b57422c7 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -342,9 +342,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["job_engsec_med"] >> job_engsec_med S["job_engsec_low"] >> job_engsec_low - //Citadel code - S["flavor_text"] >> flavor_text S["feature_exhibitionist"] >> features["exhibitionist"] S["feature_mcolor2"] >> features["mcolor2"] S["feature_mcolor3"] >> features["mcolor3"] @@ -382,6 +380,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_vag_color"] >> features["vag_color"] //womb features S["feature_has_womb"] >> features["has_womb"] + //flavor text + //Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts: + if((S["feature_flavor_text"] == "") && (S["flavor_text"] != "")) //If we got no new flavor_text data, but we have old + S["flavor_text"] >> features["flavor_text"] + else //Otherwise use new flavor_text data always + S["feature_flavor_text"] >> features["flavor_text"] + //try to fix any outdated data if necessary if(needs_update >= 0) @@ -441,7 +446,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) //Citadel - flavor_text = sanitize_text(flavor_text, initial(flavor_text)) + features["flavor_text"] = sanitize_text(features["flavor_text"], initial(features["flavor_text"])) if(!features["mcolor2"] || features["mcolor"] == "#000") features["mcolor2"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F") if(!features["mcolor3"] || features["mcolor"] == "#000") @@ -510,7 +515,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["job_engsec_low"] << job_engsec_low //Citadel - S["flavor_text"] << flavor_text S["feature_exhibitionist"] << features["exhibitionist"] S["feature_mcolor2"] << features["mcolor2"] S["feature_mcolor3"] << features["mcolor3"] @@ -548,7 +552,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_vag_color"] << features["vag_color"] //womb features S["feature_has_womb"] << features["has_womb"] - + //flavor text + S["feature_flavor_text"] << features["flavor_text"] return 1 #undef SAVEFILE_VERSION_MAX From 9ef1825ee01e28057dfc8a88c13f9b43e4416dcb Mon Sep 17 00:00:00 2001 From: ktccd Date: Fri, 11 Aug 2017 21:29:01 +0200 Subject: [PATCH 025/164] Adds Taur cocks (#2329) * Added flared taur penises FIRST STEP ONLY DO NOT PULL REQUEST THIS!!!! The files are still messy and the penis is just another shape to choose from right now for testing purposes! Flipped the order of GENITALS_BEHIND_LAYER and BODY_BEHIND_LAYER, as taurs need to be drawn on top of the genitalia, and I don't think anything else uses this that would need genitals drawn on top of them. * Adds More shapes Adds Tapered and Knotted shapes to the Taur cocks. * Fixes on-ground sprites The OLD bug barbed knotted cocks being invisible when not inside a body is fixed. This fix solves why taur cocks were invisible when cut off or gibbed the body. This also removes the lowershape() workaround that was being used. I'll get around a bigger refactor of other genitalia in another PR, as the scope of this was just to add taur cocks to begin with... --- code/__DEFINES/misc.dm | 4 +-- code/__HELPERS/global_lists.dm | 5 ++++ code/citadel/_cit_helpers.dm | 1 + code/citadel/icons/taur_penis_onmob.dmi | Bin 0 -> 704 bytes code/citadel/organs/genitals.dm | 2 ++ .../organs/genitals_sprite_accessories.dm | 27 ++++++++++++++++++ code/citadel/organs/penis.dm | 2 +- icons/mob/mam_taur.dmi | Bin 38211 -> 38242 bytes 8 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 code/citadel/icons/taur_penis_onmob.dmi diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index e0ab84f832..6a932ead4a 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -46,8 +46,8 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s //Human Overlays Indexes///////// //citadel code #define MUTATIONS_LAYER 30 //mutations. Tk headglows, cold resistance glow, etc -#define BODY_BEHIND_LAYER 29 //certain mutantrace features (tail when looking south) that must appear behind the body parts -#define GENITALS_BEHIND_LAYER 28 +#define GENITALS_BEHIND_LAYER 29 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer +#define BODY_BEHIND_LAYER 28 //certain mutantrace features (tail when looking south) that must appear behind the body parts #define BODYPARTS_LAYER 27 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag #define BODY_ADJ_LAYER 26 //certain mutantrace features (snout, body markings) that must appear above the body parts #define GENITALS_ADJ_LAYER 25 diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 92d5dcbd80..1af231f893 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -48,6 +48,11 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_dorsal, GLOB.xeno_dorsal_list) //genitals init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list) + + for(var/K in GLOB.cock_shapes_list) + var/datum/sprite_accessory/penis/value = GLOB.cock_shapes_list[K] + GLOB.cock_shapes_icons[K] = value.icon_state + init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) GLOB.breasts_size_list = list("a","b","c","d","e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing. diff --git a/code/citadel/_cit_helpers.dm b/code/citadel/_cit_helpers.dm index db0626fa9c..e6dca1e369 100644 --- a/code/citadel/_cit_helpers.dm +++ b/code/citadel/_cit_helpers.dm @@ -53,6 +53,7 @@ GLOBAL_LIST_EMPTY(xeno_dorsal_list) //Genitals and Arousal Lists GLOBAL_LIST_EMPTY(cock_shapes_list)//global_lists.dm for the list initializations //Now also _DATASTRUCTURES globals.dm +GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states for cockshapes. GLOBAL_LIST_EMPTY(breasts_size_list) GLOBAL_LIST_EMPTY(breasts_shapes_list) GLOBAL_LIST_EMPTY(vagina_shapes_list) diff --git a/code/citadel/icons/taur_penis_onmob.dmi b/code/citadel/icons/taur_penis_onmob.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3debbd0047228c869a639a16566445d46fcbf113 GIT binary patch literal 704 zcmV;x0zdtUP)(+`6z6 z8x9R6Z)ecPavUhJ;BFRU={p)wBg9y3u(+V+hxTAps~Rz--k7{#UJ;ko@~DAK}@k-paGqfdBvjvPnci zRCt{2n?Y{EFc3w@Qj>KzK`N)o5xOW{ux3L}(?xrOc0o^BAt5zmeuh+uf}!uNh{ygJ zd%=8cV+H_lchv1&3#1p_-t@=h0#*NcuLWFl^BiQf&Vr|Rd}>`Gpu1{WDPTL*N@y)-i zKjUoRd%S-jw=niDuiRkx=f(sBOA7!1VE6+iFt0!8#OA))$|V;1 zgGSDwb4zpKd?AY-Ni&}>#14h?1pt5>qwMPgqsS|hi;cN|5bo}8S`(yAl!2d;HW)gu z0YLx&fMvOUc`y8a;$(j?=K8?o6GqLKxw3;CBy&`>6Q?Y2Bl*G(g=v8QUVG}cQ?|~&8Cs=?#(y% z^Stl5&Y$z|eEZt4Yp%IwjJU@b_iW8UU(7)-vX_KQb_$%Q7UY99pFZs>??HDz`=aBL zg`G3O|0a3pH9=E*lF*+a_;K2y6hA++dT*$6Zc~@REZA!lQ2Lx_BOaN_Xk6ze&QwDXlMXqiOE_ zz*y&iX~(b4H~MtO_g6F?Y-|!3d##0kqsqQ%lIE@^;)mQAu%$-OpiL5AG_t!j)4D}G zolinO)*+`hH}Z`ef7XcCj+iqcI7|(Q(K#?uVQbGN&(yxVkTJaNJUTl0bN1p`e>ex$ zVHDs2dvjaeF9vP7%=-IVIak+8%okX!m1wHVnR^kg_9LL-n=v>~ zx5R4n{-CPcM{fq{4>~H&alwbH{hkM5oJB-v)QKjWc71-ZAjd5(cg?blDJTL z%b2@w=WCRVU0Y>YY*9zH_#xr+;Ay~%#oDfHXIIxAAUGUeizZ&FCjnop2xuV)k_;q` zDWtj^bAwL;W4;DoL`|KvR9L$z4DWtA>9}F*uO&yLh9Ko6ZH(9?ArYZ=TX|772m|sh z`-A_oU*<-VWdbb~UU1(YNS7a)n4rF{>p?_81Q3+Pqvktg{Gd^xX#}SUf|%Jd zjDz=wIQdaM{!nDPMfsIF<27t#BZJNlK~LZ$0R@4JP03KXB7G%4VdCVqU;>F1nX#m# zq}r;I9KjMl&r4BzC9NM4J9TE=tI;|+&XYsa8IK=7zR=PxQvk$9P9J?jzo8g(AS3XS2${_gHC`}>Zhqz^q$^70Cd7<6~cH=jDI zx2aTYl3Rr3e>6jyZCq>?QjwC@?|eG`4KwBbtX7POjO@-C&6PAvb8$iSnvlRz`nErw z&aRGS=mowLAGMUZbWi&dHo6q z$k6UXx4rK+4RGo9)Y!;9lHF^hlyk|k`Sc&}lH(s9yQjO+?Y3J>O&wOF8=87=G=GkP z(L1N^Xt0j^e?@xN?Ip!I+rEB2oH2frbl+~s-}X^|g?kZ?*a9S5$YwSJx8))xY6|mm zMzr#cetOfNO_Uz5V}jwnSa)wCv>G3O9EC+EfcI9vzj3cFOEp~V!`f#XM1_ii!ndR( z^$RH=t_PV+NJ}{h{rVeGZ=$`437u#Ct+PkW@oNv4aEe~ptY&45NAEX1GT-pPf?l() zJra|VF>YCKm`+12Dx56kspaJ4bcc)UdF-o<*e|)-h0jb((qm&|m37!9BqRhw9=N#w zJ-Yt7j&?Tm^Z7j~Vo$vqo8J~!V$!pxOG``9dlFlFl$$`?!tgKi(beQ)g0O|(x-2Cm^=XQ1l@V}Ln?&OE>fBg8NAYwDY zZ&J;rUC=pQ{ho(&UpNbUz8|^%wtV6@5o+0wCuOd=CD5>+kvEy94KvYYHvyw#Wn-h< z-roK%@h0)D+@8Qqap$E7mPx(c?NP(6_n5}3Psv?yo1v{8(B*BsK!rO zkLVfF-&x1L*~8d|uZM45bwn{GXy$4urjBRBipdhLFBB9gc?~#GZeVC=sI#A2r$|;o zq2c83_=x{4{C~v}QC(l|KL58in7Md(uIxpX#_x>jmh=5NNkwIPdU`-14d0;f*U{13 z@`Z(kU#s2m3Gdo-<*R1EIQ1qEN`9SM6Ev!S%`4!rX4A3G;gWQ?h2!?f%q(+l{F@5= z;nI9!yt3h%XZv4QO!NQ(xTEx!Px_J{vgK+O4xxk+rHcAh4(T6UTpl-kz^CGk?O^oe zcDftd-v0RcV_30@6f4W&Y{0}B{FN__GT_RO@0)dK-XA{`#;TuSUc1|Vn%a%l#Naxc z&LHC=Y2vx%<{UhP;F%F*Eft5SBo-^4W~`!B4i?@^S`*mX-EF)%{pK^DfxR$2J^d?f zFnfL77`0%1eJ_6J<$Vg6D=6Sq?_uaU>iPcjQ2cKt$~T9SahNZ6$EmStTyXyTP@v%O z7gmnr;S2xd@9_><_yX?tkW$VjI;s(k#3|IPf2LpU^fOt^QEqIe9PTT{rg9OQeDqwf z5W|i}mr9j*i&6;6-N6Z+EjLjbU2@Xdx0e_H%i+-j zRqOqh*oIa{dV1w^*9{Js;gCt)-QE3N!r;4ug9BC;H*xLeflWyxOFh?d@$L1usq9zi zMJW^ah?V^u3L+zkCgEbU;5^;Z$Bf=vgFj9lHotyZQc{u;Uyi5F{F;W(2+2+93<2F~ zyt!;l==WNA0Q}F;bH1(&#c*X^kzwU}iUW-Vi6tk?S=5yC3ykt_A^bO50`c$l!p<=$ z>!_Y~5xb_&T&G8D3!q4Ry51b+VWnsZ&eQoVCon6%T(Z^`3^dN*79DhQdyzbI^WOgYF$S6J->H+5-H0w^U>H$ zA$2#XA5bk`(OwTHr1g~mhX`k8X39??5Q++{H%Y}d>|e#PfuDqmXxV`Oq_*)ip<|Qh zeWcGy3cRH`wS?g+@YEv5SBL$>LApr)#wubY0(JgRnHw_**@5w<}z62&5 z_|R8jb%Z8p)HJ*pF?$$YT{@VRhzD*n^rvr(p~4oy9uW~yVv7*T4fiKVS4ru}+y0%4 z;qas6sMh;xA9i^LS)fbkzx6-{u9nLO6SZB>ZIqaJSgNlk?Qj2f+Ha&Xa(mQfWoh}6 zuWk?aFR8J)O1d)s5fK}9kyf#kW_Yu{X|Z*4wZwFD*3meE{8}vKyq*7f$uRO)aj}{h zdRe1F!k3I|2y91{2Oj41$31)q5^Re@6B}IP+ls2dfS?Dx;8Q%~cj`xFm0c}-w%Di! z&S+vH3Z&nY{ZQ@yezA2%TRiWZgT0k_460t@;p40873Alu9Fe>sP-T_#EeU1vy1{;? z@T0I$6=fTNb&d(dr@~vHf}q5hMiS#;k#nM$;a?E#F|x$2NA?x@&Qu}K-D)rJsBeKmCVIL)JWDBm3!Bz zz(bKn{|diLmb~>2d37#mKP!2TJZ*>=_a!ShX(OhlC;et2cx3+A$`ugH`cI-$=tC1I*9Nbhy!FPf0Z8+Yx zCr!4onXPkYWrYuBc70r1W(-S8OP3|)u8Fp>n;x|DM*R+_;_L2;;aINthA^nVmhkxZ zt7bhb=?=KwqBnJU;}q|*)CSWHxHYGRmO$Ko`-!4Q&z?PFmzqGUETj*$CAH0pc8kRxET%62#>64MJOV0f6OOfCJfG^_eYHzOy1v&oX@x&HR z;q_rAx%AJ#3HE)e^c6~$_SQq~oxHsK!KU$zo{0S{H@Geiz)H4lwv9Ca?h8)-@#@D^iZcz8!fM0{0$;uiFV zt!cqQ$F6o;WU|UJ^J-=e38!rA?j|ttT^Dm3)(CB^zDSd1sMhmkbZA|07{S@wU+TC^ zPt-$V)DL2#b*>dIH=~nV%=|9*mzRY-PIL+b>)>Cj+LlHmj7SB|0Zdf z6=kFrT5joqhEiEmoL@*=L(!qhh-pBD_z}tDJdyV zJJSz!%RMw(D5OM1wH2gkZrRz`nEx9$0ioK@{Cu7bfq7wr^*=MF*+TSEP9qNvy|P=W z-FSHMlwSvLr!9-Nbp9`<*99=L0@jFsad8+J80fV42e*1DQUV1;jocP)og4L?j@)=5 zVLhX-iPLdh+U6%)lO>je8NXJkc=Ya|06jp8IvRpdqAq4_mzoTJ(wj;-qf(2At%+iJ zadB}}NB+&PU-d{`Ok{p@)D;W%`Qv(VwBEVg*KjzqYniQ@7U{tNLjV)&x^Psv`dmip zRobNpiHi16HSFDbXJ;2*%w_iU*7pzbw;;&3QkT-VM>{qbIPL0%Ai6tze0)Dil2ASb z+7s!?l3hb{5g(==(xn7nfXETzHC8LIc+>w%bk;5N!-o%@D7OXF=RpHEXuxc`pverp zP9~B@)LIvO;gfYU=TkHGF?LDpliYSpZ8kL)bYFIY>?iJA z3l{|>&us6A;LZ`&_Nv_;8j2mk>W&kW4I$k3?v$%Ak5PWX0;@gpD@erv63NNQIp86T zlLwKh5nLnZcNNRv%{WGcJQm}555Fux5N-?SRP5J>H-W3hBpzN3JsSmG=6{63@7l}? zh2LV25wNM&F}anvIQBpWetb0_ERz@;-0|jE+g|f^LJtMyQI=|2!SaTs6%ZOrYio5x z>$20k`e(2}W(SGvAh`d#dOU%u_=OuF8PdFt9$o^F+-1La0Kj#&(1W+Lw+L6Wm+l zfz-ql)n2}Q=?fwg)s6dm`2CH{z$`}j`=cMj*TzxG?3sG&Qv2DNa$0bC6CQuW@4|E2a^hirft1-t_QlnXk z_7`hH6oIo{C7rOaFyt$-Q-wjnq={3Xg2SO2fPw%xP@)X%)A%OHs-s!*WX;T!8*Vvr z`z+5aXCLF^y_{<-5StJe{_}Z4&Mtn;C-_7~^YaI$=LgIDw3)kuCr3xWJdqr#sS0v( zXFYs8JUm;)i*K;!BPDj43gPQbA9xrWuN_3GT9-rXA5QcOva;B1XryX^>6rf@?zlF< z0xj5zYe+mB^xt7{oko)s=gpO5r}p3oqDqAydEFp)qb@z|{=FD9r|1#bE#9bIs6p*r z&^IfV8>xXZ9aAVvfRyJ-JmrOkhQ_bT1a4iy`RfF3L(|Wi0yJ*&7^Se+mfNq8$844G z_dR^fV2Mr^Vq@e%!sxmnbx(!I%4&be01JAw=Ca!avV+lExzl&$gE$%#OvJE3WrMOg z03Q&GrTN>E(+0fpRJ88sJQt+yur3$Mw^32W zb=;|8sfCI`L_{3A9|WWkEYZRT@xkF?vJ;8KfB*g!Rdo0FD|vW`$AcN7#0E4wI6NE` z2|YfMNO_TGRIisW8x&;BJkjqYrnFW>^zH&aTDR&9cljV|-^%1WPn0(8_*o9YIc0sf zEJ7Y3tv9D2?IIakho_*aNdfW-Wk&f`nF-cyMrFq29>0*!fZEiZ2>V9NU2yfzo$7)a zu;hLjY#3lYYV|5AVv{LTS69a-=-Iz$Zm2dt{LZ(s;4`SGtxYA#s5(&w@Jo6IoPqv4 zo_o;za(ue1{pG$|AP%8kdh!d7si~KJ9e~_x{SwZLM=ZgfN4h3|}})Fuowq&(CkOpS#SbE)>XJ zezPoh{zR>#eQazjvI8cg0w{kplZnauh*bGamZQYRKH}7e%WAHWAu5=$cpN@9UOf8x z;N?}l$#9z2#?#jLFFYn`99e&US6S_wdMyv%) zAd5~)%H6?KLd9JPrx+&{hLg4+8?t%oZY&# z|GGQ&-mhQ3e0wd_F>HW>6~E~9uwDvwQch7>A+{i)xmSV@b2zs^begd->>{_RuP>E@M}Lsp488U z4KP^b8=h@F_~&i1;Cl%0#EAX5jsVVD!);YZ;0Mmq!Jyo1cdb7*(EQn?p5Na)QdbR6 zzu%*;L@Ies1*13`PIO3FKBnC)jU}h#l+sM0ZF9yB})oJjm zt}y^n^k2lh#Ho)`o?bZ~C=;B`eK@&Mu!_`l|@HvJnLxZ~4p=$@zhufY3tqZ=RR&B3gwrh(UdxCM^TCGkJ zVb2pAF?u2c@8eNRJG*vZpZ4}Un3hB@VY2aEQo(rwB})kfx}5Ai z&}3}HX)hU6T(sh!C_lmMKqFJj6M)D_+jMr4t1}vk{nCkT@L7kjF!)KqV;!#pB8zc! z<$#s;Pm=8Shp1x+E@OkZ_*@y&xKM9HSOp*@x69tj0AV)6&C%}y7QIj2;$*QbFZYqH zXvB==J~I28Y-NhWp21Jh#A1GS%-J2X>-i(kK;iOvrYNQDrW$$BYuZ?XMk(pJke!5- zxVw0T26r;98L~A;BZ{pMjA>CUi6JfgFl5ZyY9A(WYi2fG24ZWSD0^oC`Hp_`8$b~J zVH0JvMQk6lv?aEXXSwZP_@EX2_{rDg@2_`J-@l?Z=WpOlStZ z7GlSM{;p^Q%vz8%NV2`tubzH=g@kUCki&x2cmCTI$<`0AGd$+ zQ3xt|So$7<-o?LzATuYYiS5pT$MWF>br|LOHkX~UlAk}((Ck%7Efuv3(QEVEC(n10 z`10jTw1Btx-`~GG6QvnIq0rLW{^J-+RdzP^@87>a^0LV%5SR=P4@1zs$7~R@01L}j z1%YiV?mO~3h-VcuvbJ1^Sxe=1*umey%IZGQ)b@Az?>IY%m`KM94NOog|EHKusf~#U zX+$sKq)~UhqQ7_%$3;NUOm2;9q&Hw(yE(-f`CaJVB@zj+6qdO#Pw?LUngwQVPM1q4c3j4i9zZ~OA z=+uSy@x!t`{975Br5J~QtHD~x%gLdyEUzreISW(%Tg^mlZl8+AcE#R4wEg-^Ig31? zK_jz#+aKKD;8#I=-L!%8!_tQole)UByhgkP?83^_vau=HTGDsv~H!lIc!`! zK{VKfB)iV1xGLHs29%6K+HZ3;k=E4D{Q6y>CchWV@dAshA^vq-adrn4L4$GK5Cjnl zkGAACM41%RSFGr0G6$=xYy$Ui zrKFi&Dc|EfYoQvL$!8Y0NBU5A@>@md+-`8|0#4BUw7cp0=<}BQ4SurFq0@UT!LyiW0$|9fkSsf=N6fR%P7o8)yISEf_ z11_J1*2=1FN`H*z)AZ9HF!ckRJt-O-EnM|4x6z>AD;j4WUQeFA@XwqHOit$JuHEry ztsZ6y=PIn3V*Z$LIn?FE`xg7tV>aa0)Eg7e3PDK>U+4A@VpGZ2@#zjssbcrc^`8z- zjcy*ZdVB1V{F)?}w1#)Cyvn0qFv_s&>FJsDKGD8>MFg*%oRjL!M8R>nRD6`}=4^Gq zo9@j@IFyw)i<@DMc^y+yM?7}(tUEjV`}OJhRh6kv1AmfwbaL`1yPtHu6_km+7F9EL zIu9(Ed87!Xq@?za&m0PJ1XpZ7CrGH?VOPEd-QnP1Bf(*2VL=0nRwji1O<(VGLQ;58 z7Q3)pSIjc`PrA_1P}prbp;7jQOT|T^Xue?~Qa?nRnm~PTu!AC|1n%e_%1ywT)Ec_P zKFPhYE1ulT_e5g(G#cmUaB$p;f((J^PEVGq=^IDsK76>gwifVk^vB6hdgMIu5o=kE z>e6nL#4cX0Fa{{fiyJVAU9NK!>E%0!(I=)Q1t;r1bnu*pUrys8ud;-<=)!P`{Hp$q zAw;NWeGYj{o(eZFoqX@u#pb^3?*j59s&P(5Gvg+w#U~A`<_~kDY_+rrlc- zlLJyy88JOPM}0R>F9o0r8JTY1&S+G;xJL83t|08} zO~F^vr<4ADMc)3L<1J6aL3a@|0raNvh6f&-^^k}+s#oZ|zjxddANu3@Xpai9R7eDT zz5R4<7b-e!M9ObX)nh~RhvyDk|DIxy4$>&N;2HO} zALplpo10VBf@thkxTSq+32}MBg%Loc58n1^*f%2E=^Scn_ja1+PW9~sH?}uF_A?Pw z3Oko4#y!A)R_U+%u=J(6b~qQztEpAaj`7N9M{;mt+B~GrTq~+S_}`B^XV*Sr5{CTc zN%NNW^6RP-Lf%|3_y4DOoLF8duyr@Tpo}c>ahFP4Mc%OInPN;r9SW_VBH= z{@@=!?%cV1cj4kqPr&Zb&sF4`OPSz6Bgks+I%!wtd&T|K8Hd{YY!*JgYM(-EV(+=Xsoor-t55w5|W3MS|vC1P7j?Bgup`c4OyzqGVYvv03nwfGm_aTO~mE&2256OC2cnU^%!7|v&|I!x^rJ(kR&xVUTe zWie*udV?Ot6yAQ)WfvZ=%k@m2RcjC&tQAr#Of7sbGpRbRAjB%H#GbX|BUhx+Y|~<_ z5G8czG>S6Uhd-@gKAPkMztqj9R^itVYK*U$UGe!AZ5Cc!`%uSxY-RY=)m~J37#PwR z<5VwYbassfMt~Ye&_m^=otyWdG?Qa(?YQ{wUYSJ7*;socCUob2I`^_(GR~M;{}URM z{nAh$fBsN}K5UDsagMlA2D0z(j2aj`gB^p(-D_&=6XV4R?G&5KM&7OMAnOV*F2t}B zO@k@sO)iGC8%-hKkGt1eP$quS_-xVi-Z{0-b%PpL7!|v^!}Py$QEn#9*Uk?mAg@`~ z{r1(<*1@p?El)n9x{#H43lO9U*nG49VwAIPp!w58%O$e2`)>d+HvzwKfkT4_XJ!b& z(f}+4K;<`E9>-z$;EMrph&9uOkng*d*T#gRP2C&Ir4k?zWMEj^+6s{R(eK^RH96P1 zaCkl{uzwOxHMnD?^qtT5s7&Z;`*eqH@K9FGKS3<^+FV&A=b9@2nQHOf!mXE%i$B&j zoY)=;;A(9WfE@Mr+@1*dq(X$d+U2VW?}3n!`Vg5B*0$gk(iK}VcP6NZ21$~0u*H$l zGxKm`PgE`CY*j9l8eE!@K5&1w+P~nv+>+RdO1)MiDjsi4( zeTj)!+ul}Wo)7NdRnqtLoVM$*G=GbQ5vrud-)r+Yst~*DY1f()TpR82E_lcyDy`@X z2ogSZJwC3;yRVm}J1{xwKH2$S_E0-F;7&V z*M2aiCS6C9=WD~jnt!CAPk?-dGaJN3?#2mKg4V48yt_G0OkXA58k`o1~{V;saa_Ffx?Wh#w+m8KBEUN?%0j7te>yw_U9EeU;ki zIL5x(cq$B^&R=hsZ8rOJ9qhXj&l1lM-OWPJlp!-Z=|X+ACS#|08BzAu+BR@?=vd0r z!=r`Q6BF}eSe^2>j?AVp@z4%G65|^Maw@mm^#6^0xtbKf;|CW(lLGv|Z~ia63Rx*d z#fCQ{hnCF{w@FDOq_AGs*t8Ow5LmNyRHW3sfEgt2-ueNq$tZU$8|Y!CpR=nwXP38Z8{gg`dJ%OyEHuRO$^i$H@ZJG`ErIdD9L5Zvo)}#k zESxNvQGP7j)9sFNYhhnkzJ|Ud3RAu?@2Go@&c30G1SIX96k<|xe}?uu55+$6?SDi& zb=i26U$wqcsE{xI%ImW?+vT&(V;0u1`}1T4;Z)Jm@7X_p{&Sl1v}sU>FR%2iw{-Jo zlGE#MNExiLfcpELyu_P8zV9nn?tdFgVE&ztw+Xk7Ld{q?BqVI~bV#rkMF`##pt2Ng z$|@=hEARq-b0g=7hx3}Cp7iZdW0yh`hzgnFg2MMQ8M4U~EAl zhmFD|m?6ohO1IbMru0-34fCVJYIaJIaw!Dqy_oo;Ic~%xj3_U!>@ZJZYqP<@{7)JM zt*Ox1Q)Sxmbml5A?FUiaanK$oUc8Yv1@|!bFEMXg=&u8M3HAdiPx4` zm_|B)5Q!vkY2_-&i+TJopqF~Z>m>Mo1dbYAifmg_W;dIxSQ>mQY8p|m4bO-jYh9BQ2 zeP=O#$oFS-!GTr=cHW(%7P)pPUEqj93Kd*PTA;bj)D#BJxVSpAOzF&ZE~~G9UVQ;mSNI`O zoD0$M*Zq^3UJeOi|NQBbkh%E}llD(EZtHCcm{8r(;&W5*>B)m^=HBFtr0;Z-w5R~Tyxx(3O5k6u_r(qbMz4w_5;OV1f5$R1Vgr5J58OL1;><3O!&_2l`3%$gdar|L1j zzneaRjBs-!gPmwi4Y`K)I17)hO)w4VJKN=hWruPhLhFvc(V;t9yvEYAxe5sjqc>-+ zgC_QrH`m>T3c>a6%B~~JW>L##M6i+#-$x7Ih3>ZS%)T0@eN!ShM1IFkbb7|_ljdHW z_%s99EC?#7vnt-XFtmFgUjOEAZc~poIgNRvn%A#_0t^V1hK`8fF*yVqH-cAW5NTNg zA|_cC6`t9N%c<{Zs}c2uq2Ipgjfn1TknFFZhO*!0j}A3mxmTOP7Zd%`hwqPz&3G(~ z10De-RUjumQ=~?{`HzAAzx;}_|KLU-qXvArg9~^Q zo~Ly1)58@~B`S%^?0}Yp4uM+3D|K}=R8cW7gVSv*JF2a04y2z$LRb}oj4Ba?nS&vp zKEa=Sda|;za+rW9%0HwhvbjI|=e0?7o;vP{VTsY>mW|@juiU+~^y0(V4$##vWFC$&n2Pl-o1OD8!wIK zI8GWWw6~_J!*}1&BKH3fMW?1lf*O|&H|5_%0SuQ~28&V}u*)Fow>h7lHUPAd%=&sM zn;OJ65q@Jj)0vRiq*lok-Q)^bt?L#($a%HZMx@oQ(hS(6A{}nPU62Jy-jU*LA*A^+ z6-2Ixiztrv&VxDepzlRR{8`sOp58jEubd+{u0O8uJ8fsZ-v9v&92zApO$e>+>^yeS zqC7#4!(rbxXs^zqm8#wq`|&{Cudkj zss^Q#u9LLv0oIh=T)+!!4ljaE1w z4#-;*+b*18{&jVdaJl&8_;|3kvAZVEUO+0&503Ov$4N%-0%_s1Z_4bToij%U;8TDc zIM`T_jJifI0>v(n%9RMUdfr8;W@s1z$Vx4%hs~zN(ER3eu7hq)KqfXZt12xid8w)S zvoGqdN|3DAA>x$i>|d#I9nSn=*zP%g+CpE%oKOH9WDHFlwe|+7$V}U~9jxC(shYEf zais_Ei%WczH~_j0@xSRNcdIwz3_~v*&&6VXXw0ix9G99}fV|9%l5W{~>q_@elMZDW zWck;`=_896s1?-)CMQEd&2Y=drE&pPbVU{50OJgTTxtys8%j&n^EH6hvkD8t6o6?t zta40+6WJ!^x|3XUEnDQlm39gkB0%P4i@pJZ_@@MTzr^IUw3cvveH{d#8pL0FmKlhG z#Z^v5V^pQyO;d4suVBjso>@tGVo~tc>z(ae=S`tTfm#i4P{MKLFAdn=sVTh) z8xdh>cok%qZA9pR#Y*SI16=oyfcaU@u3v(l8fu5Qc14Ao(MP&XQlrwNj{1kj5V@j&Z>>c>)~%6uS8 zpvh9n&=jJIK7E!zH~QMTSZCg;+TnOqTWOnbQq`gqrU48Qft!+B^(doj0#ZjJNrOOm z!Lb8oHa7YCt*`XN$S#gF$k*fcJK%S|eftJFXtxb{X+Y@5%=&GO5xL)rmCzFiXhFd3 zErP>A!H8`wF7=X)yTl#c2-%{Nw!Pel4xfv}^qib$`6S)XZGUEG=fY785-cz5@c5Jc~ z$|+>a9Su{Jxh97`fByVk>oz#8L*pfEA^7z(um(i-zw+}HnMrUi7s=c;2q4tiLmlpT zN12DQXkfqTJ4JW%f9fk*Sg;Qb54W~Mjb}sQK^!;m@>7-$sK+r~|9K^zmR~sqP2$ew ztapo5IV(Umyb1Wv6L=M!orQsYS@%5n&B1s1#0vPa#?}*$m&V328(e}m_a=veU%Xx) z`Uwgfoqzvo6yoeJKIc0)Cgb?`nV;G1o>1l>PE1z-kR-daNBhJ9^j5K8_`GDfr;Ulk zu-{sdXt?&x(p<-fdB@;--K$fs#@kE#6G9$L3{rv_(lqM_3j0>p>sltoIu89(r%lUF z3nvKs4j{LqRt_k?2GXYp`$h&Z*3;?t#N3ql74de<*36Nee4UW*-@nRU+t$V(+f19M z%B=}c;TvSn4%g(WMCt^KTp_U}tXqH4oofobTY#68LBVAs+^AFQk`IjeytVNqt>A+P zXqdT8btAf0C=cd%xm}5YL$qsUXBU*gx#7SMEV5BcL1`%&(21(+6NK4`t;4rZXh_pX zXsO;St7bKRhpWpuQN1Me#^3ZFyNqo=N#F=`ZM<6MYehzWkbc(>Ta*I1!~Cre~N_bB!$D|3F;D)N(5lr-Ad{evDkcK26!B^zCFuw;LMsw z*Mp}%!)aF;w*fKdbPkrW*lf?01qhWix?t}J@rAbw|+mgcCWDi|- zrrw1t*C@N#Z0_^6bHK*Es9&J=|CFXkdTG|We53yd6uU_> z(#yCQD326T5}WS@Vy|s(%3E9KPPH=xOZ*9o<6<|cZ9vWyh9@T{7cpxXY4HNT;Y(a* z@PIZlEDSHPccqAAY;Z6gc?pK7Q)$OA>wRh{3|Dm_(tDl?j;t^9HxM*zj^*QPb-M=k zC)nOWD1WIO&)3i9C7Z-nQBhf{zlb5i;BOo00#!#)+y_*!k#~SR8Uk$Mn{nQx5qqDQ zQ7{Yw6qx3w3>WX+c46b<;^M}sEGwITZj8Kr=|+MLyS@Z8L|Lr4kr55xU0Yz_rh3XM zE0+rFr-fM%`yYv=n}A@49F#aYV^{tBd5g)b=}3YU%pGbTubi~ex*>!BbqNDY6xtXF zc^S>3ODtD;Y&XpyqFND6Q0r7ZfXLO#$E%I9fhR?Uyy^&O+eS*P6KMWRha52unhPz= z&nFZ~A_UR`o-hD9AR_@p0W9aojwL@}D4ORO2II*J-!I01oRXg z0-n`tuNnLEA?t2tv(+$jO>J$f9PD6uW?1d?Mki#Z%F%4XHmc)eg0YA0_VBoow@RLV zC6O%uyvoT2A4#4=kBBbVH6zbs;c_V>pY=DSw5D@l3xO~TY@Kw+aj9u(VKLWT1A-vv z*{p;x1{Z_>om_+4GJYbv2%s11>V^U*2~J$lhGqOpC-kKaxV*T4TXrgcIYhGv3u}gJ zj%k#ovy^!MvzDt!%iu)ul!3bi*WoIv3F)pzfA*^c!u~mZwaE_y9GJw00Js8^0{$WvWi8UT-`h-YSI&W?svor}o? z;;DV_tz;>G1$Y=gssjW3m%{qql?7BD;M23g6(*WzmGQJ-=nlv$cjzToi&OQJa6Bp+ z_6?Tn9>;Of9YF;;DjvjREibfr`0D)7(#lG1ee6|hl*mmdaHWjpgiE24G1p+0Rm<`E zFV)lr?Y{yIq8D>`-Q-?5?Sv0z>Kj2PDu~%ZO5-ncwI?t90d1jh6SP5DmUOgnK!*g! z6UDsF_yHw$WE~u%0CE42rURndI-3PVoO!+Adz5*~gAJ+$Z8%#OT7!!nm)eWQL+jF} zY0mdriD`WJ$bhy@rx_l;#R5_h8%qv^&1=7#?;ud3S*m24RK6?zb~zJVcCHk}WQ&Yu zDPuLz*AI`6r{vLoP*7f0_8o|0-Xa%5jaR+o=bydK3Z+HlF>A0`-C>^upNxUrzwRPqsSl@$YQ18YHjfv+EyMNXhf{npiEGrZ0Ob0;; zpjhe@_!!{KtT=Cu{pKiRkoM9ctR0+kS}jPyq6tI$)eMZ`0Y5}GScRL9BPuN1ym|=O z^o~8NhmR^^^3JU4U$9Z=Uc+&IT14I;b`A58d1#pWCdssT<6@ix8@pU zxJiO}x$JjmYPAWyqUAG=6zn|p^l1P6>}PGYv7Dc2gk@&ER}Im;W>*LrGFu_#Z&il{ z5`-XNbDeeOFm4iO=K4w|Fw)j-Zo{VAMR@HLVEOMub#fh38((!P8BF6M&*xeJ-}sb& z!Brr(0jIl`>T?`9rbL1(dM}PQi@`6>MwUrIL8d#@k-+}FTLI2luMnLyq7=0{v+k=5 z({4)6b0EKKEmKXgtffX0Fqq`X{Y(!@g{R80AM%L)nRU#@HF4 zmvkcmN2C;i1aWH{t9NyEB}%yR5;01O%?obY>Auxz^r^qt4vB7M*15$;sJ%zq3=4J8cu^H2`2>g0CtniKWjVa1KW!*C=|)myIc{Obz(c&P`;H7VNhW{Lo!WAKaFg zn|nm@ZYeMpoZQ?RxsB=Ls*GVa2taYDao+qe=(6MoAZf_s?W6T!7#i69!TFG9sxkPR zYY$K5ui;1r36Tme?S2f{$7e=Az;WpC3jvR# zj}#z(#>zTG@t-`JPN?KocWcqbAD{6$!v7?@LY`=YQZB0Lhrs`L)Bm|7hCc=m&cMk~ z-MjM}*GkO0<39+6T0&B!S7qQ)a=9yhC@z$i8$ftbdh29-VwVFhQ{Q3xK;B1v-! z3zh8bc0Tu@xR#`(ftHq*10cH}8?+&h8W3v+$>iiD5SNIdm)@QK?VCkHf(}GaoR?-a z9cZc~Z(x|4418{#@-uyKk1*N^CRBWd?O(wEaNRrXxqjxNTLBK4#Py>P$(H_+T7L zjkK96dy4uK5)lb|2~L&D^@T5Az~Jb}Rp_;SQ1czwGVr>1o{p+$jTtzp#`?#?!|~p}S}ky4u=r zixAuDpB^vmPTQRh11hD=huRssmENS_va&MbY?Y)FJOVdRZ;HrrQ{Ptsn9-|Ibbu?8 zQ3?+NaLb&NkBbVrugpGtTTx8}oUQQCM+m1RclUJL3x8F%zZdoj?e)_q2s3c{1P}s8 znJ=F#X)?gEg&pI&@~*$+%Z1K0U@aaHs$)RE^78&@Y8(FyUu{~CQVj>$6Lg4{jxHKj zY_LEu#0WH@w4yzN4#)|kFi1Sw+VX%SaVRVPOa4xX<>Cg&1IEnQ&28+v(O&z&ue7zt zJy`zuR3fg0AwQ5R4+E#ME1|mI$2BmKIikWAHF9;btZvaQQ)Yk-C&0PzcyzJsNxT<6 ztGwmK+pm%^5-wg_wP?t@>sC)x*e1DHiw1n@y_<0`{Oteqapmz)_V0R7mJpIKm1R_v zEgCJBD5S;G@>;6b8kww>eHjmuHAznDr>t*9Aw$`BvZXM;jBPOXb?gio^1C1Jdp_r! zf6hPiFf-3H-~GPt>%Oi#RpxS+JDB)i_uk2L|5?+jaj>ZpN0U(enSX!qy!jh~DWgGI zW#c3sPrwEQiR>6?=Kai5trMpQvP)A5eq>GV@L@aQK*5(sq}d1@SGiMowEB{NFQ>ai zn>@G(kv9ao_k6mUk!Po;r!!gRtr|xj?qIUQ7pMLz zqL9f!sGZ=?lGz0X4%)!$Tu2}jD4moj*in+}A^gPi_){u;YPIej9?|2-$GR7>PL6Ij zKKCT$5gQ(w*Q;zVm+8(N)W;~0JXHo725{Lhq<~G|P^+{{HXt_m1nKu1zf4Ew!}74(&FlU955d3~ObWr690pA_Y!Zc6hq3R8KR|A^tI|5Y>!x|yY45aIH{sKP5C`sqJEtb8QPjJ7nZ0Cyt8 zvI50qMEiA;`91PIt}W^REn3m}}rPo?c0rh%^yWaVX#Y$Y*LYoyQxSvGL`4JB3mWIuG!Fz!;d7x@23+cQ}+s;xFgb zC~Ds)v?#s);k^`ns?NEP1_%kjV`P|+C|Uii^(EubJk59{0w(K~{(F*-YsJEQ8D-(r z@^bUUeF^TOzQSW}4V&?m|vfPzLZKS~h-cX98$^MhQ1=XbaC~j%uJej+a76Tll z-6~l=>PaLTR3Raa=9t}oTz&U*wM(I6Zb<^125v+`D&gGd`-U zN4sfk&qDi8qse159qJhJQ#^TA_`>MZkUp2NpOfejCDzSoe3egu&W}bm&zCxND`Tnv z(n(WLOt(ZfSFBfun^+*9On%{{AfVBolp&NZ=E|4Ds#N{%?c0G;8uQa&OX)0rdw`9R zifIoAGfh3d^P~QJxxvaxUjb)jgNLefxG@QCfzI;MJZE2Z-WtHodUlB(4pHA)E1+ z3=E9Zn@1JwyLJc&Tr0!URoCzf?d|OY_L@vlm!d&-e`b;^-*j6UPiyKb^bzXqU@k=)3ZT!F%-dwha8Ve@tls3 z;*5#{OVQ^O>o1~5?BsFd%~UpXrdLXX6il_(BL7^JVugrD#hVtv!6Wg)mi_{(eO|P{ zO;wB4#EGGIef4;ZUQ))9uoHX15TPDS&XU?QsFq+o`VDy@1L4{TDWX~|IUI~CI;n88 zIA)-NIa}M2eYIy4~xs}ABE?}a+y1<>exl(vsvB}yy%)L2av@OjD2 z5oXn%DQzAp(v8|T7-w|08a#WZ`4$QbT-(xUFKcUvH4T@*;SywQ^BppFk;F2C1dkdM zEN8kuOW$2h*-{WQ2E#ELbsY6t!iS9YKe7Iu7*&kRx+{kev>IX#3b)Sq7y=yd zrt|v~H+p8oaIr>fZVbL2burjfLC6Jl!b0PujX*+z-@%}Ko$pN=|C(plEE23zuUOO8 zI2XWFTNusp@4jkjs`zkx6#Kk#uz&6R-<7I>6Cvh3&%$QZ6@eVsx`OwIJ7Nb5Q&P01jV1qa z?RfjZ$40$wG6^B=IzThqJd72!U^mb%+kq7@ID`&}RC&FVqa$GH9G;ug3KgBaweKsb zhX6bRLwdoz610SaCDS=~_BSXMvmIp~TVDB^__FH`=1AHrZAHJNt-FXCj?yy_QVel5!~?jTh(}2hA11*|{!z zzl+`ehNHhmg~4sZU;vaxWn0yP!$u&}U#%1w=I6vkMsSGvSMke(!(ieWALROb!N?>N zG7=}!m_LA804Qu;k8%hgwRI3?=(&q`3vVzA*It71ER(Ve;NP9x$i9rN_|#W6vgf9S zByedFf92<^Obz}b2s1PT=tWpxJuH3sB48o;ty(6%kBJAwrqrEwI)rr6UQ9qEW zv^z)w9V?{OEsfHFT{-TZnQc73i*2D55IjK8s~W@3>GUufPxh^@5~x}Xs5m5bV0Xi- zEWzkx-~>YiDe7BJFJZ@Es%89*3;vld#V9S?0;6g0pl0~F+t>q z-d?M&M5Q|yx||b4K$`snRn4g^C!KL)2Oqii?4v%1{GoooxlwC>OcWxlSYN){uSVA% z|S3f+3i&F2=;kP#TvOV+q{Fww|6yNMnQ;q<5h(;;V2F$xf_Y1;U+; z52!gq0q(_!{Ngf$Vh9dv6vq|eHGeA9ns@?rA_V$O3w{N$am;^jv3IA23PP6gASOdi ze(~fzEo5H$uIB4guKOU#hU+PV-sM7ptBj?!T5)i|^ESY#){}{>SuMGu8JQNY;m06p zxG%cVyOi=PSLxkS5MI?+bWQ-ZRm82d4^$I6U<+9=hhJX_$!U=8bt&w~yr6@hMR(+* zB-zSX(6Xqnr%H92BZ)mUw8Kactv~(Xc5w4g)U_Q-4T!{Qi(yj0lW?+_m}vukPIx$h zzMxvAbQNqDjfVBk zo)2+&n!DqNpz344b92JOL(yHpeu(Ww$MiX=T7Dozo`#M^Mh<$}+~GWe!-@dSi!Ka7eN>*nf_Eta-~&V+HW#ccaiD^ zPcMSE>K#2U7(6{HK7m{o(*BX0G2;1{@uPysZ1;(~cRPYT4{eBZg;!hWmeo=NH?(_2 zO3|kPo|7TokGXp5mMXo0T0vA}lvfz_u0)rv1!;z({D+JKK2+A~iU@ipNN2y^Xgnq_ zU+3v03}RjIghDoM1Jc6iP2fp;Y&o!$coAbQ{StAZRcL%#k0fOEm9IwzNP01csdass zIf0)CoxXRX1Df_+(u_TeU`{6*%0VTd zVU@`2rhUs17tWjbYP&i$Uk=On~N{`4=r>0S`RGQMY>(`Zsm~=m4a@P`FEO)$HqlAm{&~LT8 z!u2cF|BUkiqhqqNOk*v(wZmymnXnWFweoXmS2?n46surO-O&n7fa-G9P$p25kH|U% zHJoZ-)v|;0Px;vJ=I7*BdjuA7R!Ha*7H22IUhRDGYZ+*^bJa3L$|Iq~St;dXjnCg%|Wg2b%u;CEs_; z0UZ_|&VZuk%9p@9pi>KTXiZT%aW@H^9m*T5Kvu<{U*wfVmhW%GO6fg|jSWImJ@i7r z4rs0!&!6vsTA~wo>C*g8l~0~L38)oK%Qv?5yK8GZ&=@Ng(}_>N%%f<)aVJ>SHtF#1=b*GKD}^8`uUgL zl^8bUxPW;ma7WZv+HYXk#VbW-3_jVqacM69CDOzZtnT!?{f3djn&9w}6QU1?2WykU zYaVd!5HK$wG8rFg#V@Q&Du!uJ7=N+m*N&}~etO`HvZT=)EFn>PsDQ`R_T8x-;XC}- z=-X&Yv{e3{tgwX^9l^ipmY`aNb&Z%8Na;Pbs*4mNxVnlj5P^E$*54m+6WqKJPsoamj*wZAuV~YUd?BeO`@or%xcxOafzY+ zOk4c&l`FZ>zkruS?nDdNYm)`ZG8PMvd2_#s%VAT$zIayf!}BvH7e3FxUz1aOc{OT( z?DWpF5I&XlO-*a3H!dKRi>z~ZKv+38N!R}jiX=^9!s1-Lln}lf9^DoeiZ0uym;l*I zBrq%}$YIDj8NNf-g8!-{R37Bc!PzN;Wgif*N{K}1;1T1nyV&NBkL2_aI5)2>L=ko2 z0M%CFBw1Zpx5Kz8gJ0c$=@9#ARi=Y>v-|q$BCLGpODI4R8_?Mc!o~v6fe!Pi{ zo!Q?qq?Lc|l%&}#=Y*XfN1BHkN*&jEtEnW;DsYRX!f!>$dTDuYaAq@OS8@4sv4Z`a z$nM62xa@kmG75@K8hsDb3JF!eDbVq`)YOv2zV;@jn(>M*dHPFhdaL{&g^6h6P4Jpr z3J>+?ZTSLIaf;n4-LeC0yg_7SF_ISwzQ9vrAVQj3-V;2mw7nN}bbR+NN%FTRA7H2i8)#3(-7_#vI zXnYesRDkp@A~wqGMI}x-jh6XjiLIwh%=JvN`(WDCzwFT(>mu0tYlj T_dQyN4s%J@Q0LQmtKk0trQcyJ delta 22519 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 From 2102e0526a5e343a6ed19898733f337693d8c99d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 11 Aug 2017 14:29:03 -0500 Subject: [PATCH 026/164] Automatic changelog generation for PR #2329 [ci skip] --- html/changelogs/AutoChangeLog-pr-2329.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2329.yml diff --git a/html/changelogs/AutoChangeLog-pr-2329.yml b/html/changelogs/AutoChangeLog-pr-2329.yml new file mode 100644 index 0000000000..2950b70fbb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2329.yml @@ -0,0 +1,6 @@ +author: "ktccd" +delete-after: True +changes: + - rscadd: "Adds flared, knotted or tapered dicks for Taur bodies." + - tweak: "Resized the cow-taur's over-extended belly to match the profile picture, no longer completely blocking the taur penises." + - bugfix: "Barbed, knotted penises and other such long-named cocks are now visible on the ground if dismembered." From 84076d7bb954f0b9d678676b8ef87a942fb7338d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 11 Aug 2017 14:29:51 -0500 Subject: [PATCH 027/164] intialize() supermatter sword (#2332) --- code/game/objects/items/weapons/melee/misc.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 2ded74b536..5d32856bc9 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -209,8 +209,8 @@ origin_tech = "combat=7;materials=6" force_string = "INFINITE" -/obj/item/weapon/melee/supermatter_sword/New() - ..() +/obj/item/weapon/melee/supermatter_sword/Initialize() + . = ..() shard = new /obj/machinery/power/supermatter_shard(src) qdel(shard.countdown) shard.countdown = null From 12d4c7ade0017ce2728a42932245820407b882c5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 11 Aug 2017 14:52:55 -0500 Subject: [PATCH 028/164] gorilla sprites --- icons/mob/animal.dmi | Bin 164136 -> 166678 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 3ed8c153d8cd046e583ac8837b83b4005a2309c7..42226c7d2bd70df6742d8ea912af4124c6c9b73a 100644 GIT binary patch delta 17611 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

4pkFLYEKk4U0xEi6)!HaJmU=ooex7CO35y2{ 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 C=~`(3 From fca1df9a2bd67815eca77496ae93e1ddb6b03d54 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 11 Aug 2017 14:54:00 -0500 Subject: [PATCH 029/164] Fixes bad dirs --- code/game/machinery/shieldgen.dm.rej | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 code/game/machinery/shieldgen.dm.rej diff --git a/code/game/machinery/shieldgen.dm.rej b/code/game/machinery/shieldgen.dm.rej new file mode 100644 index 0000000000..12ce2d21dc --- /dev/null +++ b/code/game/machinery/shieldgen.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm (rejected hunks) +@@ -12,7 +12,7 @@ + + /obj/structure/emergency_shield/Initialize() + . = ..() +- setDir(pick(1,2,3,4)) ++ setDir(pick(GLOB.cardinals)) + air_update_turf(1) + + /obj/structure/emergency_shield/Destroy() From d7ac827ea6fe8d00201dc8ead72cc11a871b9b02 Mon Sep 17 00:00:00 2001 From: ktccd Date: Fri, 11 Aug 2017 21:59:35 +0200 Subject: [PATCH 030/164] Testing Transition code, DO NOT MERGE YET!! As it says, do not merge until I confirm that it works. --- code/modules/client/preferences_savefile.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index a4b57422c7..1240fa7fe3 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -382,9 +382,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_has_womb"] >> features["has_womb"] //flavor text //Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts: - if((S["feature_flavor_text"] == "") && (S["flavor_text"] != "")) //If we got no new flavor_text data, but we have old - S["flavor_text"] >> features["flavor_text"] - else //Otherwise use new flavor_text data always + if(S["flavor_text"] != "" || S["flavor_text"] != null) + S["flavor_text"] >> features["flavor_text"] //Load old flavortext as current dna-based flavortext + S["flavor_text"] >> S["feature_flavor_text"] //Save it in our new type of flavor-text + null >> S["flavor_text"] //Remove old flavortext, completing the cut-and-paste into the new format. + else //We have no old flavortext, default to new S["feature_flavor_text"] >> features["flavor_text"] From 582a106d8e936875efb6db628c419ce514976151 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 11 Aug 2017 15:09:24 -0500 Subject: [PATCH 031/164] His Grace now shows up on the orbit list --- code/game/objects/items/weapons/his_grace.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/his_grace.dm b/code/game/objects/items/weapons/his_grace.dm index c43e1600b6..5b57fab800 100644 --- a/code/game/objects/items/weapons/his_grace.dm +++ b/code/game/objects/items/weapons/his_grace.dm @@ -20,12 +20,14 @@ var/prev_bloodthirst = HIS_GRACE_SATIATED var/force_bonus = 0 -/obj/item/weapon/his_grace/New() - ..() +/obj/item/weapon/his_grace/Initialize() + . = ..() START_PROCESSING(SSprocessing, src) + GLOB.poi_list += src /obj/item/weapon/his_grace/Destroy() STOP_PROCESSING(SSprocessing, src) + GLOB.poi_list -= src for(var/mob/living/L in src) L.forceMove(get_turf(src)) return ..() From 1b2f2120ec26f66825393d14c9f0bc3ec1fbf72c Mon Sep 17 00:00:00 2001 From: ktccd Date: Fri, 11 Aug 2017 23:10:05 +0200 Subject: [PATCH 032/164] DO NOT MERGE - Fixes random resetting of file I did a bad with the direction of >> and <<. My bad. Fixed now, I will test FURTHER to confirm that old files are not deleted or ruined. --- code/modules/client/preferences_savefile.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 1240fa7fe3..60fd905df3 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -382,11 +382,15 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_has_womb"] >> features["has_womb"] //flavor text //Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts: - if(S["flavor_text"] != "" || S["flavor_text"] != null) + if((S["flavor_text"] != "") && (S["flavor_text"] != null) && S["flavor_text"]) //If old text isn't null and isn't "" but still exists. + to_chat(world, "DEBUG: OLD TEXT FOUND, MOVING:[S["flavor_text"]]") S["flavor_text"] >> features["flavor_text"] //Load old flavortext as current dna-based flavortext - S["flavor_text"] >> S["feature_flavor_text"] //Save it in our new type of flavor-text - null >> S["flavor_text"] //Remove old flavortext, completing the cut-and-paste into the new format. + + S["feature_flavor_text"] << features["flavor_text"] //Save it in our new type of flavor-text + S["flavor_text"] << "" //Remove old flavortext, completing the cut-and-paste into the new format. + else //We have no old flavortext, default to new + to_chat(world, "DEBUG: No old text found.") S["feature_flavor_text"] >> features["flavor_text"] From 4188db53a5c081f496b539f0d20a6f1149d25020 Mon Sep 17 00:00:00 2001 From: ktccd Date: Fri, 11 Aug 2017 23:48:46 +0200 Subject: [PATCH 033/164] Flavortext transition finished Now properly moves OLD flavortext to the new format and then removes the old format. If no old format is found, it defaults to loading the new format. Flavortext is now stored in your DNA, and is loaded into your characters flavor_text variable upon creating the character or messing with the DNA. This allows cloners/pods/changelings to use the correct flavortext. --- code/modules/client/preferences_savefile.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 60fd905df3..f846f52625 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -383,14 +383,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //flavor text //Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts: if((S["flavor_text"] != "") && (S["flavor_text"] != null) && S["flavor_text"]) //If old text isn't null and isn't "" but still exists. - to_chat(world, "DEBUG: OLD TEXT FOUND, MOVING:[S["flavor_text"]]") S["flavor_text"] >> features["flavor_text"] //Load old flavortext as current dna-based flavortext S["feature_flavor_text"] << features["flavor_text"] //Save it in our new type of flavor-text S["flavor_text"] << "" //Remove old flavortext, completing the cut-and-paste into the new format. else //We have no old flavortext, default to new - to_chat(world, "DEBUG: No old text found.") S["feature_flavor_text"] >> features["flavor_text"] From 5a7126a0ddde8f0a7a10d5c3ea6cd4d2382edc96 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sat, 12 Aug 2017 01:15:42 -0500 Subject: [PATCH 034/164] Panic Bunker for moderator/trialmin access --- code/modules/admin/admin_verbs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 68e5430a09..a839b35b3c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -17,6 +17,7 @@ GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault()) /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/ /client/proc/cmd_admin_pm_panel, /*admin-pm list*/ /client/proc/cmd_admin_ticket_panel, + /client/proc/panicbunker, /client/proc/stop_sounds ) GLOBAL_PROTECT(admin_verbs_admin) @@ -114,7 +115,6 @@ GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) /client/proc/toggle_random_events, /client/proc/forcerandomrotate, /client/proc/adminchangemap, - /client/proc/panicbunker, /client/proc/toggle_hub ) GLOBAL_PROTECT(admin_verbs_debug) From 7addb0207b63c6bfc5906afd79092cb56338c120 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 12 Aug 2017 04:42:44 -0500 Subject: [PATCH 035/164] Fix travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index c0a45df72d..ba11b40c97 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: generic sudo: false +dist: precise env: global: From 73426d56ea6a5331fa75c26cbe20990e5911fb42 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sat, 12 Aug 2017 06:31:50 -0500 Subject: [PATCH 036/164] file path fix --- .../modules/mob/dead/new_player/sprite_accessories_Citadel.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm index 55572d8187..9808923e33 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm @@ -31,12 +31,12 @@ color_src = 0 icon = 'icons/mob/mam_bodyparts.dmi' -/datum/sprite_accessory/mam_tails/human/bear +/datum/sprite_accessory/tails/human/bear name = "Bear" icon_state = "bear" icon = 'icons/mob/mam_bodyparts.dmi' -/datum/sprite_accessory/mam_ears/human/bear +/datum/sprite_accessory/ears/human/bear name = "Bear" icon_state = "bear" icon = 'icons/mob/mam_bodyparts.dmi' From 74636ffeb088c59a97e7afa0bcc5defc9fa2a3f7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 12 Aug 2017 06:33:46 -0500 Subject: [PATCH 037/164] Automatic changelog generation for PR #2295 [ci skip] --- html/changelogs/AutoChangeLog-pr-2295.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2295.yml diff --git a/html/changelogs/AutoChangeLog-pr-2295.yml b/html/changelogs/AutoChangeLog-pr-2295.yml new file mode 100644 index 0000000000..c34d19ac6f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2295.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - tweak: "Mulligan and non-continuous completion checks will not consider afk/logged out people to be \"living crew\"." From 4298f6539d88007e634baa384157a3b6f44d82cc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 12 Aug 2017 06:35:46 -0500 Subject: [PATCH 038/164] Automatic changelog generation for PR #2335 [ci skip] --- html/changelogs/AutoChangeLog-pr-2335.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2335.yml diff --git a/html/changelogs/AutoChangeLog-pr-2335.yml b/html/changelogs/AutoChangeLog-pr-2335.yml new file mode 100644 index 0000000000..5681e3d5f9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2335.yml @@ -0,0 +1,4 @@ +author: "ktccd" +delete-after: True +changes: + - bugfix: "Flavortext is now in the DNA of mobs who has that, meaning changelings, cloners and such things use it properly." From 53b137740279725aad5958b219247db2cadf730c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 12 Aug 2017 06:36:59 -0500 Subject: [PATCH 039/164] Automatic changelog generation for PR #2339 [ci skip] --- html/changelogs/AutoChangeLog-pr-2339.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2339.yml diff --git a/html/changelogs/AutoChangeLog-pr-2339.yml b/html/changelogs/AutoChangeLog-pr-2339.yml new file mode 100644 index 0000000000..c7f3d42698 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2339.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - tweak: "His Grace now shows up on the orbit list" From 6cb9a0088f3cc0fa24f14dd412def741a4b40831 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:26:39 -0500 Subject: [PATCH 040/164] Fixes admin mass deleting... not actually mass deleting... --- .../procedural_mapping/mapGeneratorModules/helpers.dm | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm index 24b75a3a9a..6fdcccd43f 100644 --- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm +++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm @@ -37,16 +37,12 @@ /datum/mapGeneratorModule/bottomLayer/massdelete/leave_turfs deleteturfs = FALSE -/datum/mapGeneratorModule/bottomLayer/massdelete/leave_turfs/New() - ..() - ignore_typecache = typecacheof(list(/turf)) - /datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete deleteturfs = FALSE /datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete/New() ..() - ignore_typecache = typecacheof(list(/mob, /turf)) + ignore_typecache = typecacheof(list(/mob)) //Only places atoms/turfs on area borders /datum/mapGeneratorModule/border From 1b3ccfdfeb9343d8c17c37959add1d7c4810e329 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:26:42 -0500 Subject: [PATCH 041/164] The wiki button now asks what page you want to be taken to --- interface/interface.dm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/interface/interface.dm b/interface/interface.dm index 253738064b..64e39587ce 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -1,12 +1,14 @@ //Please use mob or src (not usr) in these procs. This way they can be called in the same fashion as procs. -/client/verb/wiki() +/client/verb/wiki(query as text | null) set name = "wiki" - set desc = "Visit the wiki." + set desc = "Type what you want to know about. This will open the wiki on your web browser. Type nothing to go to the main page." set hidden = 1 if(config.wikiurl) - if(alert("This will open the wiki in your browser. Are you sure?",,"Yes","No")=="No") - return - src << link(config.wikiurl) + if(query) + var/output = config.wikiurl + "/index.php?title=Special%3ASearch&profile=default&search=" + query + src << link(output) + else if (query != null) + src << link(config.wikiurl) else to_chat(src, "The wiki URL is not set in the server configuration.") return From 501972a2f8038e45ce35de389dea1d98f44ebcb6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:26:46 -0500 Subject: [PATCH 042/164] Removes chat pings from href logs --- code/modules/client/client_procs.dm | 5 +++-- code/modules/client/client_procs.dm.rej | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 code/modules/client/client_procs.dm.rej diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 4455af7ca9..feb1a6e94d 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -72,8 +72,9 @@ to_chat(src, "Your previous action was ignored because you've done too many in a second") return - //Logs all hrefs - GLOB.world_href_log << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" + //Logs all hrefs, except chat pings + if(href_list["proc"] != "ping") + GLOB.world_href_log << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" // Admin PM if(href_list["priv_msg"]) diff --git a/code/modules/client/client_procs.dm.rej b/code/modules/client/client_procs.dm.rej new file mode 100644 index 0000000000..2b656938c4 --- /dev/null +++ b/code/modules/client/client_procs.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm (rejected hunks) +@@ -73,7 +73,7 @@ + return + + //Logs all hrefs, except chat pings +- if(href_list["proc"] != "ping") ++ if(!(href_list["_src_"] == "chat" && href_list["proc"] == "ping" && LAZYLEN(href_list) == 2)) + WRITE_FILE(GLOB.world_href_log, "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
") + + // Admin PM From e972a90ba98ee2bfa979674763f8d276d12ecb3b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:27:51 -0500 Subject: [PATCH 043/164] Adds callback select system --- code/datums/callback.dm | 54 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/code/datums/callback.dm b/code/datums/callback.dm index 1b5c25fe18..624fed58a6 100644 --- a/code/datums/callback.dm +++ b/code/datums/callback.dm @@ -100,3 +100,57 @@ if (object == GLOBAL_PROC) return call(delegate)(arglist(calling_arguments)) return call(object, delegate)(arglist(calling_arguments)) + + +/datum/callback_select + var/list/finished + var/pendingcount + var/total + +/datum/callback_select/New(count, savereturns) + total = count + if (savereturns) + finished = new(count) + + +/datum/callback_select/proc/invoke_callback(index, datum/callback/callback, list/callback_args, savereturn = TRUE) + set waitfor = FALSE + if (!callback || !istype(callback)) + //This check only exists because the alternative is callback_select would block forever if given invalid data + CRASH("invalid callback passed to invoke_callback") + if (!length(callback_args)) + callback_args = list() + pendingcount++ + var/rtn = callback.Invoke(arglist(callback_args)) + pendingcount-- + if (savereturn) + finished[index] = rtn + + + + +//runs a list of callbacks asynchronously, returning once all of them return. +//callbacks can be repeated. +//callbacks-args is a optional list of argument lists, in the same order as the callbacks, +// the inner lists will be sent to the callbacks when invoked() as additional args. +//can optionly save and return a list of return values, in the same order as the original list of callbacks +//resolution is the number of byond ticks between checks. +/proc/callback_select(list/callbacks, list/callback_args, savereturns = TRUE, resolution = 1) + if (!callbacks) + return + var/count = length(callbacks) + if (!count) + return + if (!callback_args) + callback_args = list() + + callback_args.len = count + + var/datum/callback_select/CS = new(count, savereturns) + for (var/i in 1 to count) + CS.invoke_callback(i, callbacks[i], callback_args[i], savereturns) + + while(CS.pendingcount) + sleep(resolution*world.tick_lag) + return CS.finished + From 3f562c113c967947d0e2abe9b4ac5f4966b13aa7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:27:54 -0500 Subject: [PATCH 044/164] get_head_slots() now returns wear_neck --- code/modules/mob/living/carbon/human/inventory.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index d9f1acf879..da99954f29 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -63,6 +63,7 @@ return list( head, wear_mask, + wear_neck, glasses, ears, ) @@ -171,7 +172,7 @@ dropItemToGround(belt) w_uniform = null update_suit_sensors() - if(!QDELETED(src)) + if(!QDELETED(src)) update_inv_w_uniform() else if(I == gloves) gloves = null From 714fc5ed4a0f82cf0c6165cb4efe5c46949cbb74 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:27:58 -0500 Subject: [PATCH 045/164] Fixes minebots missing action icons --- code/modules/mining/minebot.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 25aa9fb8e8..8029cc1416 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -170,6 +170,7 @@ /datum/action/innate/minedrone check_flags = AB_CHECK_CONSCIOUS + icon_icon = 'icons/mob/actions/actions_mecha.dmi' background_icon_state = "bg_default" /datum/action/innate/minedrone/toggle_light From 80f1fb8c58828d44f51def83c9c107272f94acea Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:28:03 -0500 Subject: [PATCH 046/164] Fix fireaxe cabinets spawned with broken icons --- code/game/objects/structures/fireaxe.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 24e70059af..bfd3dea037 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -12,8 +12,8 @@ max_integrity = 150 integrity_failure = 50 -/obj/structure/fireaxecabinet/New() - ..() +/obj/structure/fireaxecabinet/Initialize() + . = ..() update_icon() /obj/structure/fireaxecabinet/Destroy() From 7004797c8c41b5fd567b1f0bdd1772dfcbb22584 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:28:08 -0500 Subject: [PATCH 047/164] Fixed sign description --- code/game/objects/structures/signs.dm.rej | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 code/game/objects/structures/signs.dm.rej diff --git a/code/game/objects/structures/signs.dm.rej b/code/game/objects/structures/signs.dm.rej new file mode 100644 index 0000000000..51eea8f290 --- /dev/null +++ b/code/game/objects/structures/signs.dm.rej @@ -0,0 +1,11 @@ +diff a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm (rejected hunks) +@@ -326,6 +326,6 @@ + icon_state = "direction_bridge" + + /obj/structure/sign/logo +- name = "station logo" +- desc = "A sign: SPACE STATION 13." ++ name = "nanotrasen logo" ++ desc = "The Nanotrasen corporate logo." + icon_state = "nanotrasen_sign1" +\ No newline at end of file From 1291b122731a7e2802b9463594b4905d2b2aa1ad Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:28:11 -0500 Subject: [PATCH 048/164] Cleaned up stacked pipes --- _maps/map_files/BoxStation/BoxStation.dmm | 3 --- _maps/map_files/Deltastation/DeltaStation2.dmm | 3 --- _maps/map_files/OmegaStation/OmegaStation.dmm | 2 -- 3 files changed, 8 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index bf4263ffe6..c89e4e0422 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -60788,9 +60788,6 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "cHY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 3e19f173a4..b0265ad94b 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -112682,9 +112682,6 @@ /turf/open/floor/plating, /area/engine/atmospherics_engine) "ept" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 60495dcf55..020a963662 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -5039,7 +5039,6 @@ name = "Detective Privacy Blast door" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/security/detectives_office) "aix" = ( @@ -32004,7 +32003,6 @@ "bcM" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/vault{ dir = 5 }, From dae3e121f2cde3130eba771f758284292905e939 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:28:16 -0500 Subject: [PATCH 049/164] critical priority roleplay grammatical patch (*surrender emote fix) --- code/modules/mob/living/emote.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 8bdcf30f66..ff37b85800 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -326,7 +326,7 @@ /datum/emote/living/surrender key = "surrender" key_third_person = "surrenders" - message = "puts their hands on their head and falls to the ground, they surrender%s!" + message = "puts their hands on their head and falls to the ground, they surrender!" emote_type = EMOTE_AUDIBLE /datum/emote/living/surrender/run_emote(mob/user, params) From deffc1b1f1feb1d04d8401059d785ec54c998dfb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:28:20 -0500 Subject: [PATCH 050/164] More baseturf helpers --- .../LavaRuins/lavaland_biodome_beach.dmm | 2 +- .../lavaland_biodome_clown_planet.dmm | 2 +- .../lavaland_surface_animal_hospital.dmm | 2 +- .../lavaland_surface_ash_walker1.dmm | 2 +- .../lavaland_surface_biodome_winter.dmm | 2 +- .../LavaRuins/lavaland_surface_cultaltar.dmm | 2 +- .../LavaRuins/lavaland_surface_envy.dmm | 2 +- .../lavaland_surface_fountain_hall.dmm | 2 +- .../LavaRuins/lavaland_surface_gluttony.dmm | 2 +- .../LavaRuins/lavaland_surface_golem_ship.dmm | 2 +- .../LavaRuins/lavaland_surface_greed.dmm | 2 +- .../LavaRuins/lavaland_surface_hermit.dmm | 2 +- .../LavaRuins/lavaland_surface_pizzaparty.dmm | 2 +- .../LavaRuins/lavaland_surface_pride.dmm | 2 +- .../LavaRuins/lavaland_surface_seed_vault.dmm | 2 +- .../LavaRuins/lavaland_surface_sloth.dmm | 2 +- .../lavaland_surface_survivalpod.dmm | 2 +- .../lavaland_surface_swarmer_crash.dmm | 2 +- .../lavaland_surface_syndicate_base1.dmm | 2 +- .../LavaRuins/lavaland_surface_ufo_crash.dmm | 2 +- .../lavaland_surface_xeno_nest.dmm.rej | 10 +++++ _maps/map_files/Mining/Lavaland.dmm | 25 ++++++++---- .../objects_and_mobs/ruin_mapping_aids.dm | 39 +++++++++++++++++-- 23 files changed, 84 insertions(+), 30 deletions(-) create mode 100644 _maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index f0f2d8a6c5..c47534925f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -460,7 +460,7 @@ /area/ruin/powered/beach) "cz" = ( /obj/effect/turf_decal/sand, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "cR" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm index 408fe6ff1d..87137f7d14 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm @@ -896,7 +896,7 @@ /area/ruin/powered/clownplanet) "dR" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/indestructible/sound{ icon_state = "bananium"; name = "bananium floor"; diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm index de78fed108..ec1ce79bd8 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm @@ -809,7 +809,7 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "cF" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/mineral/titanium/nodiagonal, /area/ruin/powered/animal_hospital) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index aed9b30686..3cae12bfe1 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -1071,7 +1071,7 @@ /area/ruin/unpowered/ash_walkers) "cE" = ( /obj/structure/stone_tile/surrounding/cracked, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "cF" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index 49ae2cb4f5..722cc92d78 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -275,7 +275,7 @@ }, /area/ruin/powered/snow_biodome) "bS" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/asteroid/snow{ initial_gas_mix = "o2=22;n2=82;TEMP=180" }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm index ed4aee469d..875cfdc35d 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm @@ -163,7 +163,7 @@ /turf/open/floor/plasteel/cult{ initial_gas_mix = "o2=14;n2=23;TEMP=300" }, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/mineral/cult, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm index 66d7173097..773fc01f51 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm @@ -104,7 +104,7 @@ /turf/open/floor/plating, /area/ruin/unpowered) "r" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/rust, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm index 0c40aa2881..ab1d5764e1 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm @@ -29,7 +29,7 @@ /turf/open/floor/engine/cult, /area/ruin/unpowered) "i" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/engine/cult, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm index 97b44df094..3b1c555805 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm @@ -85,7 +85,7 @@ /turf/open/floor/plasteel/freezer, /area/ruin/powered/gluttony) "D" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plasteel/freezer, /area/ruin/powered/gluttony) "R" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm index fa1e394751..c993ecbb63 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm @@ -285,7 +285,7 @@ /turf/open/floor/plating, /area/ruin/powered/golem_ship) "Y" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/mineral/titanium/purple, /area/ruin/powered/golem_ship) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm index 3d67d7b474..c81c510b9e 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm @@ -123,7 +123,7 @@ /turf/open/floor/engine/cult, /area/ruin/powered/greed) "z" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/engine/cult, /area/ruin/powered/greed) "J" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm index 896f13b1bb..2749e39f1f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm @@ -180,7 +180,7 @@ }, /area/ruin/powered) "L" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/asteroid/basalt, /area/ruin/powered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm index 44c41f5b85..f14495c95c 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm @@ -342,7 +342,7 @@ /area/ruin/unpowered) "S" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/wood{ baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface; initial_gas_mix = "o2=14;n2=23;TEMP=300" diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm index b1dedc0cb3..38b5f5f64d 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm @@ -65,7 +65,7 @@ /turf/open/floor/mineral/silver, /area/ruin/powered/pride) "u" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/mineral/silver, /area/ruin/powered/pride) "G" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm index cb2686fe89..01ac536230 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm @@ -262,7 +262,7 @@ /turf/open/floor/plasteel/freezer, /area/ruin/powered/seedvault) "Z" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/r_wall, /area/ruin/powered/seedvault) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm index 89a8b50c39..5ae4227813 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm @@ -42,7 +42,7 @@ }, /area/ruin/unpowered) "h" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/sepia{ blocks_air = 0; slowdown = 10 diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm index 3392d60307..8d40c16d58 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm @@ -169,7 +169,7 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "B" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/mineral/titanium/survival/pod, /area/ruin/powered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm index a794b58db8..3962947551 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm @@ -22,7 +22,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/unpowered) "g" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/mineral/plastitanium, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index be96830ca4..2893f3481f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -1285,7 +1285,7 @@ }, /area/ruin/powered/syndicate_lava_base) "dd" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plasteel/vault{ dir = 5 }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm index 22d341c7df..0c4dd60fb8 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm @@ -105,7 +105,7 @@ "s" = ( /obj/structure/table/optable/abductor, /obj/item/weapon/cautery/alien, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/abductor{ initial_gas_mix = "o2=16;n2=23;TEMP=300" }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej new file mode 100644 index 0000000000..365cc7fdda --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej @@ -0,0 +1,10 @@ +diff a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm (rejected hunks) +@@ -269,7 +269,7 @@ + "W" = ( + /obj/structure/alien/weeds, + /obj/structure/alien/resin/wall, +-/obj/effect/baseturf_helper, ++/obj/effect/baseturf_helper/lava_land/surface, + /turf/open/floor/plating/asteroid/basalt/lava_land_surface, + /area/ruin/unpowered/xenonest) + diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 4c00524717..9b97eef1d5 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -1,4 +1,4 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( /turf/closed/indestructible/riveted/boss, /area/lavaland/surface/outdoors) @@ -1241,6 +1241,7 @@ d2 = 4; icon_state = "1-4" }, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/circuit, /area/mine/maintenance) "dy" = ( @@ -3399,17 +3400,27 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "Wt" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall, /area/mine/laborcamp/security) "Wu" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall, /area/mine/laborcamp) "Ww" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Wx" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/open/floor/plasteel/brown{ + dir = 4 + }, +/area/mine/eva) +"Wy" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/open/floor/plasteel, +/area/mine/production) (1,1,1) = {" aa @@ -19057,7 +19068,7 @@ cI cP cn bP -bP +Wy bP bP eD @@ -19570,7 +19581,7 @@ bf cK bq bq -dt +br bq dV el @@ -20335,7 +20346,7 @@ bf bp bu bI -bW +Wx cr bf ad diff --git a/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm b/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm index 06fb2b9c04..68a34637b8 100644 --- a/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm +++ b/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm @@ -1,10 +1,10 @@ //These landmarks can be placed in rooms/ruins to set the baseturfs of every turf in the area. Easier than having potentially unlimited subtypes of every turf or having to manually edit the turfs in the map editor /obj/effect/baseturf_helper - name = "lava baseturf editor" + name = "baseturf editor" icon = 'icons/obj/weapons.dmi' icon_state = "syndballoon" - var/baseturf = /turf/open/lava/smooth/lava_land_surface + var/baseturf = null layer = POINT_LAYER /obj/effect/baseturf_helper/Initialize() @@ -13,4 +13,37 @@ for(var/turf/T in get_area_turfs(thearea, z)) if(T.baseturf != T.type) //Don't break indestructible walls and the like T.baseturf = baseturf - qdel(src) \ No newline at end of file + qdel(src) + + +/obj/effect/baseturf_helper/asteroid + name = "asteroid baseturf editor" + baseturf = /turf/open/floor/plating/asteroid + +/obj/effect/baseturf_helper/asteroid/airless + name = "asteroid airless baseturf editor" + baseturf = /turf/open/floor/plating/asteroid/airless + +/obj/effect/baseturf_helper/asteroid/basalt + name = "asteroid basalt baseturf editor" + baseturf = /turf/open/floor/plating/asteroid/basalt + +/obj/effect/baseturf_helper/asteroid/snow + name = "asteroid snow baseturf editor" + baseturf = /turf/open/floor/plating/asteroid/snow + +/obj/effect/baseturf_helper/beach/sand + name = "beach sand baseturf editor" + baseturf = /turf/open/floor/plating/beach/sand + +/obj/effect/baseturf_helper/beach/water + name = "water baseturf editor" + baseturf = /turf/open/floor/plating/beach/water + +/obj/effect/baseturf_helper/lava + name = "lava baseturf editor" + baseturf = /turf/open/lava/smooth + +/obj/effect/baseturf_helper/lava_land/surface + name = "lavaland baseturf editor" + baseturf = /turf/open/lava/smooth/lava_land_surface From 1e3ea07d8b5ddc40e993814b261cb7ac7f058493 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:28:24 -0500 Subject: [PATCH 051/164] Adds icon_states to the unused and used Eldritch whetstones --- code/game/gamemodes/cult/cult_items.dm | 6 +++++- code/game/objects/items/weapons/sharpener.dm | 17 +++++++++-------- icons/obj/kitchen.dmi | Bin 23347 -> 25105 bytes 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 918398154c..d472bb7d5a 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -161,11 +161,15 @@ /obj/item/weapon/sharpener/cult name = "eldritch whetstone" desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone." + icon_state = "cult_sharpener" used = 0 increment = 5 max = 40 prefix = "darkened" +/obj/item/weapon/sharpener/cult/update_icon() + icon_state = "cult_sharpener[used ? "_used" : ""]" + /obj/item/clothing/suit/hooded/cultrobes/cult_shield name = "empowered cultist armor" desc = "Empowered garb which creates a powerful shield around the user." @@ -391,7 +395,7 @@ if(!iscultist(user)) to_chat(user, "That doesn't seem to do anything useful.") return - + if(istype(A, /obj/item)) var/list/cultists = list() diff --git a/code/game/objects/items/weapons/sharpener.dm b/code/game/objects/items/weapons/sharpener.dm index ace66060af..881832b5bb 100644 --- a/code/game/objects/items/weapons/sharpener.dm +++ b/code/game/objects/items/weapons/sharpener.dm @@ -12,31 +12,31 @@ /obj/item/weapon/sharpener/attackby(obj/item/I, mob/user, params) if(used) - to_chat(user, "The sharpening block is too worn to use again.") + to_chat(user, "The sharpening block is too worn to use again!") return if(I.force >= max || I.throwforce >= max)//no esword sharpening - to_chat(user, "[I] is much too powerful to sharpen further.") + to_chat(user, "[I] is much too powerful to sharpen further!") return if(requires_sharpness && !I.sharpness) - to_chat(user, "You can only sharpen items that are already sharp, such as knives.") + to_chat(user, "You can only sharpen items that are already sharp, such as knives!") return if(istype(I, /obj/item/weapon/melee/transforming/energy)) - to_chat(user, "You don't think \the [I] will be the thing getting modified if you use it on \the [src].") + to_chat(user, "You don't think \the [I] will be the thing getting modified if you use it on \the [src]!") return if(istype(I, /obj/item/weapon/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff var/obj/item/weapon/twohanded/TH = I if(TH.force_wielded >= max) - to_chat(user, "[TH] is much too powerful to sharpen further.") + to_chat(user, "[TH] is much too powerful to sharpen further!") return if(TH.wielded) - to_chat(user, "[TH] must be unwielded before it can be sharpened.") + to_chat(user, "[TH] must be unwielded before it can be sharpened!") return if(TH.force_wielded > initial(TH.force_wielded)) - to_chat(user, "[TH] has already been refined before. It cannot be sharpened further.") + to_chat(user, "[TH] has already been refined before. It cannot be sharpened further!") return TH.force_wielded = Clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay if(I.force > initial(I.force)) - to_chat(user, "[I] has already been refined before. It cannot be sharpened further.") + to_chat(user, "[I] has already been refined before. It cannot be sharpened further!") return user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.") I.sharpness = IS_SHARP_ACCURATE @@ -46,6 +46,7 @@ name = "worn out [name]" desc = "[desc] At least, it used to." used = 1 + update_icon() /obj/item/weapon/sharpener/super name = "super whetstone" diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index a8f7708c46fa1d3d9b0d28c0a15686dfebd0f8ac..87b2b46a2bad9966f73883c7a09f3b4a22a3df52 100644 GIT binary patch literal 25105 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ʼn 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 SQlLZ{0Q9ts?v&hei2ffmmYbRY literal 23347 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 Date: Sun, 13 Aug 2017 09:49:43 -0500 Subject: [PATCH 052/164] Automatic changelog generation for PR #2346 [ci skip] --- html/changelogs/AutoChangeLog-pr-2346.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2346.yml diff --git a/html/changelogs/AutoChangeLog-pr-2346.yml b/html/changelogs/AutoChangeLog-pr-2346.yml new file mode 100644 index 0000000000..c42300a173 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2346.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - tweak: "The wiki button now asks what page you want to be taken to" From fdfb61b5272600b05a3d66a17adf9b0ecd1e8d14 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 13 Aug 2017 09:50:51 -0500 Subject: [PATCH 053/164] Update client_procs.dm --- code/modules/client/client_procs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index feb1a6e94d..b4a879e5fe 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -73,8 +73,8 @@ return //Logs all hrefs, except chat pings - if(href_list["proc"] != "ping") - GLOB.world_href_log << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" + if(!(href_list["_src_"] == "chat" && href_list["proc"] == "ping" && LAZYLEN(href_list) == 2)) + WRITE_FILE(GLOB.world_href_log, "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
") // Admin PM if(href_list["priv_msg"]) From be46c419e263d8e1167f279540b6ef43440e6a24 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 09:51:47 -0500 Subject: [PATCH 054/164] Automatic changelog generation for PR #2350 [ci skip] --- html/changelogs/AutoChangeLog-pr-2350.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2350.yml diff --git a/html/changelogs/AutoChangeLog-pr-2350.yml b/html/changelogs/AutoChangeLog-pr-2350.yml new file mode 100644 index 0000000000..07e0f51b62 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2350.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - bugfix: "Minebots no longer lack icons for their action buttons." From 6d72705ff593034e0b79db42b82b3504591f10f1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 09:53:12 -0500 Subject: [PATCH 055/164] Automatic changelog generation for PR #2356 [ci skip] --- html/changelogs/AutoChangeLog-pr-2356.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2356.yml diff --git a/html/changelogs/AutoChangeLog-pr-2356.yml b/html/changelogs/AutoChangeLog-pr-2356.yml new file mode 100644 index 0000000000..218da24865 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2356.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - imageadd: "Adds icon_states to the unused and used Eldritch whetstones. Sprites by Fury McFlurry." From bd358230122ebc1b3c02478399002d9cc658ce53 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 17:41:12 -0500 Subject: [PATCH 056/164] [ready]Makes bIcon better --- code/__DEFINES/misc.dm | 1 + code/__HELPERS/icons.dm | 109 +++++++++++++- code/__HELPERS/text.dm | 5 +- code/__HELPERS/unsorted.dm | 4 +- code/controllers/subsystem/assets.dm | 5 +- code/datums/callback.dm.rej | 62 ++++++++ code/datums/wires/mulebot.dm | 10 +- code/datums/wires/particle_accelerator.dm | 2 +- code/datums/wires/syndicatebomb.dm | 24 +-- code/game/atoms.dm | 2 +- code/game/gamemodes/clock_cult/clock_mobs.dm | 2 +- .../gamemodes/devil/true_devil/_true_devil.dm | 6 +- code/game/gamemodes/gang/gang_datum.dm | 2 +- code/game/gamemodes/gang/gang_pen.dm | 2 +- code/game/gamemodes/gang/recaller.dm | 18 +-- code/game/gamemodes/nuclear/nuclear.dm | 2 +- code/game/gamemodes/traitor/traitor.dm | 2 +- code/game/machinery/computer/apc_control.dm | 8 +- code/game/machinery/computer/message.dm | 8 +- code/game/machinery/overview.dm | 8 +- code/game/machinery/syndicatebomb.dm | 10 +- code/game/mecha/equipment/mecha_equipment.dm | 2 +- code/game/mecha/mecha.dm | 6 +- .../effects/decals/cleanable/humans.dm | 2 +- code/game/objects/effects/mines.dm | 2 +- code/game/objects/items/devices/PDA/PDA.dm | 4 +- .../objects/items/devices/geiger_counter.dm | 14 +- code/game/objects/items/toys.dm | 4 +- code/game/objects/items/weapons/AI_modules.dm | 2 +- code/game/objects/items/weapons/cards_ids.dm | 2 +- .../objects/items/weapons/pneumaticCannon.dm | 4 +- code/game/objects/items/weapons/powerfist.dm | 2 +- code/modules/admin/verbs/pray.dm | 2 +- code/modules/assembly/bomb.dm | 2 +- code/modules/assembly/health.dm | 2 +- code/modules/assembly/infrared.dm | 2 +- code/modules/assembly/proximity.dm | 2 +- code/modules/assembly/signaler.dm | 2 +- code/modules/assembly/timer.dm | 2 +- code/modules/client/asset_cache.dm | 45 ++++++ code/modules/client/client_procs.dm | 2 +- code/modules/client/verbs/ooc.dm | 2 +- .../modules/clothing/spacesuits/flightsuit.dm | 4 +- code/modules/clothing/spacesuits/hardsuit.dm | 2 +- code/modules/emoji/emoji_parse.dm | 2 +- .../kitchen_machinery/icecream_vat.dm | 2 +- code/modules/food_and_drinks/pizzabox.dm | 2 +- code/modules/goonchat/browserOutput.dm | 102 +++++++++++-- code/modules/goonchat/browserOutput.dm.rej | 137 ++++++++++++++++++ .../browserassets/css/browserOutput.css | 9 +- .../browserassets/js/browserOutput.js | 27 +++- code/modules/language/language.dm | 2 +- code/modules/mob/living/carbon/examine.dm | 16 +- .../mob/living/carbon/human/examine.dm | 58 ++++---- code/modules/mob/living/silicon/ai/examine.dm | 2 +- .../mob/living/silicon/pai/software.dm | 2 +- .../mob/living/silicon/robot/examine.dm | 4 +- .../mob/living/simple_animal/bot/bot.dm | 6 +- .../mob/living/simple_animal/bot/mulebot.dm | 2 +- .../mob/living/simple_animal/constructs.dm | 2 +- .../simple_animal/friendly/drone/_drone.dm | 14 +- .../living/simple_animal/friendly/mouse.dm | 2 +- .../simple_animal/guardian/types/dextrous.dm | 10 +- .../mob/living/simple_animal/slime/slime.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 6 +- code/modules/recycling/conveyor2.dm | 2 +- code/modules/uplink/uplink_item.dm | 6 +- interface/stylesheet.dm | 2 +- 68 files changed, 644 insertions(+), 180 deletions(-) create mode 100644 code/datums/callback.dm.rej create mode 100644 code/modules/goonchat/browserOutput.dm.rej diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 6a932ead4a..d6299ba42c 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -350,6 +350,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE //debug printing macros #define debug_world(msg) if (GLOB.Debug2) to_chat(world, "DEBUG: [msg]") +#define debug_usr(msg) if (GLOB.Debug2&&usr) to_chat(usr, "DEBUG: [msg]") #define debug_admins(msg) if (GLOB.Debug2) to_chat(GLOB.admins, "DEBUG: [msg]") #define debug_world_log(msg) if (GLOB.Debug2) log_world("DEBUG: [msg]") diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 04ea69a43f..855675a29f 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -167,7 +167,7 @@ mob Output_Icon() set name = "2. Output Icon" - to_chat(src, "Icon is: [bicon(getFlatIcon(src))]") + to_chat(src, "Icon is: [icon2base64html(getFlatIcon(src))]") Label_Icon() set name = "3. Label Icon" @@ -993,3 +993,110 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) #undef FROZEN_RED_COLOR #undef FROZEN_GREEN_COLOR #undef FROZEN_BLUE_COLOR + + +//Converts an icon to base64. Operates by putting the icon in the iconCache savefile, +// exporting it as text, and then parsing the base64 from that. +// (This relies on byond automatically storing icons in savefiles as base64) +/proc/icon2base64(icon/icon, iconKey = "misc") + if (!isicon(icon)) + return FALSE + WRITE_FILE(GLOB.iconCache[iconKey], icon) + var/iconData = GLOB.iconCache.ExportText(iconKey) + var/list/partial = splittext(iconData, "{") + return replacetext(copytext(partial[2], 3, -5), "\n", "") + +/proc/icon2html(thing, target, icon_state, dir, frame = 1, moving = FALSE) + if (!thing) + return + + var/key + var/icon/I = thing + if (!target) + return + if (target == world) + target = GLOB.clients + + var/list/targets + if (!islist(target)) + targets = list(target) + else + targets = target + if (!targets.len) + return + if (!isicon(I)) + if (isfile(thing)) //special snowflake + var/name = sanitize_filename("[generate_asset_name(thing)].png") + register_asset(name, thing) + for (var/thing2 in targets) + send_asset(thing2, key, FALSE) + return "" + var/atom/A = thing + if (isnull(dir)) + dir = A.dir + if (isnull(icon_state)) + icon_state = A.icon_state + I = A.icon + if (ishuman(thing)) // Shitty workaround for a BYOND issue. + var/icon/temp = I + I = icon() + I.Insert(temp, dir = SOUTH) + dir = SOUTH + else + if (isnull(dir)) + dir = SOUTH + if (isnull(icon_state)) + icon_state = "" + + I = icon(I, icon_state, dir, frame, moving) + + key = "[generate_asset_name(I)].png" + register_asset(key, I) + for (var/thing2 in targets) + send_asset(thing2, key, FALSE) + + return "" + +/proc/icon2base64html(thing) + if (!thing) + return + var/static/list/bicon_cache = list() + if (isicon(thing)) + var/icon/I = thing + var/icon_base64 = icon2base64(I) + + if (I.Height() > world.icon_size || I.Width() > world.icon_size) + var/icon_md5 = md5(icon_base64) + icon_base64 = bicon_cache[icon_md5] + if (!icon_base64) // Doesn't exist yet, make it. + bicon_cache[icon_md5] = icon_base64 = icon2base64(I) + + + return "" + + // Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with. + var/atom/A = thing + var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]" + + + if (!bicon_cache[key]) // Doesn't exist, make it. + var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1) + if (ishuman(thing)) // Shitty workaround for a BYOND issue. + var/icon/temp = I + I = icon() + I.Insert(temp, dir = SOUTH) + + bicon_cache[key] = icon2base64(I, key) + + return "" + +//Costlier version of icon2html() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. +/proc/costly_icon2html(thing, target) + if (!thing) + return + + if (isicon(thing)) + return icon2html(thing, target) + + var/icon/I = getFlatIcon(thing) + return icon2html(I, target) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index cd5d0c6af5..ef89caa490 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -45,6 +45,9 @@ index = findtext(t, char, index+1) return t +/proc/sanitize_filename(t) + return sanitize_simple(t, list("\n"="", "\t"="", "/"="", "\\"="", "?"="", "%"="", "*"="", ":"="", "|"="", "\""="", "<"="", ">"="")) + //Runs byond's sanitization proc along-side sanitize_simple /proc/sanitize(t,list/repl_chars = null) return html_encode(sanitize_simple(t,repl_chars)) @@ -560,7 +563,7 @@ GLOBAL_LIST_INIT(binary, list("0","1")) var/next_backslash = findtext(string, "\\") if(!next_backslash) return string - + var/leng = length(string) var/next_space = findtext(string, " ", next_backslash + 1) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index aab766f9e4..f3d67905de 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -845,11 +845,11 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( /obj/proc/atmosanalyzer_scan(datum/gas_mixture/air_contents, mob/user, obj/target = src) var/obj/icon = target - user.visible_message("[user] has used the analyzer on [bicon(icon)] [target].", "You use the analyzer on [bicon(icon)] [target].") + user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(src))] [target].", "You use the analyzer on [icon2html(icon, user)] [target].") var/pressure = air_contents.return_pressure() var/total_moles = air_contents.total_moles() - to_chat(user, "Results of analysis of [bicon(icon)] [target].") + to_chat(user, "Results of analysis of [icon2html(icon, user)] [target].") if(total_moles>0) to_chat(user, "Pressure: [round(pressure,0.1)] kPa") diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/assets.dm index 607b142c59..fd27c9424f 100644 --- a/code/controllers/subsystem/assets.dm +++ b/code/controllers/subsystem/assets.dm @@ -3,12 +3,15 @@ SUBSYSTEM_DEF(assets) init_order = INIT_ORDER_ASSETS flags = SS_NO_FIRE var/list/cache = list() + var/list/preload = list() /datum/controller/subsystem/assets/Initialize(timeofday) for(var/type in typesof(/datum/asset) - list(/datum/asset, /datum/asset/simple)) var/datum/asset/A = new type() A.register() + preload = cache.Copy() //don't preload assets generated during the round + for(var/client/C in GLOB.clients) - addtimer(CALLBACK(GLOBAL_PROC, .proc/getFilesSlow, C, cache, FALSE), 10) + addtimer(CALLBACK(GLOBAL_PROC, .proc/getFilesSlow, C, preload, FALSE), 10) ..() diff --git a/code/datums/callback.dm.rej b/code/datums/callback.dm.rej new file mode 100644 index 0000000000..14faac8412 --- /dev/null +++ b/code/datums/callback.dm.rej @@ -0,0 +1,62 @@ +diff a/code/datums/callback.dm b/code/datums/callback.dm (rejected hunks) +@@ -100,60 +100,3 @@ + if (object == GLOBAL_PROC) + return call(delegate)(arglist(calling_arguments)) + return call(object, delegate)(arglist(calling_arguments)) +- +- +-/datum/callback_select +- var/list/finished +- var/pendingcount +- var/total +- +-/datum/callback_select/New(count, savereturns) +- total = count +- if (savereturns) +- finished = new(count) +- +- +-/datum/callback_select/proc/invoke_callback(index, datum/callback/callback, list/callback_args, savereturn = TRUE) +- set waitfor = FALSE +- if (!callback || !istype(callback)) +- //This check only exists because the alternative is callback_select would block forever if given invalid data +- CRASH("invalid callback passed to invoke_callback") +- if (!length(callback_args)) +- callback_args = list() +- pendingcount++ +- debug_usr("calling callback") +- var/rtn = callback.Invoke(arglist(callback_args)) +- debug_usr("callback returned") +- pendingcount-- +- if (savereturn) +- finished[index] = rtn +- +- +- +- +-//runs a list of callbacks asynchronously, returning once all of them return. +-//callbacks can be repeated. +-//callbacks-args is a optional list of argument lists, in the same order as the callbacks, +-// the inner lists will be sent to the callbacks when invoked() as additional args. +-//can optionly save and return a list of return values, in the same order as the original list of callbacks +-//resolution is the number of byond ticks between checks. +-/proc/callback_select(list/callbacks, list/callback_args, savereturns = TRUE, resolution = 1) +- if (!callbacks) +- return +- var/count = length(callbacks) +- if (!count) +- return +- if (!callback_args) +- callback_args = list() +- +- callback_args.len = count +- +- var/datum/callback_select/CS = new(count, savereturns) +- for (var/i in 1 to count) +- CS.invoke_callback(i, callbacks[i], callback_args[i], savereturns) +- debug_usr("starting callbacks: [CS.pendingcount]") +- while(CS.pendingcount) +- debug_usr("callbacks: [CS.pendingcount]") +- sleep(resolution*world.tick_lag) +- return CS.finished +- diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm index 00b2dd10b8..9aa2ca81e8 100644 --- a/code/datums/wires/mulebot.dm +++ b/code/datums/wires/mulebot.dm @@ -20,12 +20,12 @@ var/mob/living/simple_animal/bot/mulebot/M = holder switch(wire) if(WIRE_POWER1, WIRE_POWER2) - holder.visible_message("[bicon(M)] The charge light flickers.") + holder.visible_message("[icon2html(M, viewers(holder))] The charge light flickers.") if(WIRE_AVOIDANCE) - holder.visible_message("[bicon(M)] The external warning lights flash briefly.") + holder.visible_message("[icon2html(M, viewers(holder))] The external warning lights flash briefly.") if(WIRE_LOADCHECK) - holder.visible_message("[bicon(M)] The load platform clunks.") + holder.visible_message("[icon2html(M, viewers(holder))] The load platform clunks.") if(WIRE_MOTOR1, WIRE_MOTOR2) - holder.visible_message("[bicon(M)] The drive motor whines briefly.") + holder.visible_message("[icon2html(M, viewers(holder))] The drive motor whines briefly.") else - holder.visible_message("[bicon(M)] You hear a radio crackle.") \ No newline at end of file + holder.visible_message("[icon2html(M, viewers(holder))] You hear a radio crackle.") \ No newline at end of file diff --git a/code/datums/wires/particle_accelerator.dm b/code/datums/wires/particle_accelerator.dm index 436b8be3ec..d38147f1ec 100644 --- a/code/datums/wires/particle_accelerator.dm +++ b/code/datums/wires/particle_accelerator.dm @@ -25,7 +25,7 @@ if(WIRE_INTERFACE) C.interface_control = !C.interface_control if(WIRE_LIMIT) - C.visible_message("[bicon(C)][C] makes a large whirring noise.") + C.visible_message("[icon2html(C, viewers(holder))][C] makes a large whirring noise.") /datum/wires/particle_accelerator/control_box/on_cut(wire, mend) var/obj/machinery/particle_accelerator/control_box/C = holder diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index 78acc42eb0..043110f5d3 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -19,21 +19,21 @@ switch(wire) if(WIRE_BOOM) if(B.active) - holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + holder.visible_message("[icon2html(B, viewers(holder))] An alarm sounds! It's go-") B.explode_now = TRUE tell_admins(B) if(WIRE_UNBOLT) - holder.visible_message("[bicon(B)] The bolts spin in place for a moment.") + holder.visible_message("[icon2html(B, viewers(holder))] The bolts spin in place for a moment.") if(WIRE_DELAY) if(B.delayedbig) - holder.visible_message("[bicon(B)] The bomb has already been delayed.") + holder.visible_message("[icon2html(B, viewers(holder))] The bomb has already been delayed.") else - holder.visible_message("[bicon(B)] The bomb chirps.") + holder.visible_message("[icon2html(B, viewers(holder))] The bomb chirps.") playsound(B, 'sound/machines/chime.ogg', 30, 1) B.detonation_timer += 300 B.delayedbig = TRUE if(WIRE_PROCEED) - holder.visible_message("[bicon(B)] The bomb buzzes ominously!") + holder.visible_message("[icon2html(B, viewers(holder))] The bomb buzzes ominously!") playsound(B, 'sound/machines/buzz-sigh.ogg', 30, 1) var/seconds = B.seconds_remaining() if(seconds >= 61) // Long fuse bombs can suddenly become more dangerous if you tinker with them. @@ -44,13 +44,13 @@ B.detonation_timer = world.time + 100 if(WIRE_ACTIVATE) if(!B.active && !B.defused) - holder.visible_message("[bicon(B)] You hear the bomb start ticking!") + holder.visible_message("[icon2html(B, viewers(holder))] You hear the bomb start ticking!") B.activate() B.update_icon() else if(B.delayedlittle) - holder.visible_message("[bicon(B)] Nothing happens.") + holder.visible_message("[icon2html(B, viewers(holder))] Nothing happens.") else - holder.visible_message("[bicon(B)] The bomb seems to hesitate for a moment.") + holder.visible_message("[icon2html(B, viewers(holder))] The bomb seems to hesitate for a moment.") B.detonation_timer += 100 B.delayedlittle = TRUE @@ -62,24 +62,24 @@ B.defused = FALSE // Cutting and mending all the wires of an inactive bomb will thus cure any sabotage. else if(B.active) - holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + holder.visible_message("[icon2html(B, viewers(holder))] An alarm sounds! It's go-") B.explode_now = TRUE tell_admins(B) else B.defused = TRUE if(WIRE_UNBOLT) if(!mend && B.anchored) - holder.visible_message("[bicon(B)] The bolts lift out of the ground!") + holder.visible_message("[icon2html(B, viewers(holder))] The bolts lift out of the ground!") playsound(B, 'sound/effects/stealthoff.ogg', 30, 1) B.anchored = FALSE if(WIRE_PROCEED) if(!mend && B.active) - holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + holder.visible_message("[icon2html(B, viewers(holder))] An alarm sounds! It's go-") B.explode_now = TRUE tell_admins(B) if(WIRE_ACTIVATE) if(!mend && B.active) - holder.visible_message("[bicon(B)] The timer stops! The bomb has been defused!") + holder.visible_message("[icon2html(B, viewers(holder))] The timer stops! The bomb has been defused!") B.active = FALSE B.defused = TRUE B.update_icon() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 6a00f26ffc..d931f808b8 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -270,7 +270,7 @@ f_name = "a " f_name += "blood-stained [name]!" - to_chat(user, "[bicon(src)] That's [f_name]") + to_chat(user, "[icon2html(src, user)] That's [f_name]") if(desc) to_chat(user, desc) diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm index 97a68fd321..abeb183ab0 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs.dm @@ -38,7 +38,7 @@ /mob/living/simple_animal/hostile/clockwork/examine(mob/user) var/t_He = p_they(TRUE) var/t_s = p_s() - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" msg += "[desc]\n" if(health < maxHealth) msg += "" diff --git a/code/game/gamemodes/devil/true_devil/_true_devil.dm b/code/game/gamemodes/devil/true_devil/_true_devil.dm index 1a0cfcd231..090b926dbf 100644 --- a/code/game/gamemodes/devil/true_devil/_true_devil.dm +++ b/code/game/gamemodes/devil/true_devil/_true_devil.dm @@ -61,15 +61,15 @@ /mob/living/carbon/true_devil/examine(mob/user) - var/msg = "*---------*\nThis is [bicon(src)] [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] [src]!\n" //Left hand items for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "It is holding [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "It is holding [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "It is holding [bicon(I)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "It is holding [icon2html(I, user)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" //Braindead if(!client && stat != DEAD) diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm index ba18ad7578..b7b20a7311 100644 --- a/code/game/gamemodes/gang/gang_datum.dm +++ b/code/game/gamemodes/gang/gang_datum.dm @@ -191,7 +191,7 @@ var/mob/living/mob = get(tool.loc, /mob/living) if(mob && mob.mind && mob.stat == CONSCIOUS) if(mob.mind.gang_datum == src) - to_chat(mob, "[bicon(tool)] [message]") + to_chat(mob, "[icon2html(tool, mob)] [message]") return diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm index 4357f31e83..e52db2ec5f 100644 --- a/code/game/gamemodes/gang/gang_pen.dm +++ b/code/game/gamemodes/gang/gang_pen.dm @@ -66,4 +66,4 @@ cooldown = 0 icon_state = "pen" var/mob/M = get(src, /mob) - to_chat(M, "[bicon(src)] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.") + to_chat(M, "[icon2html(src, M)] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.") diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index 601a1f1c0d..0be52e6033 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -110,7 +110,7 @@ if(!message || !can_use(user)) return if(user.z > 2) - to_chat(user, "[bicon(src)]Error: Station out of range.") + to_chat(user, "[icon2html(src, user)]Error: Station out of range.") return var/list/members = list() members += gang.gangsters @@ -179,35 +179,35 @@ gang.message_gangtools("[usr] is attempting to recall the emergency shuttle.") recalling = 1 - to_chat(loc, "[bicon(src)]Generating shuttle recall order with codes retrieved from last call signal...") + to_chat(loc, "[icon2html(src, loc)]Generating shuttle recall order with codes retrieved from last call signal...") sleep(rand(100,300)) if(SSshuttle.emergency.mode != SHUTTLE_CALL) //Shuttle can only be recalled when it's moving to the station - to_chat(user, "[bicon(src)]Emergency shuttle cannot be recalled at this time.") + to_chat(user, "[icon2html(src, user)]Emergency shuttle cannot be recalled at this time.") recalling = 0 return 0 - to_chat(loc, "[bicon(src)]Shuttle recall order generated. Accessing station long-range communication arrays...") + to_chat(loc, "[icon2html(src, loc)]Shuttle recall order generated. Accessing station long-range communication arrays...") sleep(rand(100,300)) if(!gang.dom_attempts) - to_chat(user, "[bicon(src)]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.") + to_chat(user, "[icon2html(src, user)]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.") recalling = 0 return 0 var/turf/userturf = get_turf(user) if(userturf.z != ZLEVEL_STATION) //Shuttle can only be recalled while on station - to_chat(user, "[\bicon(src)]Error: Device out of range of station communication arrays.") + to_chat(user, "[icon2html(src, user)]Error: Device out of range of station communication arrays.") recalling = 0 return 0 var/datum/station_state/end_state = new /datum/station_state() end_state.count() if((100 * GLOB.start_state.score(end_state)) < 80) //Shuttle cannot be recalled if the station is too damaged - to_chat(user, "[bicon(src)]Error: Station communication systems compromised. Unable to establish connection.") + to_chat(user, "[icon2html(src, user)]Error: Station communication systems compromised. Unable to establish connection.") recalling = 0 return 0 - to_chat(loc, "[bicon(src)]Comm arrays accessed. Broadcasting recall signal...") + to_chat(loc, "[icon2html(src, loc)]Comm arrays accessed. Broadcasting recall signal...") sleep(rand(100,300)) @@ -220,7 +220,7 @@ gang.recalls -= 1 return 1 - to_chat(loc, "[bicon(src)]No response recieved. Emergency shuttle cannot be recalled at this time.") + to_chat(loc, "[icon2html(src, loc)]No response recieved. Emergency shuttle cannot be recalled at this time.") return 0 /obj/item/device/gangtool/proc/can_use(mob/living/carbon/human/user) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 759c5f4454..16fb1f601d 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -288,7 +288,7 @@ text += "
" text += "(Syndicates used [TC_uses] TC) [purchases]" if(TC_uses == 0 && station_was_nuked && !are_operatives_dead()) - text += "[bicon(icon('icons/badass.dmi', "badass"))]" + text += "[icon2html('icons/badass.dmi', world, "badass")]" to_chat(world, text) return 1 diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 3e6cca1ac5..3b91816ee9 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -124,7 +124,7 @@ text += " (used [TC_uses] TC) [purchases]" if(TC_uses==0 && traitorwin) var/static/icon/badass = icon('icons/badass.dmi', "badass") - text += "[bicon(badass)]" + text += "[icon2html(badass, world)]" text += objectives diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index bc5c8cbfa7..134c28571e 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -116,24 +116,24 @@ authenticated = FALSE auth_id = "\[NULL\]" if(href_list["restore_logging"]) - to_chat(usr, "[bicon(src)] Logging functionality restored from backup data.") + to_chat(usr, "[icon2html(src, usr)] Logging functionality restored from backup data.") emagged = FALSE LAZYADD(logs, "-=- Logging restored to full functionality at this point -=-") if(href_list["access_apc"]) playsound(src, "terminal_type", 50, 0) var/obj/machinery/power/apc/APC = locate(href_list["access_apc"]) in GLOB.apcs_list if(!APC || APC.aidisabled || APC.panel_open || QDELETED(APC)) - to_chat(usr, "[bicon(src)] APC does not return interface request. Remote access may be disabled.") + to_chat(usr, "[icon2html(src, usr)] APC does not return interface request. Remote access may be disabled.") return if(active_apc) - to_chat(usr, "[bicon(src)] Disconnected from [active_apc].") + to_chat(usr, "[icon2html(src, usr)] Disconnected from [active_apc].") active_apc.say("Remote access canceled. Interface locked.") playsound(active_apc, 'sound/machines/boltsdown.ogg', 25, 0) playsound(active_apc, 'sound/machines/terminal_alert.ogg', 50, 0) active_apc.locked = TRUE active_apc.update_icon() active_apc = null - to_chat(usr, "[bicon(src)] Connected to APC in [APC.area]. Interface request sent.") + to_chat(usr, "[icon2html(src, usr)] Connected to APC in [APC.area]. Interface request sent.") log_activity("remotely accessed APC in [APC.area]") APC.interact(usr, GLOB.not_incapacitated_state) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 26a7d3b729..352ddfa4db 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -414,10 +414,10 @@ customrecepient.tnote += "← From
[customsender] ([customjob]):
[custommessage]
" if (!customrecepient.silent) playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1) - customrecepient.audible_message("[bicon(customrecepient)] *[customrecepient.ttone]*", null, 3) + customrecepient.audible_message("[icon2html(customrecepient, viewers(customrecepient))] *[customrecepient.ttone]*", null, 3) if( customrecepient.loc && ishuman(customrecepient.loc) ) var/mob/living/carbon/human/H = customrecepient.loc - to_chat(H, "[bicon(customrecepient)] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)") + to_chat(H, "[icon2html(customrecepient, viewers(H))] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)") log_talk(usr,"[key_name(usr)] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]",LOGPDA) customrecepient.cut_overlays() customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r")) @@ -427,10 +427,10 @@ customrecepient.tnote += "← From [PDARec.owner] ([customjob]):
[custommessage]
" if (!customrecepient.silent) playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1) - customrecepient.audible_message("[bicon(customrecepient)] *[customrecepient.ttone]*", null, 3) + customrecepient.audible_message("[icon2html(customrecepient, viewers(customrecepient))] *[customrecepient.ttone]*", null, 3) if( customrecepient.loc && ishuman(customrecepient.loc) ) var/mob/living/carbon/human/H = customrecepient.loc - to_chat(H, "[bicon(customrecepient)] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)") + to_chat(H, "[icon2html(customrecepient, H)] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)") log_talk(usr,"[key_name(usr)] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]",LOGPDA) customrecepient.cut_overlays() customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r")) diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index ffcb36678a..ba4b7b53e3 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -146,7 +146,7 @@ var/icon/I2 = imap[2+(ix + icx*iy)*2] - //to_chat(world, "icon: [bicon(I)]") + //to_chat(world, "icon: [icon2html(I, world)]") I.DrawBox(colour, rx, ry, rx+1, ry+1) @@ -163,7 +163,7 @@ H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]" - //to_chat(world, "[bicon(I)] at [H.screen_loc]") + //to_chat(world, "[icon2html(I, world)] at [H.screen_loc]") H.name = (i==0)?"maprefresh":"map" @@ -274,7 +274,7 @@ var/icon/I = imap[1+(ix + icx*iy)] - //to_chat(world, "icon: [bicon(I)]") + //to_chat(world, "icon: [icon2html(I, world)]") I.DrawBox(colour, rx, ry, rx, ry) @@ -289,7 +289,7 @@ H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]" - //to_chat(world, "[bicon(I)] at [H.screen_loc]") + //to_chat(world, "[icon2html(I, world)] at [H.screen_loc]") H.name = (i==0)?"maprefresh":"map" diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 655483a255..56c4038a76 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -210,14 +210,14 @@ var/new_timer = input(user, "Please set the timer.", "Timer", "[timer_set]") as num if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station timer_set = Clamp(new_timer, minimum_timer, maximum_timer) - src.loc.visible_message("[bicon(src)] timer set for [timer_set] seconds.") + src.loc.visible_message("[icon2html(src, viewers(src))] timer set for [timer_set] seconds.") if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user)) if(defused || active) if(defused) - src.loc.visible_message("[bicon(src)] Device error: User intervention required.") + src.loc.visible_message("[icon2html(src, viewers(src))] Device error: User intervention required.") return else - src.loc.visible_message("[bicon(src)] [timer_set] seconds until detonation, please clear the area.") + src.loc.visible_message("[icon2html(src, viewers(loc))] [timer_set] seconds until detonation, please clear the area.") activate() update_icon() add_fingerprint(user) @@ -333,7 +333,7 @@ var/obj/machinery/syndicatebomb/holder = loc if(istype(holder)) attempts++ - holder.loc.visible_message("[bicon(holder)] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...") + holder.loc.visible_message("[icon2html(holder, viewers(holder))] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...") reset() else qdel(src) @@ -343,7 +343,7 @@ if(istype(holder)) attempts++ defusals++ - holder.loc.visible_message("[bicon(holder)] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires in 5 seconds...") + holder.loc.visible_message("[icon2html(holder, viewers(holder))] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires in 5 seconds...") sleep(50) //Just in case someone is trying to remove the bomb core this gives them a little window to crowbar it out if(istype(holder)) reset() diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 4fdf06b530..dd8581af69 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -139,7 +139,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/occupant_message(message) if(chassis) - chassis.occupant_message("[bicon(src)] [message]") + chassis.occupant_message("[icon2html(src, chassis.occupant)] [message]") return /obj/item/mecha_parts/mecha_equipment/proc/log_message(message) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 5564cd2c0a..b0c16dcfa7 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -262,7 +262,7 @@ if(equipment && equipment.len) to_chat(user, "It's equipped with:") for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) - to_chat(user, "[bicon(ME)] [ME]") + to_chat(user, "[icon2html(ME, user)] [ME]") //processing internal damage, temperature, air regulation, alert updates, lights power use. /obj/mecha/process() @@ -636,7 +636,7 @@ var/can_control_mech = 0 for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in trackers) can_control_mech = 1 - to_chat(user, "[bicon(src)] Status of [name]:\n[A.get_mecha_info()]") + to_chat(user, "[icon2html(src, user)] Status of [name]:\n[A.get_mecha_info()]") break if(!can_control_mech) to_chat(user, "You cannot control exosuits without AI control beacons installed.") @@ -1004,7 +1004,7 @@ /obj/mecha/proc/occupant_message(message as text) if(message) if(occupant && occupant.client) - to_chat(occupant, "[bicon(src)] [message]") + to_chat(occupant, "[icon2html(src, occupant)] [message]") return /obj/mecha/proc/log_message(message as text,red=null) diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 5127aa2285..72a721911f 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -169,7 +169,7 @@ . += "You recognise the footprints as belonging to:\n" for(var/shoe in shoe_types) var/obj/item/clothing/shoes/S = shoe - . += "some [initial(S.name)] [bicon(initial(S.icon))]\n" + . += "some [initial(S.name)] [icon2html(initial(S.icon), user)]\n" to_chat(user, .) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index c9b524836f..ef4531b2d6 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -22,7 +22,7 @@ /obj/effect/mine/proc/triggermine(mob/victim) if(triggered) return - visible_message("[victim] sets off [bicon(src)] [src]!") + visible_message("[victim] sets off [icon2html(src, viewers(src))] [src]!") var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(3, 1, src) s.start() diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index bca1ccce81..9097d8add4 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -558,7 +558,7 @@ GLOBAL_LIST_EMPTY(PDAs) if (!silent) playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) - audible_message("[bicon(src)] *[ttone]*", null, 3) + audible_message("[icon2html(src, hearers(src))] *[ttone]*", null, 3) //Search for holder of the PDA. var/mob/living/L = null if(loc && isliving(loc)) @@ -575,7 +575,7 @@ GLOBAL_LIST_EMPTY(PDAs) hrefstart = "" hrefend = "" - to_chat(L, "[\bicon(src)] Message from [hrefstart][source.owner] ([source.ownjob])[hrefend], \"[msg.message]\"[msg.get_photo_ref()] (Reply)") + to_chat(L, "[icon2html(src)] Message from [hrefstart][source.owner] ([source.ownjob])[hrefend], \"[msg.message]\"[msg.get_photo_ref()] (Reply)") update_icon() add_overlay(icon_alert) diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index e5bca7eeac..f32f707204 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -88,27 +88,27 @@ if(isliving(loc)) var/mob/living/M = loc if(!emagged) - to_chat(M, "[bicon(src)] RADIATION PULSE DETECTED.") - to_chat(M, "[bicon(src)] Severity: [amount]") + to_chat(M, "[icon2html(src, M)] RADIATION PULSE DETECTED.") + to_chat(M, "[icon2html(src, M)] Severity: [amount]") else - to_chat(M, "[bicon(src)] !@%$AT!(N P!LS! D/TEC?ED.") - to_chat(M, "[bicon(src)] &!F2rity: <=[amount]#1") + to_chat(M, "[icon2html(src, M)] !@%$AT!(N P!LS! D/TEC?ED.") + to_chat(M, "[icon2html(src, M)] &!F2rity: <=[amount]#1") update_icon() /obj/item/device/geiger_counter/attack_self(mob/user) scanning = !scanning update_icon() - to_chat(user, "[bicon(src)] You switch [scanning ? "on" : "off"] [src].") + to_chat(user, "[icon2html(src, user)] You switch [scanning ? "on" : "off"] [src].") /obj/item/device/geiger_counter/attack(mob/living/M, mob/user) if(user.a_intent == INTENT_HELP) if(!emagged) user.visible_message("[user] scans [M] with [src].", "You scan [M]'s radiation levels with [src]...") if(!M.radiation) - to_chat(user, "[bicon(src)] Radiation levels within normal boundaries.") + to_chat(user, "[icon2html(src, user)] Radiation levels within normal boundaries.") return 1 else - to_chat(user, "[bicon(src)] Subject is irradiated. Radiation levels: [M.radiation].") + to_chat(user, "[icon2html(src, user)] Subject is irradiated. Radiation levels: [M.radiation].") return 1 else user.visible_message("[user] scans [M] with [src].", "You project [src]'s stored radiation into [M]'s body!") diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 348c6620cd..daaadeb797 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -527,7 +527,7 @@ return list(pick(messages)) /obj/item/toy/talking/proc/toy_talk(mob/user, message) - user.loc.visible_message("[bicon(src)] [message]") + user.loc.visible_message("[icon2html(src, viewers(user.loc))] [message]") if(chattering) chatter(message, phomeme, user) @@ -1082,7 +1082,7 @@ user.visible_message("[user] pulls back the string on [src].") icon_state = "[initial(icon_state)]_used" sleep(5) - audible_message("[bicon(src)] Hiss!") + audible_message("[icon2html(src, viewers(src))] Hiss!") var/list/possible_sounds = list('sound/voice/hiss1.ogg', 'sound/voice/hiss2.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss4.ogg') var/chosen_sound = pick(possible_sounds) playsound(get_turf(src), chosen_sound, 50, 1) diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 6f2310303b..66e3e0317f 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -525,7 +525,7 @@ AI MODULES laws[1] = generate_ion_law() to_chat(user, "You press the button on [src].") playsound(user, 'sound/machines/click.ogg', 20, 1) - src.loc.visible_message("[bicon(src)] [laws[1]]") + src.loc.visible_message("[icon2html(src, viewers(loc))] [laws[1]]") /******************** Mother Drone ******************/ diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 3f89e593d5..e4a69dfab7 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -106,7 +106,7 @@ update_label() /obj/item/weapon/card/id/attack_self(mob/user) - user.visible_message("[user] shows you: [bicon(src)] [src.name].", \ + user.visible_message("[user] shows you: [icon2html(src, viewers(user))] [src.name].", \ "You show \the [src.name].") src.add_fingerprint(user) return diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index d2f5714d5e..e893fec6ac 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -37,10 +37,10 @@ out += "You'll need to get closer to see any more." return for(var/obj/item/I in loadedItems) - out += "[bicon(I)] It has \the [I] loaded." + out += "[icon2html(I, user)] It has \the [I] loaded." CHECK_TICK if(tank) - out += "[bicon(tank)] It has \the [tank] mounted onto it." + out += "[icon2html(tank, user)] It has \the [tank] mounted onto it." to_chat(user, out.Join("
")) /obj/item/weapon/pneumatic_cannon/attackby(obj/item/weapon/W, mob/user, params) diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm index 256cdc0433..77d7784852 100644 --- a/code/game/objects/items/weapons/powerfist.dm +++ b/code/game/objects/items/weapons/powerfist.dm @@ -26,7 +26,7 @@ to_chat(user, "You'll need to get closer to see any more.") return if(tank) - to_chat(user, "[bicon(tank)] It has \the [tank] mounted onto it.") + to_chat(user, "[icon2html(tank, user)] It has \the [tank] mounted onto it.") /obj/item/weapon/melee/powerfist/attackby(obj/item/weapon/W, mob/user, params) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 1b2fa82e20..ff39c36b9b 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -33,7 +33,7 @@ prayer_type = "CULTIST PRAYER" deity = "Nar-Sie" - msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg]" + msg = "[icon2html(cross, GLOB.admins)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg]" for(var/client/C in GLOB.admins) if(C.prefs.chat_toggles & CHAT_PRAYER) diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 2853fefcbf..03720d9d81 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -63,7 +63,7 @@ return /obj/item/device/onetankbomb/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here. - visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*") + visible_message("[icon2html(src, viewers(src))] *beep* *beep*", "*beep* *beep*") sleep(10) if(!src) return diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm index b454cbacfb..180cb55db6 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -59,7 +59,7 @@ health_scan = M.health if(health_scan <= alarm_health) pulse() - audible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*") + audible_message("[icon2html(src, hearers(src))] *beep* *beep*", "*beep* *beep*") toggle_scan() return return diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index be1659546f..c196e984a2 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -99,7 +99,7 @@ if(!secured || !on || next_activate > world.time) return FALSE pulse(0) - audible_message("[bicon(src)] *beep* *beep*", null, 3) + audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 3) next_activate = world.time + 30 /obj/item/device/assembly/infra/interact(mob/user)//TODO: change this this to the wire control panel diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 9cf534f975..556979070d 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -56,7 +56,7 @@ if(!secured || next_activate > world.time) return 0 pulse(0) - audible_message("[bicon(src)] *beep* *beep*", null, 3) + audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 3) next_activate = world.time + 30 diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index b3f25ac8cf..7c8efb14d5 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -143,7 +143,7 @@ Code: if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0 pulse(1) - audible_message("[bicon(src)] *beep* *beep*", null, 1) + audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 1) return diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index 8938ecbe9d..9a959bc544 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -45,7 +45,7 @@ if(!secured || next_activate > world.time) return FALSE pulse(0) - audible_message("[bicon(src)] *beep* *beep*", null, 3) + audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 3) if(loop) timing = 1 update_icon() diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 81fecc6dda..4f576dd3e7 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -138,6 +138,13 @@ You can set verify to TRUE if you want send() to sleep until the client has the /proc/register_asset(var/asset_name, var/asset) SSassets.cache[asset_name] = asset +//Generated names do not include file extention. +//Used mainly for code that deals with assets in a generic way +//The same asset will always lead to the same asset name +/proc/generate_asset_name(var/file) + return "asset.[md5(fcopy_rsc(file))]" + + //These datums are used to populate the asset cache, the proc "register()" does this. //all of our asset datums, used for referring to these later @@ -170,6 +177,33 @@ GLOBAL_LIST_EMPTY(asset_datums) send_asset_list(client,assets,verify) +//Generates assets based on iconstates of a single icon +/datum/asset/simple/icon_states + var/icon + var/direction = SOUTH + var/frame = 1 + var/movement_states = FALSE + + var/prefix = "default" //asset_name = "[prefix].[icon_state_name].png" + var/generic_icon_names = FALSE //generate icon filenames using generate_asset_name() instead the above format + + verify = FALSE + +/datum/asset/simple/icon_states/register() + for(var/icon_state_name in icon_states(icon)) + var/asset = icon(icon, icon_state_name, direction, frame, movement_states) + if (!asset) + continue + asset = fcopy_rsc(asset) //dedupe + var/asset_name = sanitize_filename("[prefix].[icon_state_name].png") + if (generic_icon_names) + asset_name = "[generate_asset_name(asset)].png" + + assets[asset_name] = asset + + ..() + + //DEFINITIONS FOR ASSET DATUMS START HERE. /datum/asset/simple/tgui @@ -306,3 +340,14 @@ GLOBAL_LIST_EMPTY(asset_datums) for(var/path in typesof(/datum/html_interface)) var/datum/html_interface/hi = new path() hi.registerResources() + +//this exists purely to avoid meta by pre-loading all language icons. +/datum/asset/language/register() + for(var/path in typesof(/datum/language)) + set waitfor = FALSE + var/datum/language/L = new path () + L.get_icon() + +/datum/asset/simple/icon_states/emojis + icon = 'icons/emoji.dmi' + generic_icon_names = TRUE diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 4455af7ca9..44b518e7b8 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -642,7 +642,7 @@ GLOBAL_LIST(external_rsc_urls) ) spawn (10) //removing this spawn causes all clients to not get verbs. //Precache the client with all other assets slowly, so as to not block other browse() calls - getFilesSlow(src, SSassets.cache, register_asset = FALSE) + getFilesSlow(src, SSassets.preload, register_asset = FALSE) //Hook, override it to run code when dir changes diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index aeb1a7fdcf..cd0f893fa6 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -55,7 +55,7 @@ var/keyname = key if(prefs.unlock_content) if(prefs.toggles & MEMBER_PUBLIC) - keyname = "[bicon(icon('icons/member_content.dmi', "blag"))][keyname]" + keyname = "[icon2html('icons/member_content.dmi', world, "blag")][keyname]" for(var/client/C in GLOB.clients) if(C.prefs.chat_toggles & CHAT_OOC) diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index 9888be0494..e0d2907ae8 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -138,7 +138,7 @@ targ = mob_override if(!istype(targ)) return - to_chat(targ, "[bicon(src)]|[message]") + to_chat(targ, "[icon2html(src, targ)]|[message]") /obj/item/device/flightpack/proc/sync_processing(datum/controller/subsystem/processing/flightpacks/FPS) processing_mode = FPS.flightsuit_processing @@ -924,7 +924,7 @@ targ = loc if(!istype(targ)) return - to_chat(targ, "[bicon(src)]|[message]") + to_chat(targ, "[icon2html(src, targ)]|[message]") /obj/item/clothing/suit/space/hardsuit/flightsuit/examine(mob/user) ..() diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 00f622b751..4dcc0207b9 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -47,7 +47,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/proc/display_visor_message(var/msg) var/mob/wearer = loc if(msg && ishuman(wearer)) - wearer.show_message("[bicon(src)][msg]", 1) + wearer.show_message("[icon2html(src, wearer)][msg]", 1) /obj/item/clothing/head/helmet/space/hardsuit/rad_act(severity) ..() diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm index 5ecadbe09c..58f261f8cc 100644 --- a/code/modules/emoji/emoji_parse.dm +++ b/code/modules/emoji/emoji_parse.dm @@ -16,7 +16,7 @@ if(search) emoji = lowertext(copytext(text, pos+1, search)) if(emoji in emojis) - parsed += bicon(icon('icons/emoji.dmi', emoji)) + parsed += icon2html('icons/emoji.dmi', world, emoji) pos = search + 1 else parsed += copytext(text, pos, search) diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index b5c02946e7..f519892dda 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -97,7 +97,7 @@ var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = O if(!I.ice_creamed) if(product_types[dispense_flavour] > 0) - src.visible_message("[bicon(src)] [user] scoops delicious [flavour_name] ice cream into [I].") + visible_message("[icon2html(src, viewers(src))] [user] scoops delicious [flavour_name] ice cream into [I].") product_types[dispense_flavour] -= 1 I.add_ice_cream(flavour_name) // if(beaker) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index cde68b86e2..54c2154b42 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -101,7 +101,7 @@ return open = !open if(open && !bomb_defused) - audible_message("[bicon(src)] *beep*") + audible_message("[icon2html(src, hearers(src))] *beep*") bomb_active = TRUE START_PROCESSING(SSobj, src) update_icon() diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 7b236ea56f..7dd0fd5bb3 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -177,18 +177,93 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic var/list/partial = splittext(iconData, "{") return replacetext(copytext(partial[2], 3, -5), "\n", "") -/proc/bicon(thing) +/proc/icon2html(thing, target, icon_state, dir, frame = 1, moving) + if (!thing) + return + var/static/datum/callback/CB = CALLBACK(GLOBAL_PROC, .proc/send_asset) + + var/key + var/icon/I = thing + if (!target) + return + if (target == world) + target = GLOB.clients + + var/list/targets + if (!islist(target)) + targets = list(target) + else + targets = target + if (!targets.len) + return + debug_usr("start") + if (!isicon(I)) + debug_usr("not icon") + if (isfile(thing)) //special snowflake + debug_usr("file") + var/name = sanitize_filename("bicon.[thing]") + debug_usr("file:[name]") + register_asset(name, thing) + var/list/callbacks + var/list/callback_args = list() + for (var/thing2 in targets) + callbacks += CB + callback_args[++callback_args.len] = list(thing2, name, TRUE) + callback_select(callbacks, callback_args, savereturns = FALSE) + return "" + debug_usr("not file") + var/atom/A + if (isnull(dir)) + dir = A.dir + if (isnull(icon_state)) + icon_state = A.icon_state + I = A.icon + if (ishuman(thing)) // Shitty workaround for a BYOND issue. + debug_usr("human") + var/icon/temp = I + I = icon() + I.Insert(temp, dir = SOUTH) + dir = SOUTH + else + debug_usr("icon") + if (isnull(dir)) + dir = SOUTH + if (isnull(icon_state)) + icon_state = "" + + I = icon(I, icon_state, dir, frame) + + key = sanitize_filename("bicon.[md5(icon2base64(I))].[icon_state].[dir].png") + debug_usr("key:[key]") + register_asset(key, I) + var/list/callbacks = list() + var/list/callback_args = list() + for (var/thing2 in targets) + callbacks += CB + callback_args[++callback_args.len] = list(thing2, key, TRUE) + + callback_select(callbacks, callback_args, savereturns = FALSE) + return "" + +/proc/icon2base64html(thing) if (!thing) return var/static/list/bicon_cache = list() if (isicon(thing)) var/icon/I = thing - var/icon_md5 = md5(I) - if (!bicon_cache[icon_md5]) // Doesn't exist yet, make it. - I = icon(I) //copy it - I.Scale(16,16) //scale it - bicon_cache[icon_md5] = icon2base64(thing) //base64 it - return "" + var/icon_base64 = icon2base64(I) + + if (I.Height() > world.icon_size || I.Width() > world.icon_size) + var/icon_md5 = md5(icon_base64) + debug_admins(icon_md5) + icon_base64 = bicon_cache[icon_md5] + if (!icon_base64) // Doesn't exist yet, make it. + I = icon(I) + I.Scale(world.icon_size, world.icon_size) + bicon_cache[icon_md5] = icon_base64 = icon2base64(I) + + + return "" // Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with. var/atom/A = thing @@ -197,25 +272,28 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic if (!bicon_cache[key]) // Doesn't exist, make it. var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1) - I.Scale(16,16) if (ishuman(thing)) // Shitty workaround for a BYOND issue. var/icon/temp = I I = icon() I.Insert(temp, dir = SOUTH) + + if (I.Height() > world.icon_size || I.Width() > world.icon_size) + I.Scale(world.icon_size, world.icon_size) + bicon_cache[key] = icon2base64(I, key) return "" -//Costlier version of bicon() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. -/proc/costly_bicon(thing) +//Costlier version of icon2html() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. +/proc/costly_icon2html(thing, target) if (!thing) return if (isicon(thing)) - return bicon(thing) + return icon2html(thing, target) var/icon/I = getFlatIcon(thing) - return bicon(I) + return icon2html(I, target) /proc/to_chat(target, message) if(!target) diff --git a/code/modules/goonchat/browserOutput.dm.rej b/code/modules/goonchat/browserOutput.dm.rej new file mode 100644 index 0000000000..231def1c9a --- /dev/null +++ b/code/modules/goonchat/browserOutput.dm.rej @@ -0,0 +1,137 @@ +diff a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm (rejected hunks) +@@ -166,135 +166,6 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic + + //Global chat procs + +-//Converts an icon to base64. Operates by putting the icon in the iconCache savefile, +-// exporting it as text, and then parsing the base64 from that. +-// (This relies on byond automatically storing icons in savefiles as base64) +-/proc/icon2base64(icon/icon, iconKey = "misc") +- if (!isicon(icon)) +- return FALSE +- WRITE_FILE(GLOB.iconCache[iconKey], icon) +- var/iconData = GLOB.iconCache.ExportText(iconKey) +- var/list/partial = splittext(iconData, "{") +- return replacetext(copytext(partial[2], 3, -5), "\n", "") +- +-/proc/icon2html(thing, target, icon_state, dir, frame = 1, moving) +- if (!thing) +- return +- var/static/datum/callback/CB = CALLBACK(GLOBAL_PROC, .proc/send_asset) +- +- var/key +- var/icon/I = thing +- if (!target) +- return +- if (target == world) +- target = GLOB.clients +- +- var/list/targets +- if (!islist(target)) +- targets = list(target) +- else +- targets = target +- if (!targets.len) +- return +- debug_usr("start") +- if (!isicon(I)) +- debug_usr("not icon") +- if (isfile(thing)) //special snowflake +- debug_usr("file") +- var/name = sanitize_filename("bicon.[thing]") +- debug_usr("file:[name]") +- register_asset(name, thing) +- var/list/callbacks +- var/list/callback_args = list() +- for (var/thing2 in targets) +- callbacks += CB +- callback_args[++callback_args.len] = list(thing2, name, TRUE) +- callback_select(callbacks, callback_args, savereturns = FALSE) +- return "" +- debug_usr("not file") +- var/atom/A +- if (isnull(dir)) +- dir = A.dir +- if (isnull(icon_state)) +- icon_state = A.icon_state +- I = A.icon +- if (ishuman(thing)) // Shitty workaround for a BYOND issue. +- debug_usr("human") +- var/icon/temp = I +- I = icon() +- I.Insert(temp, dir = SOUTH) +- dir = SOUTH +- else +- debug_usr("icon") +- if (isnull(dir)) +- dir = SOUTH +- if (isnull(icon_state)) +- icon_state = "" +- +- I = icon(I, icon_state, dir, frame) +- +- key = sanitize_filename("bicon.[md5(icon2base64(I))].[icon_state].[dir].png") +- debug_usr("key:[key]") +- register_asset(key, I) +- var/list/callbacks = list() +- var/list/callback_args = list() +- for (var/thing2 in targets) +- callbacks += CB +- callback_args[++callback_args.len] = list(thing2, key, TRUE) +- +- callback_select(callbacks, callback_args, savereturns = FALSE) +- return "" +- +-/proc/icon2base64html(thing) +- if (!thing) +- return +- var/static/list/bicon_cache = list() +- if (isicon(thing)) +- var/icon/I = thing +- var/icon_base64 = icon2base64(I) +- +- if (I.Height() > world.icon_size || I.Width() > world.icon_size) +- var/icon_md5 = md5(icon_base64) +- debug_admins(icon_md5) +- icon_base64 = bicon_cache[icon_md5] +- if (!icon_base64) // Doesn't exist yet, make it. +- I = icon(I) +- I.Scale(world.icon_size, world.icon_size) +- bicon_cache[icon_md5] = icon_base64 = icon2base64(I) +- +- +- return "" +- +- // Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with. +- var/atom/A = thing +- var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]" +- +- +- if (!bicon_cache[key]) // Doesn't exist, make it. +- var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1) +- if (ishuman(thing)) // Shitty workaround for a BYOND issue. +- var/icon/temp = I +- I = icon() +- I.Insert(temp, dir = SOUTH) +- +- if (I.Height() > world.icon_size || I.Width() > world.icon_size) +- I.Scale(world.icon_size, world.icon_size) +- +- bicon_cache[key] = icon2base64(I, key) +- +- return "" +- +-//Costlier version of icon2html() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. +-/proc/costly_icon2html(thing, target) +- if (!thing) +- return +- +- if (isicon(thing)) +- return icon2html(thing, target) +- +- var/icon/I = getFlatIcon(thing) +- return icon2html(I, target) +- + /proc/to_chat(target, message) + if(!target) + return diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index ea4c169f0e..7c42972a10 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -28,10 +28,14 @@ img { margin: 0; padding: 0; line-height: 1; + -ms-interpolation-mode: nearest-neighbor; + image-rendering: pixelated; } img.icon { - width: 16px; - height: 16px; + height: 1em; + min-height: 16px; + width: auto; + vertical-align: bottom; } a {color: #0000ff;} @@ -357,7 +361,6 @@ h1.alert, h2.alert {color: #000000;} .clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} -BIG IMG.icon {width: 32px; height: 32px;} .memo {color: #638500; text-align: center;} .memoedit {text-align: center; font-size: 16px;} diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index 59b152ab3b..e6e0c1d6fa 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -29,6 +29,8 @@ var opts = { 'messageLimit': 2053, //A limit...for the messages... 'scrollSnapTolerance': 10, //If within x pixels of bottom 'clickTolerance': 10, //Keep focus if outside x pixels of mousedown position on mouseup + 'imageRetryDelay': 50, //how long between attempts to reload images (in ms) + 'imageRetryLimit': 50, //how many attempts should we make? 'popups': 0, //Amount of popups opened ever 'wasd': false, //Is the user in wasd mode? 'chatMode': 'default', //The mode the chat is in @@ -146,6 +148,23 @@ function highlightTerms(el) { el.innerHTML = newText; } } + +function iconError(E) { + var that = this; + setTimeout(function() { + var attempts = $(that).data('reload_attempts'); + if (typeof attempts === 'undefined' || !attempts) { + attempts = 1; + } + if (attempts > opts.imageRetryLimit) + return; + var src = that.src; + that.src = null; + that.src = src+'#'+attempts; + $(that).data('reload_attempts', ++attempts); + }, opts.imageRetryDelay); +} + //Send a message to the client function output(message, flag) { if (typeof message === 'undefined') { @@ -271,7 +290,7 @@ function output(message, flag) { entry.innerHTML = message.trim(); $messages[0].appendChild(entry); - + $(entry).find("img.icon").error(iconError); //Actually do the snap if (!filteredOut && atBottom) { $('body,html').scrollTop($messages.outerHeight()); @@ -861,7 +880,11 @@ $(function() { $messages.empty(); opts.messageCount = 0; }); - + + $('img.icon').error(iconError); + + + /***************************************** * diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm index 2ad7f0549c..8b51429bd3 100644 --- a/code/modules/language/language.dm +++ b/code/modules/language/language.dm @@ -35,7 +35,7 @@ return TRUE /datum/language/proc/get_icon() - return "[bicon(icon(icon, icon_state))]" + return "[icon2html(icon, world, icon_state)]" /datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4, syllable_divisor=2) if(!syllables || !syllables.len) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index ebc349cefc..e30556db30 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -6,26 +6,26 @@ var/t_has = p_have() var/t_is = p_are() - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" if (handcuffed) - msg += "[t_He] [t_is] [bicon(handcuffed)] handcuffed!\n" + msg += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed!\n" if (head) - msg += "[t_He] [t_is] wearing [bicon(head)] \a [src.head] on [t_his] head. \n" + msg += "[t_He] [t_is] wearing [icon2html(head, user)] \a [src.head] on [t_his] head. \n" if (wear_mask) - msg += "[t_He] [t_is] wearing [bicon(wear_mask)] \a [src.wear_mask] on [t_his] face.\n" + msg += "[t_He] [t_is] wearing [icon2html(wear_mask, user)] \a [src.wear_mask] on [t_his] face.\n" if (wear_neck) - msg += "[t_He] [t_is] wearing [bicon(wear_neck)] \a [src.wear_neck] around [t_his] neck.\n" + msg += "[t_He] [t_is] wearing [icon2html(wear_neck, user)] \a [src.wear_neck] around [t_his] neck.\n" for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "[t_He] [t_is] holding [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "[t_He] [t_is] holding [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "[t_He] [t_is] holding [bicon(I)] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "[t_He] [t_is] holding [icon2html(I, user)] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" if (back) - msg += "[t_He] [t_has] [bicon(back)] \a [src.back] on [t_his] back.\n" + msg += "[t_He] [t_has] [icon2html(back, user)] \a [src.back] on [t_his] back.\n" var/appears_dead = 0 if (stat == DEAD) appears_dead = 1 diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 94732a349d..c2bec849e2 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -19,55 +19,55 @@ if(istype(w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform if(U.attached_accessory) - accessory_msg += " with [bicon(U.attached_accessory)] \a [U.attached_accessory]" + accessory_msg += " with [icon2html(U.attached_accessory, user)] \a [U.attached_accessory]" if(w_uniform.blood_DNA) - msg += "[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][accessory_msg]!\n" + msg += "[t_He] [t_is] wearing [icon2html(w_uniform, user)] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][accessory_msg]!\n" else - msg += "[t_He] [t_is] wearing [bicon(w_uniform)] \a [w_uniform][accessory_msg].\n" + msg += "[t_He] [t_is] wearing [icon2html(w_uniform, user)] \a [w_uniform][accessory_msg].\n" //head if(head) if(head.blood_DNA) - msg += "[t_He] [t_is] wearing [bicon(head)] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on [t_his] head!\n" + msg += "[t_He] [t_is] wearing [icon2html(head, user)] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on [t_his] head!\n" else - msg += "[t_He] [t_is] wearing [bicon(head)] \a [head] on [t_his] head.\n" + msg += "[t_He] [t_is] wearing [icon2html(head, user)] \a [head] on [t_his] head.\n" //suit/armor if(wear_suit) if(wear_suit.blood_DNA) - msg += "[t_He] [t_is] wearing [bicon(wear_suit)] [wear_suit.gender==PLURAL?"some":"a"] blood-stained [wear_suit.name]!\n" + msg += "[t_He] [t_is] wearing [icon2html(wear_suit, user)] [wear_suit.gender==PLURAL?"some":"a"] blood-stained [wear_suit.name]!\n" else - msg += "[t_He] [t_is] wearing [bicon(wear_suit)] \a [wear_suit].\n" + msg += "[t_He] [t_is] wearing [icon2html(wear_suit, user)] \a [wear_suit].\n" //suit/armor storage if(s_store) if(s_store.blood_DNA) - msg += "[t_He] [t_is] carrying [bicon(s_store)] [s_store.gender==PLURAL?"some":"a"] blood-stained [s_store.name] on [t_his] [wear_suit.name]!\n" + msg += "[t_He] [t_is] carrying [icon2html(s_store, user)] [s_store.gender==PLURAL?"some":"a"] blood-stained [s_store.name] on [t_his] [wear_suit.name]!\n" else - msg += "[t_He] [t_is] carrying [bicon(s_store)] \a [s_store] on [t_his] [wear_suit.name].\n" + msg += "[t_He] [t_is] carrying [icon2html(s_store, user)] \a [s_store] on [t_his] [wear_suit.name].\n" //back if(back) if(back.blood_DNA) - msg += "[t_He] [t_has] [bicon(back)] [back.gender==PLURAL?"some":"a"] blood-stained [back] on [t_his] back.\n" + msg += "[t_He] [t_has] [icon2html(back, user)] [back.gender==PLURAL?"some":"a"] blood-stained [back] on [t_his] back.\n" else - msg += "[t_He] [t_has] [bicon(back)] \a [back] on [t_his] back.\n" + msg += "[t_He] [t_has] [icon2html(back, user)] \a [back] on [t_his] back.\n" //Hands for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "[t_He] [t_is] holding [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "[t_He] [t_is] holding [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "[t_He] [t_is] holding [bicon(I)] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "[t_He] [t_is] holding [icon2html(I, user)] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" //gloves if(gloves && !(slot_gloves in obscured)) if(gloves.blood_DNA) - msg += "[t_He] [t_has] [bicon(gloves)] [gloves.gender==PLURAL?"some":"a"] blood-stained [gloves.name] on [t_his] hands!\n" + msg += "[t_He] [t_has] [icon2html(gloves, user)] [gloves.gender==PLURAL?"some":"a"] blood-stained [gloves.name] on [t_his] hands!\n" else - msg += "[t_He] [t_has] [bicon(gloves)] \a [gloves] on [t_his] hands.\n" + msg += "[t_He] [t_has] [icon2html(gloves, user)] \a [gloves] on [t_his] hands.\n" else if(blood_DNA) var/hand_number = get_num_arms() if(hand_number) @@ -78,48 +78,48 @@ //handcuffed? if(handcuffed) if(istype(handcuffed, /obj/item/weapon/restraints/handcuffs/cable)) - msg += "[t_He] [t_is] [bicon(handcuffed)] restrained with cable!\n" + msg += "[t_He] [t_is] [icon2html(handcuffed, user)] restrained with cable!\n" else - msg += "[t_He] [t_is] [bicon(handcuffed)] handcuffed!\n" + msg += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed!\n" //belt if(belt) if(belt.blood_DNA) - msg += "[t_He] [t_has] [bicon(belt)] [belt.gender==PLURAL?"some":"a"] blood-stained [belt.name] about [t_his] waist!\n" + msg += "[t_He] [t_has] [icon2html(belt, user)] [belt.gender==PLURAL?"some":"a"] blood-stained [belt.name] about [t_his] waist!\n" else - msg += "[t_He] [t_has] [bicon(belt)] \a [belt] about [t_his] waist.\n" + msg += "[t_He] [t_has] [icon2html(belt, user)] \a [belt] about [t_his] waist.\n" //shoes if(shoes && !(slot_shoes in obscured)) if(shoes.blood_DNA) - msg += "[t_He] [t_is] wearing [bicon(shoes)] [shoes.gender==PLURAL?"some":"a"] blood-stained [shoes.name] on [t_his] feet!\n" + msg += "[t_He] [t_is] wearing [icon2html(shoes, user)] [shoes.gender==PLURAL?"some":"a"] blood-stained [shoes.name] on [t_his] feet!\n" else - msg += "[t_He] [t_is] wearing [bicon(shoes)] \a [shoes] on [t_his] feet.\n" + msg += "[t_He] [t_is] wearing [icon2html(shoes, user)] \a [shoes] on [t_his] feet.\n" //mask if(wear_mask && !(slot_wear_mask in obscured)) if(wear_mask.blood_DNA) - msg += "[t_He] [t_has] [bicon(wear_mask)] [wear_mask.gender==PLURAL?"some":"a"] blood-stained [wear_mask.name] on [t_his] face!\n" + msg += "[t_He] [t_has] [icon2html(wear_mask, user)] [wear_mask.gender==PLURAL?"some":"a"] blood-stained [wear_mask.name] on [t_his] face!\n" else - msg += "[t_He] [t_has] [bicon(wear_mask)] \a [wear_mask] on [t_his] face.\n" + msg += "[t_He] [t_has] [icon2html(wear_mask, user)] \a [wear_mask] on [t_his] face.\n" if (wear_neck && !(slot_neck in obscured)) - msg += "[t_He] [t_is] wearing [bicon(wear_neck)] \a [src.wear_neck] around [t_his] neck.\n" + msg += "[t_He] [t_is] wearing [icon2html(wear_neck, user)] \a [src.wear_neck] around [t_his] neck.\n" //eyes if(glasses && !(slot_glasses in obscured)) if(glasses.blood_DNA) - msg += "[t_He] [t_has] [bicon(glasses)] [glasses.gender==PLURAL?"some":"a"] blood-stained [glasses] covering [t_his] eyes!\n" + msg += "[t_He] [t_has] [icon2html(glasses, user)] [glasses.gender==PLURAL?"some":"a"] blood-stained [glasses] covering [t_his] eyes!\n" else - msg += "[t_He] [t_has] [bicon(glasses)] \a [glasses] covering [t_his] eyes.\n" + msg += "[t_He] [t_has] [icon2html(glasses, user)] \a [glasses] covering [t_his] eyes.\n" //ears if(ears && !(slot_ears in obscured)) - msg += "[t_He] [t_has] [bicon(ears)] \a [ears] on [t_his] ears.\n" + msg += "[t_He] [t_has] [icon2html(ears, user)] \a [ears] on [t_his] ears.\n" //ID if(wear_id) - msg += "[t_He] [t_is] wearing [bicon(wear_id)] \a [wear_id].\n" + msg += "[t_He] [t_is] wearing [icon2html(wear_id, user)] \a [wear_id].\n" //Jitters switch(jitteriness) @@ -164,7 +164,7 @@ var/obj/item/bodypart/BP = X missing -= BP.body_zone for(var/obj/item/I in BP.embedded_objects) - msg += "[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [BP.name]!\n" + msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n" //stores missing limbs var/l_limbs_missing = 0 diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index b19e866378..3af95cec4c 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -1,5 +1,5 @@ /mob/living/silicon/ai/examine(mob/user) - var/msg = "*---------*\nThis is [bicon(src)] [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] [src]!\n" if (stat == DEAD) msg += "It appears to be powered-down.\n" else diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 77874ad403..9d2f786ade 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -173,7 +173,7 @@ if(href_list["send"]) sradio.send_signal("ACTIVATE") - audible_message("[bicon(src)] *beep* *beep*") + audible_message("[icon2html(src, world)] *beep* *beep*") if(href_list["freq"]) diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index 7f232e20f4..788a8f4255 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -1,11 +1,11 @@ /mob/living/silicon/robot/examine(mob/user) - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" if(desc) msg += "[desc]\n" var/obj/act_module = get_active_held_item() if(act_module) - msg += "It is holding [bicon(act_module)] \a [act_module].\n" + msg += "It is holding [icon2html(act_module, user)] \a [act_module].\n" msg += "" if (src.getBruteLoss()) if (src.getBruteLoss() < maxHealth*0.5) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 59cb793b27..3c963ca820 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -469,7 +469,7 @@ Pass a positive integer as an argument to override a bot's default speed. var/area/end_area = get_area(waypoint) if(client) //Player bots instead get a location command from the AI - to_chat(src, "Priority waypoint set by [bicon(caller)] [caller]. Proceed to [end_area.name]<\b>.") + to_chat(src, "Priority waypoint set by [icon2html(caller, src)] [caller]. Proceed to [end_area.name]<\b>.") //For giving the bot temporary all-access. var/obj/item/weapon/card/id/all_access = new /obj/item/weapon/card/id @@ -485,7 +485,7 @@ Pass a positive integer as an argument to override a bot's default speed. turn_on() //Saves the AI the hassle of having to activate a bot manually. access_card = all_access //Give the bot all-access while under the AI's command. if(message) - to_chat(calling_ai, "[bicon(src)] [name] called to [end_area.name]. [path.len-1] meters to destination.") + to_chat(calling_ai, "[icon2html(src, calling_ai)] [name] called to [end_area.name]. [path.len-1] meters to destination.") pathset = 1 mode = BOT_RESPONDING tries = 0 @@ -500,7 +500,7 @@ Pass a positive integer as an argument to override a bot's default speed. var/success = bot_move(ai_waypoint, 3) if(!success) if(calling_ai) - to_chat(calling_ai, "[bicon(src)] [get_turf(src) == ai_waypoint ? "[src] successfully arrived to waypoint." : "[src] failed to reach waypoint."]") + to_chat(calling_ai, "[icon2html(src, calling_ai)] [get_turf(src) == ai_waypoint ? "[src] successfully arrived to waypoint." : "[src] failed to reach waypoint."]") calling_ai = null bot_reset() diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index e8936a2863..74005e84dd 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -596,7 +596,7 @@ if(pathset) //The AI called us here, so notify it of our arrival. loaddir = dir //The MULE will attempt to load a crate in whatever direction the MULE is "facing". if(calling_ai) - to_chat(calling_ai, "[bicon(src)] [src] wirelessly plays a chiming sound!") + to_chat(calling_ai, "[icon2html(src, calling_ai)] [src] wirelessly plays a chiming sound!") playsound(calling_ai, 'sound/machines/chime.ogg',40, 0) calling_ai = null radio_channel = "AI Private" //Report on AI Private instead if the AI is controlling us. diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 74f855bf8c..e0993c6ce5 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -50,7 +50,7 @@ /mob/living/simple_animal/hostile/construct/examine(mob/user) var/t_He = p_they(TRUE) var/t_s = p_s() - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" msg += "[desc]\n" if(health < maxHealth) msg += "" diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index db347cc203..b37d5079d7 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -171,29 +171,29 @@ /mob/living/simple_animal/drone/examine(mob/user) - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" //Hands for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "It has [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "It has [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "It has [bicon(I)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "It has [icon2html(I, user)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" //Internal storage if(internal_storage && !(internal_storage.flags&ABSTRACT)) if(internal_storage.blood_DNA) - msg += "It is holding [bicon(internal_storage)] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!\n" + msg += "It is holding [icon2html(internal_storage, user)] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!\n" else - msg += "It is holding [bicon(internal_storage)] \a [internal_storage] in its internal storage.\n" + msg += "It is holding [icon2html(internal_storage, user)] \a [internal_storage] in its internal storage.\n" //Cosmetic hat - provides no function other than looks if(head && !(head.flags&ABSTRACT)) if(head.blood_DNA) - msg += "It is wearing [bicon(head)] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on its head!\n" + msg += "It is wearing [icon2html(head, user)] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on its head!\n" else - msg += "It is wearing [bicon(head)] \a [head] on its head.\n" + msg += "It is wearing [icon2html(head, user)] \a [head] on its head.\n" //Braindead if(!client && stat != DEAD) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 207bda2c2c..75a1759e1d 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -57,7 +57,7 @@ if( ishuman(AM) ) if(!stat) var/mob/M = AM - to_chat(M, "[bicon(src)] Squeek!") + to_chat(M, "[icon2html(src, M)] Squeek!") playsound(src, 'sound/effects/mousesqueek.ogg', 100, 1) ..() diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index 5fe0ccaade..02754e0121 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -26,21 +26,21 @@ /mob/living/simple_animal/hostile/guardian/dextrous/examine(mob/user) if(dextrous) - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src)] \a [src]!\n" msg += "[desc]\n" for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "It has [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "It has [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "It has [bicon(I)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "It has [icon2html(I, user)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" if(internal_storage && !(internal_storage.flags&ABSTRACT)) if(internal_storage.blood_DNA) - msg += "It is holding [bicon(internal_storage)] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!\n" + msg += "It is holding [icon2html(internal_storage, user)] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!\n" else - msg += "It is holding [bicon(internal_storage)] \a [internal_storage] in its internal storage.\n" + msg += "It is holding [icon2html(internal_storage, user)] \a [internal_storage] in its internal storage.\n" msg += "*---------*" to_chat(user, msg) else diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 236b36dafd..0e7d7a157e 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -347,7 +347,7 @@ /mob/living/simple_animal/slime/examine(mob/user) - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" if (src.stat == DEAD) msg += "It is limp and unresponsive.\n" else diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 8d2bd6002f..a062d5c614 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -401,19 +401,21 @@ add_reagent(P, cached_results[P]*multiplier, null, chem_temp) var/list/seen = viewers(4, get_turf(my_atom)) + var/iconhtml = icon2html(cached_my_atom, seen) if(cached_my_atom) if(!ismob(cached_my_atom)) // No bubbling mobs if(C.mix_sound) playsound(get_turf(cached_my_atom), C.mix_sound, 80, 1) + for(var/mob/M in seen) - to_chat(M, "[bicon(my_atom)] [C.mix_message]") + to_chat(M, "[iconhtml] [C.mix_message]") if(istype(cached_my_atom, /obj/item/slime_extract)) var/obj/item/slime_extract/ME2 = my_atom ME2.Uses-- if(ME2.Uses <= 0) // give the notification that the slime core is dead for(var/mob/M in seen) - to_chat(M, "[bicon(my_atom)] \The [my_atom]'s power is consumed in the reaction.") + to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") ME2.name = "used slime extract" ME2.desc = "This extract has been used up." diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 0d0a4f7695..4388d6bcbe 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -341,7 +341,7 @@ found = 1 break if(!found) - to_chat(user, "[bicon(src)]The conveyor switch did not detect any linked conveyor belts in range.") + to_chat(user, "[icon2html(src, user)]The conveyor switch did not detect any linked conveyor belts in range.") return var/obj/machinery/conveyor_switch/NC = new/obj/machinery/conveyor_switch(A, id) transfer_fingerprints_to(NC) diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 7b455b7d80..b04ebe6643 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -110,10 +110,10 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. var/obj/item/weapon/storage/box/B = A if(istype(B) && B.contents.len > 0) for(var/obj/item/I in B) - U.purchase_log += "[bicon(I)]" + U.purchase_log += "[icon2base64html(I)]" else if(purchase_log_vis) - U.purchase_log += "[bicon(A)]" + U.purchase_log += "[icon2base64html(A)]" if(limited_stock > 0) limited_stock -= 1 @@ -1394,7 +1394,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. continue crate_value -= I.cost new I.item(C) - U.purchase_log += "[bicon(I.item)]" + U.purchase_log += "[icon2base64html(I.item)]" SSblackbox.add_details("traitor_uplink_items_bought", "[name]|[cost]") return C diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 6f38560b92..8576be384b 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -151,7 +151,7 @@ h1.alert, h2.alert {color: #000000;} .clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} -BIG IMG.icon {width: 32px; height: 32px;} +.icon {height: 1em; width: auto;} .memo {color: #638500; text-align: center;} .memoedit {text-align: center; font-size: 2;} From 0e7b9a008e560c106df44d117b6d8baae4282d81 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 17:54:27 -0500 Subject: [PATCH 057/164] Ports a slightly edited version of Eris APC sprites --- apc_repair.dmi | Bin 0 -> 627 bytes code/modules/power/apc.dm | 4 ++-- icons/obj/power.dmi | Bin 35764 -> 36328 bytes icons/obj/wallframe.dmi | Bin 979 -> 1059 bytes power.dmi | Bin 0 -> 1782 bytes 5 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 apc_repair.dmi create mode 100644 power.dmi diff --git a/apc_repair.dmi b/apc_repair.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6e861eef61bfd13f6194a65b44410560672ced2d GIT binary patch literal 627 zcmV-(0*w8MP)W=qlarZKQ&SHQ4=*k*R##RR7Z)QVBPb{+LPA1gV`FO= z7O5s9z`(#;NDpmN3fW0U7CmbtPpKQON3H+>00DGTPE!Ct=GbNc0047(R9JLGWpiV4 zX>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33t zGfE(w;*!LYR3K9+u^`z%iHkEOv#1!zHRR$$p}NoJ^{cH6O_)f6U<~2K=bxUlL$Eel1ct*hW2ibGZ-n*6F>S@Q^13?1*F)Z|?1)TFzPm-tXD?LyCJ?H#CNCJBP7X_vH zUlf$)e~B>vN5al^yTHsSH#2GkQr^O5l(M!?@ENup3F20ppp8@~u;cNzI)RNCCGYp` zf+br8Vg7%)@>O#)2;BVtc3&@5bJMebZbEz#D-MkU9;g>oeYTt&f**u=9A4~N-h%)D N002ovPDHLkV1k1O4M+e0 literal 0 HcmV?d00001 diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index e36c639eb9..aec4bb82ea 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -120,8 +120,8 @@ if(auto_name) name = "\improper [get_area(src)] APC" - pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -24) - pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 24 : -24) : 0 + pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -25) + pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 23 : -24) : 0 if (building) area = get_area(src) opened = 1 diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index f3b2233283db7530bc69bff95f26986dd5ff4dfa..6b2ae5535153f3404d30a653b05a81f6027872f7 100644 GIT binary patch literal 36328 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 V<(D5j#Q7P3z|+;wWt~$(696vg+pz!u literal 35764 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 diff --git a/icons/obj/wallframe.dmi b/icons/obj/wallframe.dmi index 0e416cac77708215cfd415d4a064d24e04dafba4..70149901e33acdf8a077fe7f7b4b2850bc183d0c 100644 GIT binary patch delta 960 zcmV;x13&!J2crm(B!AdYOjJd{z`!v)MNumAb# z^yShgCoIajrQ*=M|N8Lx=+V=-0C=2@&$|wTFbsv^ zIev-=_NuqFO9iSJ;2qN75)U|4YzmLxs7T!^x}9J8mQ&hmeQP>fwGF&52}QOSd*1EA z%+zbhaXNwtNJG#yM4e)ug?st}OixL29l(D)k{fZ|Uvr;SBX2TXlz5m(0;WyOIE#0p ze^BDAd>ntl($-z|IsXRZk4q9)8Qs_b00LV{L_t(oh3%DVcbY&Dh6A`LD3MZItwpJ; zCXH!MTrq0#5^Zh!|Nl{Exkb$Yg+f2{@ZfR%AoHAeW?8PT{u_i#@)n3vwKJkf7>O<0uJ&ObM#0T372FMM)B5OQ2S(a--3Z8=9unFhNMh1a)6<-E3k4 ziM)_4K_JkZZ!|<88bJW>N8WStkG@bD4Ctj` z7|@GP5Fs!OE*OnQlyU)*U^w2|BfkLzB#a*%ujq;Z0000w6q=`9+9mo15;B|k=H7J;yC!{00001bW%=J06^y0W&i*Hp?XwU zbVOxyV{&P5bZKvH004NLjgY+#f-n?D=k_TYSc#$F;NoH+hC$w;!j;~Emh@i4$G84O zC!*VTl5>_XRfqc6w5mEa@(O{_JGEEaO)kZPJ=+LnA%z7TEWd!*FvOXdsY|5jF;FCb zEyX365#HN+rpZ4Fy~~O+)8FhoGkdpIel)l-x?x7L5Pr%I7U~S~A1bZ+%I=Wa_=LoZPN;E12H?9i^&f0EMeoMr zhH#bO#`^@#;7EV~!I-v>zoY`UqoDj!p5Sv=L3I=R;so6VlLCq0wsFWOyX{cBXGSRn^a{}V8aP8LR|3h z`1J711?R^R7hI6wJA72+37(n~aKU{}li-EYAjn|}1OmST7FbO1VtXERT$h4pfj|fv z=Jlz;7A0sLvQ#iCFpTD-Sah3z${5sWyvTISa<3U}1s7rRUtYd-2ppr1dO=T5k8Tc6 z6`Jbf3M~d&|L|z4!w}H=uN-R7BzP@=1mP))1tE!I5++GP7<5fq8zh1#j^gl*kQsxJ zx4CLTyoeX!oXmbOW@N5B0jP002ovPDHLk FV1kyuoWKA8 diff --git a/power.dmi b/power.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d0066b96de9d090771f9ec0a7338144bbdb839cd GIT binary patch literal 1782 zcmYk52{aqn8po5?J_u6FP^F_vZEeTW7EQ@m$~N}pv2lB(Sht!hgUaw1wPUNS97BzZB*nRm~*_xpYS@0{=c?>+aH1^9bws2QpO z000f2s~$n}$U2-VN9C)npz)PF^acD4?kOuOI`8T|JUmui-EjJheNbo|2n51l^6f&f z`uh52W@fOw(U8J%C=}XEnTxzJnOi>vfd*mi?Ch|C4aCsC-^PaiPu z-?~&5;!+;wL5jxomF_d5WHQVQ}l7O>Qf@hDT)&2xzcdU}@= zTTjckX?1pXmNz?VXBQe4YH4X19UYyJkdPFl_Rhy^jc^+43xcyxoxy3IJEnrQ25go5 zxmjICKZR2n*>16QKiDdb&-c{-V$&HhAuTo16iSEdgI}IOKUrBo4lXORpc3d^-3`uPoKm&cT)@MvLaEs0dt#|}T5Z5EGu_#dEE46T zq;?#JQc_bOZb$W(dq{PC@lDRxWjXZ9|;=S1gB%AZA#BgZ;T@A zM|>g{%(Db@=Jc7x%=a=`L^Vxo%yjwf`rqAF@x<;Hm{uRkY>A4WQ;}aXz^t=uOSP*q zC;jOR0jRfsm#(`h#G4ne#KmFaO0=(oSq2lke$M9NF?R#6Pe-a&^o}QJGEzI#Zm}1A*2h>i5Z`~{O1gJ2A;g1TRlQ12D)xeLs=EiRcIO%NXA=!{GH!ZKA8|dn zxD=P>LjK^A^O(na7xR_1Lng-AQTLu$&^qWA4EgyHtiM1*nlL!}5>^A-!W%HG8l56b zlAHNHNZxTP@_#<<{Dm`z2>RVN0HCh3gPZA!pXH*kpMQsK3EJExSDvh(QF^GGQBDM- z{9s6LQ^zB9A#q@+ciLnyNO7CBB}Dq>d@oy&jBw&_G?&!A$;8;A`(JLPyl;eciI+C8 ze#X9cXCHemY8pyL9Wj#klbanu&(YvF2)62}cDhc4GC4n5c`016qp!bwf!|fLJ1<@4 zpOwQ&a{5Q1;L@V^g&zKT?ub-C;=AwQZhxMuAL3Yv$|dnGoD!yxn8-U3=s?SN!VZk^ zk_VBETI}O{ifPReQf8;$Ss(!W9U=Ca>;U!pNL(-Z_}U5b3nS&NTT4rvZkZ68gHMFe2pzl=58dc%vGVf&K(rQ0XA`OK--vZ)j2oh5<0<{J5J8aZ{5&`=@UQRW@e`kR2+z`57Dq0My zq>NKIlr=y%#1cna56KZAI2GZ)aKTiug=~)Gjx02tKdp(Neuz4d7rI2{s_g|C#*|-` zq4{bd;F#UqK}05|!BID72%4>wG~g=JiN Date: Sun, 13 Aug 2017 18:00:36 -0500 Subject: [PATCH 058/164] Fixes turf slipping --- code/game/turfs/open.dm | 1 + code/game/turfs/simulated/chasm.dm | 1 + code/game/turfs/space/transit.dm | 1 + code/game/turfs/turf.dm | 1 + 4 files changed, 4 insertions(+) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 82ff907a04..a990530056 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -18,6 +18,7 @@ var/sound /turf/open/indestructible/sound/Entered(var/mob/AM) + ..() if(istype(AM)) playsound(src,sound,50,1) diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 968e782984..a51240c969 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -22,6 +22,7 @@ return /turf/open/chasm/Entered(atom/movable/AM) + ..() START_PROCESSING(SSobj, src) drop_stuff(AM) diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index c7e6973c4d..b877fa9eac 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -25,6 +25,7 @@ dir = EAST /turf/open/space/transit/Entered(atom/movable/AM, atom/OldLoc) + ..() if(!locate(/obj/structure/lattice) in src) throw_atom(AM) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index b204406d05..4342d12714 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -160,6 +160,7 @@ return TRUE //Nothing found to block so return success! /turf/Entered(atom/movable/AM) + ..() if(explosion_level && AM.ex_check(explosion_id)) AM.ex_act(explosion_level) From 16428315aa6af839e82632cac562940c5610d8e9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 18:01:40 -0500 Subject: [PATCH 059/164] Merges the two turf/Entereds --- code/game/turfs/turf.dm.rej | 13 +++++++++++++ code/modules/lighting/lighting_turf.dm | 8 -------- 2 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 code/game/turfs/turf.dm.rej diff --git a/code/game/turfs/turf.dm.rej b/code/game/turfs/turf.dm.rej new file mode 100644 index 0000000000..1c4472c18a --- /dev/null +++ b/code/game/turfs/turf.dm.rej @@ -0,0 +1,13 @@ +diff a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm (rejected hunks) +@@ -163,6 +163,11 @@ + if(explosion_level && AM.ex_check(explosion_id)) + AM.ex_act(explosion_level) + ++ // If an opaque movable atom moves around we need to potentially update visibility. ++ if (AM.opacity) ++ has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case. ++ reconsider_lights() ++ + /turf/open/Entered(atom/movable/AM) + ..() + //melting diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index 3aca57c4bf..fc03cfb8c0 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -95,14 +95,6 @@ has_opaque_atom = TRUE break -// If an opaque movable atom moves around we need to potentially update visibility. -/turf/Entered(var/atom/movable/Obj, var/atom/OldLoc) - . = ..() - - if (Obj && Obj.opacity) - has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case. - reconsider_lights() - /turf/Exited(var/atom/movable/Obj, var/atom/newloc) . = ..() From 7aa960b4997d2d10805d8e36ac0e123dc2ef26d3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 01:23:57 -0500 Subject: [PATCH 060/164] Fixes a typo in the blobbernaut spawn text --- code/game/gamemodes/blob/powers.dm.rej | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 code/game/gamemodes/blob/powers.dm.rej diff --git a/code/game/gamemodes/blob/powers.dm.rej b/code/game/gamemodes/blob/powers.dm.rej new file mode 100644 index 0000000000..27dc764a75 --- /dev/null +++ b/code/game/gamemodes/blob/powers.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm (rejected hunks) +@@ -175,7 +175,7 @@ + SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg')) + to_chat(blobber, "You are a blobbernaut!") + to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed.") +- to_chat(blobber, "You can communicate with other blobbernauts and GLOB.overminds via :b") ++ to_chat(blobber, "You can communicate with other blobbernauts and overminds via :b") + to_chat(blobber, "Your overmind's blob reagent is: [blob_reagent_datum.name]!") + to_chat(blobber, "The [blob_reagent_datum.name] reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]") + if(blobber) From 726ffe1fdd8698d01e960979a269c582be869bde Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 01:25:02 -0500 Subject: [PATCH 061/164] Tweaks atmos canister lights. --- .../atmospherics/machinery/portable/canister.dm | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index d733dfc3fb..a45536430a 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -189,8 +189,9 @@ #define CONNECTED 2 #define EMPTY 4 #define LOW 8 -#define FULL 16 -#define DANGER 32 +#define MEDIUM 16 +#define FULL 32 +#define DANGER 64 /obj/machinery/portable_atmospherics/canister/update_icon() if(stat & BROKEN) cut_overlays() @@ -207,9 +208,11 @@ var/pressure = air_contents.return_pressure() if(pressure < 10) update |= EMPTY - else if(pressure < ONE_ATMOSPHERE) + else if(pressure < 5 * ONE_ATMOSPHERE) update |= LOW - else if(pressure < 15 * ONE_ATMOSPHERE) + else if(pressure < 10 * ONE_ATMOSPHERE) + update |= MEDIUM + else if(pressure < 40 * ONE_ATMOSPHERE) update |= FULL else update |= DANGER @@ -222,9 +225,9 @@ add_overlay("can-open") if(update & CONNECTED) add_overlay("can-connector") - if(update & EMPTY) + if(update & LOW) add_overlay("can-o0") - else if(update & LOW) + else if(update & MEDIUM) add_overlay("can-o1") else if(update & FULL) add_overlay("can-o2") @@ -234,6 +237,7 @@ #undef CONNECTED #undef EMPTY #undef LOW +#undef MEDIUM #undef FULL #undef DANGER From 7fe8dd208d96448ea18e906fd623142f8e15d104 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 02:44:24 -0500 Subject: [PATCH 062/164] [s] Clean up some inputs --- code/game/gamemodes/miniantags/bot_swarm/swarmer.dm | 2 +- code/game/machinery/computer/card.dm | 1 - code/game/machinery/computer/message.dm | 2 +- code/modules/cargo/console.dm | 2 +- .../modular_computers/file_system/programs/ntnrc_client.dm | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 68ed9abd35..c24ab53ef5 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -654,7 +654,7 @@ to_chat(M, "[link] [rendered]") /mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers() - var/message = input(src, "Announce to other swarmers", "Swarmer contact") + var/message = stripped_input(src, "Announce to other swarmers", "Swarmer contact") // TODO get swarmers their own colour rather than just boldtext if(message) swarmer_chat(message) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index a54ab19907..7330f2d072 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -473,7 +473,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if ("reg") if (authenticated) var/t2 = modify - //var/t1 = input(usr, "What name?", "ID computer", null) as text if ((authenticated && modify == t2 && (in_range(src, usr) || issilicon(usr)) && isturf(loc))) var/newName = reject_bad_name(href_list["reg"]) if(newName) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 26a7d3b729..18d86b71cf 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -309,7 +309,7 @@ message = noserver else if(auth) - var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) + var/dkey = trim(stripped_input(usr, "Please enter the decryption key.")) if(dkey && dkey != "") if(src.linkedServer.decryptkey == dkey) var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):")) diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 15117c1cbb..1cf215b9f2 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -145,7 +145,7 @@ var/reason = "" if(requestonly) - reason = input("Reason:", name, "") as text|null + reason = stripped_input("Reason:", name, "") as text|null if(isnull(reason) || ..()) return diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index f200fbf747..10a6deb63d 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -110,7 +110,7 @@ if(!channel) return var/mob/living/user = usr - var/logname = input(user,"Enter desired logfile name (.log) or leave blank to cancel:") + var/logname = stripped_input(user,"Enter desired logfile name (.log) or leave blank to cancel:") if(!logname || !channel) return 1 var/datum/computer_file/data/logfile = new/datum/computer_file/data/logfile() From f840a18a9aeab00d5f2af74fc4ea495874b4b978 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 02:59:42 -0500 Subject: [PATCH 063/164] Fix compile warning --- code/modules/cargo/console.dm.rej | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 code/modules/cargo/console.dm.rej diff --git a/code/modules/cargo/console.dm.rej b/code/modules/cargo/console.dm.rej new file mode 100644 index 0000000000..e8798f179a --- /dev/null +++ b/code/modules/cargo/console.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm (rejected hunks) +@@ -145,7 +145,7 @@ + + var/reason = "" + if(requestonly) +- reason = stripped_input("Reason:", name, "") as text|null ++ reason = stripped_input("Reason:", name, "") + if(isnull(reason) || ..()) + return + From e986657b164fc3024ee57158b47cf22a8e7ea6c9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 06:25:03 -0500 Subject: [PATCH 064/164] Makes mulligan antag check for gamemode required players --- code/game/gamemodes/game_mode.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 2a0cd230d5..790319e362 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -120,7 +120,7 @@ var/list/datum/game_mode/runnable_modes = config.get_runnable_midround_modes(living_crew.len) var/list/datum/game_mode/usable_modes = list() for(var/datum/game_mode/G in runnable_modes) - if(G.reroll_friendly) + if(G.reroll_friendly && living_crew >= G.required_players) usable_modes += G else qdel(G) From 2476d59be6b0972a058e222d3d75ca4dbbe7657b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 06:54:44 -0500 Subject: [PATCH 065/164] Makes the ahelp topic give the permissions warning --- code/modules/admin/topic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 818b0d6f09..81925756fb 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -6,7 +6,7 @@ log_admin("[key_name(usr)] tried to use the admin panel without authorization.") return if(href_list["ahelp"]) - if(!check_rights(R_ADMIN)) + if(!check_rights(R_ADMIN, TRUE)) return var/ahelp_ref = href_list["ahelp"] From c73e58d5874cf06809a9ad5bc506388c983746e7 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 08:19:27 -0500 Subject: [PATCH 066/164] Revert "[MIRROR] The wiki button now asks what page you want to be taken to" --- interface/interface.dm | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/interface/interface.dm b/interface/interface.dm index 64e39587ce..253738064b 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -1,14 +1,12 @@ //Please use mob or src (not usr) in these procs. This way they can be called in the same fashion as procs. -/client/verb/wiki(query as text | null) +/client/verb/wiki() set name = "wiki" - set desc = "Type what you want to know about. This will open the wiki on your web browser. Type nothing to go to the main page." + set desc = "Visit the wiki." set hidden = 1 if(config.wikiurl) - if(query) - var/output = config.wikiurl + "/index.php?title=Special%3ASearch&profile=default&search=" + query - src << link(output) - else if (query != null) - src << link(config.wikiurl) + if(alert("This will open the wiki in your browser. Are you sure?",,"Yes","No")=="No") + return + src << link(config.wikiurl) else to_chat(src, "The wiki URL is not set in the server configuration.") return From b2f93c506b2927d6b999e5f5210c034c5a872559 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 08:20:10 -0500 Subject: [PATCH 067/164] Automatic changelog generation for PR #2359 [ci skip] --- html/changelogs/AutoChangeLog-pr-2359.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2359.yml diff --git a/html/changelogs/AutoChangeLog-pr-2359.yml b/html/changelogs/AutoChangeLog-pr-2359.yml new file mode 100644 index 0000000000..8455963dc6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2359.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - imageadd: "Ported CEV-Eris's APC sprites." From 77ce8f8031254ebda3150763634582d44fcf7df6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 08:20:58 -0500 Subject: [PATCH 068/164] Automatic changelog generation for PR #2363 [ci skip] --- html/changelogs/AutoChangeLog-pr-2363.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2363.yml diff --git a/html/changelogs/AutoChangeLog-pr-2363.yml b/html/changelogs/AutoChangeLog-pr-2363.yml new file mode 100644 index 0000000000..e8f5b574ae --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2363.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "Canisters don't flash red lights anymore when empty." From 4edf9880d6821cd4b9d6e13e2a7dac1f717f784e Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 08:23:46 -0500 Subject: [PATCH 069/164] Update logging.dm --- code/__DEFINES/logging.dm | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 82d030bf08..24e10a24d1 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -1,15 +1,16 @@ //Investigate logging defines -#define INVESTIGATE_ATMOS "atmos" -#define INVESTIGATE_BOTANY "botany" -#define INVESTIGATE_CARGO "cargo" -#define INVESTIGATE_EXPERIMENTOR "experimentor" -#define INVESTIGATE_GRAVITY "gravity" -#define INVESTIGATE_RECORDS "records" -#define INVESTIGATE_SINGULO "singulo" -#define INVESTIGATE_SUPERMATTER "supermatter" -#define INVESTIGATE_TELESCI "telesci" -#define INVESTIGATE_WIRES "wires" +#define INVESTIGATE_ATMOS "atmos" +#define INVESTIGATE_BOTANY "botany" +#define INVESTIGATE_CARGO "cargo" +#define INVESTIGATE_EXPERIMENTOR "experimentor" +#define INVESTIGATE_GRAVITY "gravity" +#define INVESTIGATE_RECORDS "records" +#define INVESTIGATE_SINGULO "singulo" +#define INVESTIGATE_SUPERMATTER "supermatter" +#define INVESTIGATE_TELESCI "telesci" +#define INVESTIGATE_WIRES "wires" #define INVESTIGATE_PORTAL "portals" +#define INVESTIGATE_HALLUCINATIONS "hallucinations" //Individual logging defines #define INDIVIDUAL_ATTACK_LOG "Attack log" From fdfdd4fc214a81e6edcbe4b8204dfe77eb488bf3 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 08:24:34 -0500 Subject: [PATCH 070/164] Update admin_investigate.dm --- code/modules/admin/admin_investigate.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 54feb11532..2ca0593e8d 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -5,7 +5,7 @@ F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
" -/client/proc/investigate_show(subject in list("hrefs","notes, memos, watchlist", INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY) ) +/client/proc/investigate_show(subject in list("hrefs","notes, memos, watchlist", INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS) ) set name = "Investigate" set category = "Admin" if(!holder) From 80bb075eb3667c0fc24aa03b6d114661b04391b0 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 08:24:58 -0500 Subject: [PATCH 071/164] Update Hallucination.dm.rej --- code/modules/flufftext/Hallucination.dm.rej | 1360 ++++++++++++++++--- 1 file changed, 1151 insertions(+), 209 deletions(-) diff --git a/code/modules/flufftext/Hallucination.dm.rej b/code/modules/flufftext/Hallucination.dm.rej index 78b5d879f2..2b8fe4b064 100644 --- a/code/modules/flufftext/Hallucination.dm.rej +++ b/code/modules/flufftext/Hallucination.dm.rej @@ -1,209 +1,1151 @@ -diff a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm (rejected hunks) -@@ -60,9 +60,14 @@ GLOBAL_LIST_INIT(hallucinations_major, list( - var/halpick = pick(current) - new halpick(src, FALSE) - -+/mob/living/carbon/proc/set_screwyhud(hud_type) -+ hal_screwyhud = hud_type -+ update_health_hud() -+ - /datum/hallucination - var/mob/living/carbon/target - var/cost = 5 //affects the amount of hallucination reduced, and cooldown until the next hallucination -+ var/feedback_details //extra info for investigate - - /datum/hallucination/New(mob/living/carbon/T, forced = TRUE) - set waitfor = 0 -@@ -72,9 +77,13 @@ GLOBAL_LIST_INIT(hallucinations_major, list( - target.next_hallucination = world.time + (rand(cost * 0.5, cost * 3) * 10) - - /datum/hallucination/proc/wake_and_restore() -- target.hal_screwyhud = SCREWYHUD_NONE -+ target.set_screwyhud(SCREWYHUD_NONE) - target.SetSleeping(0) - -+/datum/hallucination/Destroy() -+ target.investigate_log("was afflicted with a hallucination of type [type]. [feedback_details]", INVESTIGATE_HALLUCINATIONS) -+ return ..() -+ - /obj/effect/hallucination - invisibility = INVISIBILITY_OBSERVER - var/mob/living/carbon/target = null -@@ -744,7 +771,9 @@ GLOBAL_LIST_INIT(hallucinations_major, list( - for(var/mob/living/carbon/human/H in GLOB.living_mob_list) - humans += H - person = pick(humans) -- to_chat(target, target.compose_message(person,understood_language,pick(radio_messages),"1459",person.get_spans())) -+ var/message = target.compose_message(person,understood_language,pick(radio_messages),"1459",person.get_spans()) -+ feedback_details += "Type: Radio, Source: [person.real_name], Message: [message]" -+ to_chat(target, message) - qdel(src) - - /datum/hallucination/message -@@ -763,43 +792,48 @@ GLOBAL_LIST_INIT(hallucinations_major, list( - "You're hallucinating.", \ - //Direct advice - "[pick_list_replacements(HAL_LINES_FILE, "advice")]") -+ feedback_details += "Message: [chosen]" - to_chat(target, chosen) - qdel(src) - - /datum/hallucination/sounds - cost = 15 - --/datum/hallucination/sounds/New(mob/living/carbon/T, forced = TRUE) -+/datum/hallucination/sounds/New(mob/living/carbon/T, forced = TRUE, sound_type) - ..() -+ if(!sound_type) -+ sound_type = pick("airlock","explosion","far_explosion","glass","phone","summon_guns","alarm","beepsky","hallelujah","creepy","ratvar","shuttle_dock", -+ "wall_decon","door_hack","esword","blob_alert","tesla","malf_ai") -+ feedback_details += "Type: [sound_type]" - //Strange audio -- switch(rand(1,20)) -- if(1) -+ switch(sound_type) -+ if("airlock") - target.playsound_local(null,'sound/machines/airlock.ogg', 15, 1) -- if(2) -+ if("explosion") - if(prob(50)) - target.playsound_local(null,'sound/effects/explosion1.ogg', 50, 1) - else - target.playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1) -- if(3) -+ if("far_explosion") - target.playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1) -- if(4) -+ if("glass") - target.playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1) -- if(5) -+ if("phone") - target.playsound_local(null, 'sound/weapons/ring.ogg', 35) - sleep(15) - target.playsound_local(null, 'sound/weapons/ring.ogg', 35) - sleep(15) - target.playsound_local(null, 'sound/weapons/ring.ogg', 35) -- if(6) -+ if("summon_guns") - target.playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1) -- if(7) -+ if("alarm") - target.playsound_local(null, 'sound/machines/alarm.ogg', 100, 0) -- if(8) -+ if("beepsky") - target.playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0) -- if(9) -+ if("hallelujah") - target.playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50) - //Rare audio -- if(10) -+ if("creepy") - //These sounds are (mostly) taken from Hidden: Source - var/static/list/hallucinations_creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\ - 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ -@@ -807,42 +841,42 @@ GLOBAL_LIST_INIT(hallucinations_major, list( - 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ - 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') - target.playsound_local(null, pick(hallucinations_creepyasssounds), 50, 1) -- if(11) -+ if("ratvar") - target.playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100) - sleep(150) - target.playsound_local(null, 'sound/effects/ratvar_reveal.ogg', 100) -- if(12) -+ if("shuttle_dock") - to_chat(target, "

Priority Announcement

") - to_chat(target, "

The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

") - target.playsound_local(null, 'sound/ai/shuttledock.ogg', 100) - //Deconstructing a wall -- if(13) -+ if("wall_decon") - target.playsound_local(null, 'sound/items/welder.ogg', 15, 1) - sleep(105) - target.playsound_local(null, 'sound/items/welder2.ogg', 15, 1) - sleep(15) - target.playsound_local(null, 'sound/items/ratchet.ogg', 15, 1) - //Hacking a door -- if(14) -+ if("door_hack") - target.playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1) - sleep(rand(10,30)) - for(var/i = rand(1,3), i>0, i--) - target.playsound_local(null, 'sound/weapons/empty.ogg', 15, 1) - sleep(rand(10,30)) - target.playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1) -- if(15) -+ if("esword") - target.playsound_local(null, 'sound/weapons/saberon.ogg',35,1) -- if(16) -+ if("blob_alert") - to_chat(target, "

Biohazard Alert

") - to_chat(target, "

Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.

") - target.playsound_local(null, 'sound/ai/outbreak5.ogg', 100, 0) -- if(17) //Tesla loose! -+ if("tesla") //Tesla loose! - target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1) - sleep(20) - target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1) - sleep(20) - target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1) -- if(18) //AI is doomsdaying! -+ if("malf_ai") //AI is doomsdaying! - to_chat(target, "

Anomaly Alert

") - to_chat(target, "

Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.

") - target.playsound_local(null, 'sound/ai/aimalf.ogg', 100, 0) -@@ -854,9 +888,10 @@ GLOBAL_LIST_INIT(hallucinations_major, list( - /datum/hallucination/hudscrew/New(mob/living/carbon/T, forced = TRUE) - ..() - //Screwy HUD -- target.hal_screwyhud = pick(SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY) -+ target.set_screwyhud(pick(SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY)) -+ feedback_details += "Type: [target.hal_screwyhud]" - sleep(rand(100,250)) -- target.hal_screwyhud = SCREWYHUD_NONE -+ target.set_screwyhud(SCREWYHUD_NONE) - qdel(src) - - /datum/hallucination/fake_alert -@@ -867,6 +902,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list( - var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temphot","tempcold","pressure") - if(specific) - alert_type = specific -+ feedback_details += "Type: [alert_type]" - switch(alert_type) - if("oxy") - target.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy, override = TRUE) -@@ -962,6 +998,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list( - target.halitem.icon = 'icons/obj/grenade.dmi' - target.halitem.icon_state = "flashbang1" - target.halitem.name = "Flashbang" -+ feedback_details += "Type: [target.halitem.name]" - if(target.client) target.client.screen += target.halitem - QDEL_IN(target.halitem, rand(150, 350)) - qdel(src) -@@ -1006,7 +1043,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list( - /datum/hallucination/death/New(mob/living/carbon/T, forced = TRUE) - set waitfor = 0 - ..() -- target.hal_screwyhud = SCREWYHUD_DEAD -+ target.set_screwyhud(SCREWYHUD_DEAD) - target.Knockdown(300) - target.silent += 10 - var/area/area = get_area(target) -@@ -1025,7 +1062,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list( - to_chat(target, "DEAD: [fakemob.name] says, \"[pick("rip","hey [target.first_name()]","you too?","is the AI rogue?",\ - "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\"") - sleep(rand(70,90)) -- target.hal_screwyhud = SCREWYHUD_NONE -+ target.set_screwyhud(SCREWYHUD_NONE) - target.SetKnockdown(0) - target.silent = 0 - qdel(src) -@@ -1100,6 +1137,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list( - startlocs += T - var/turf/start = pick(startlocs) - var/proj_type = pick(subtypesof(/obj/item/projectile/hallucination)) -+ feedback_details += "Type: [proj_type]" - var/obj/item/projectile/hallucination/H = new proj_type(start) - target.playsound_local(start, H.hal_fire_sound, 60, 1) - H.hal_target = target +/* +Ideas for the subtle effects of hallucination: + +Light up oxygen/plasma indicators (done) +Cause health to look critical/dead, even when standing (done) +Characters silently watching you +Brief flashes of fire/space/bombs/c4/dangerous shit (done) +Items that are rare/traitorous/don't exist appearing in your inventory slots (done) +Strange audio (should be rare) (done) +Gunshots/explosions/opening doors/less rare audio (done) + +*/ + +#define HAL_LINES_FILE "hallucination.json" + +/mob/living/carbon + var/image/halimage + var/image/halbody + var/obj/halitem + var/hal_screwyhud = SCREWYHUD_NONE + var/next_hallucination = 0 + +GLOBAL_LIST_INIT(hallucinations_minor, list( + /datum/hallucination/sounds, + /datum/hallucination/bolts, + /datum/hallucination/whispers, + /datum/hallucination/message, + /datum/hallucination/hudscrew)) + +GLOBAL_LIST_INIT(hallucinations_medium, list( + /datum/hallucination/fake_alert, + /datum/hallucination/items, + /datum/hallucination/items_other, + /datum/hallucination/dangerflash, + /datum/hallucination/bolts, + /datum/hallucination/fake_flood, + /datum/hallucination/husks, + /datum/hallucination/battle, + /datum/hallucination/fire, + /datum/hallucination/self_delusion)) + +GLOBAL_LIST_INIT(hallucinations_major, list( + /datum/hallucination/fakeattacker, + /datum/hallucination/death, + /datum/hallucination/xeno_attack, + /datum/hallucination/singularity_scare, + /datum/hallucination/delusion, + /datum/hallucination/oh_yeah)) + +/mob/living/carbon/proc/handle_hallucinations() + if(world.time < next_hallucination) + return + + if(hallucination) + var/list/current = GLOB.hallucinations_minor + if(prob(25) && hallucination > 100) + current = GLOB.hallucinations_medium + else if(prob(10) && hallucination > 200) + current = GLOB.hallucinations_major + var/halpick = pick(current) + new halpick(src, FALSE) + +/mob/living/carbon/proc/set_screwyhud(hud_type) + hal_screwyhud = hud_type + update_health_hud() + +/datum/hallucination + var/mob/living/carbon/target + var/cost = 5 //affects the amount of hallucination reduced, and cooldown until the next hallucination + var/feedback_details //extra info for investigate + +/datum/hallucination/New(mob/living/carbon/T, forced = TRUE) + set waitfor = 0 + target = T + if(!forced) + target.hallucination = max(0, target.hallucination - cost) + target.next_hallucination = world.time + (rand(cost * 0.5, cost * 3) * 10) + +/datum/hallucination/proc/wake_and_restore() + target.set_screwyhud(SCREWYHUD_NONE) + target.SetSleeping(0) + +/datum/hallucination/Destroy() + target.investigate_log("was afflicted with a hallucination of type [type]. [feedback_details]", INVESTIGATE_HALLUCINATIONS) + return ..() + +/obj/effect/hallucination + invisibility = INVISIBILITY_OBSERVER + var/mob/living/carbon/target = null + +/obj/effect/hallucination/simple + var/image_icon = 'icons/mob/alien.dmi' + var/image_state = "alienh_pounce" + var/px = 0 + var/py = 0 + var/col_mod = null + var/image/current_image = null + var/image_layer = MOB_LAYER + var/active = TRUE //qdelery + +/obj/effect/hallucination/simple/Initialize(mapload, var/mob/living/carbon/T) + ..() + target = T + current_image = GetImage() + if(target.client) + target.client.images |= current_image + +/obj/effect/hallucination/simple/proc/GetImage() + var/image/I = image(image_icon,src,image_state,image_layer,dir=src.dir) + I.pixel_x = px + I.pixel_y = py + if(col_mod) + I.color = col_mod + return I + +/obj/effect/hallucination/simple/proc/Show(update=1) + if(active) + if(target.client) + target.client.images.Remove(current_image) + if(update) + current_image = GetImage() + if(target.client) + target.client.images |= current_image + +/obj/effect/hallucination/simple/update_icon(new_state,new_icon,new_px=0,new_py=0) + image_state = new_state + if(new_icon) + image_icon = new_icon + else + image_icon = initial(image_icon) + px = new_px + py = new_py + Show() + +/obj/effect/hallucination/simple/Moved(atom/OldLoc, Dir) + Show() + +/obj/effect/hallucination/simple/Destroy() + if(target.client) + target.client.images.Remove(current_image) + active = FALSE + return ..() + +#define FAKE_FLOOD_EXPAND_TIME 20 +#define FAKE_FLOOD_MAX_RADIUS 10 + +/datum/hallucination/fake_flood + //Plasma starts flooding from the nearby vent + var/turf/center + var/list/flood_images = list() + var/list/turf/flood_turfs = list() + var/image_icon = 'icons/effects/tile_effects.dmi' + var/image_state = "plasma" + var/radius = 0 + var/next_expand = 0 + cost = 25 + +/datum/hallucination/fake_flood/New(mob/living/carbon/T, forced = TRUE) + ..() + for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) + if(!U.welded) + center = get_turf(U) + break + feedback_details += "Vent Coords: [center.x],[center.y],[center.z]" + flood_images += image(image_icon,center,image_state,MOB_LAYER) + flood_turfs += center + if(target.client) target.client.images |= flood_images + next_expand = world.time + FAKE_FLOOD_EXPAND_TIME + START_PROCESSING(SSobj, src) + +/datum/hallucination/fake_flood/process() + if(next_expand <= world.time) + radius++ + if(radius > FAKE_FLOOD_MAX_RADIUS) + qdel(src) + return + Expand() + if((get_turf(target) in flood_turfs) && !target.internal) + new /datum/hallucination/fake_alert(target, TRUE, "tox_in_air") + next_expand = world.time + FAKE_FLOOD_EXPAND_TIME + +/datum/hallucination/fake_flood/proc/Expand() + for(var/turf/FT in flood_turfs) + for(var/dir in GLOB.cardinals) + var/turf/T = get_step(FT, dir) + if((T in flood_turfs) || !FT.CanAtmosPass(T)) + continue + flood_images += image(image_icon,T,image_state,MOB_LAYER) + flood_turfs += T + if(target.client) + target.client.images |= flood_images + +/datum/hallucination/fake_flood/Destroy() + STOP_PROCESSING(SSobj, src) + qdel(flood_turfs) + flood_turfs = list() + if(target.client) + target.client.images.Remove(flood_images) + target = null + qdel(flood_images) + flood_images = list() + return ..() + +/obj/effect/hallucination/simple/xeno + image_icon = 'icons/mob/alien.dmi' + image_state = "alienh_pounce" + +/obj/effect/hallucination/simple/xeno/Initialize(mapload, mob/living/carbon/T) + ..() + name = "alien hunter ([rand(1, 1000)])" + +/obj/effect/hallucination/simple/xeno/throw_impact(A) + update_icon("alienh_pounce") + if(A == target && target.stat!=DEAD) + target.Knockdown(100) + target.visible_message("[target] flails around wildly.","[name] pounces on you!") + +/datum/hallucination/xeno_attack + //Xeno crawls from nearby vent,jumps at you, and goes back in + var/obj/machinery/atmospherics/components/unary/vent_pump/pump = null + var/obj/effect/hallucination/simple/xeno/xeno = null + cost = 25 + +/datum/hallucination/xeno_attack/New(mob/living/carbon/T, forced = TRUE) + ..() + for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) + if(!U.welded) + pump = U + break + feedback_details += "Vent Coords: [pump.x],[pump.y],[pump.z]" + if(pump) + xeno = new(pump.loc,target) + sleep(10) + xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) + xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1) + sleep(10) + xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) + xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1) + sleep(10) + var/xeno_name = xeno.name + to_chat(target, "[xeno_name] begins climbing into the ventilation system...") + sleep(30) + qdel(xeno) + to_chat(target, "[xeno_name] scrambles into the ventilation ducts!") + qdel(src) + +/obj/effect/hallucination/simple/clown + image_icon = 'icons/mob/animal.dmi' + image_state = "clown" + +/obj/effect/hallucination/simple/clown/Initialize(mapload, mob/living/carbon/T, duration) + ..(loc, T) + name = pick(GLOB.clown_names) + QDEL_IN(src,duration) + +/obj/effect/hallucination/simple/clown/scary + image_state = "scary_clown" + +/obj/effect/hallucination/simple/bubblegum + name = "Bubblegum" + image_icon = 'icons/mob/lavaland/96x96megafauna.dmi' + image_state = "bubblegum" + px = -32 + +/datum/hallucination/oh_yeah + var/obj/effect/hallucination/simple/bubblegum/bubblegum + var/image/fakebroken + var/image/fakerune + cost = 75 + +/datum/hallucination/oh_yeah/New(mob/living/carbon/T, forced = TRUE) + . = ..() + var/turf/closed/wall/wall + for(var/turf/closed/wall/W in range(7,target)) + wall = W + break + if(!wall) + return INITIALIZE_HINT_QDEL + feedback_details += "Source: [wall.x],[wall.y],[wall.z]" + + fakebroken = image('icons/turf/floors.dmi', wall, "plating", layer = TURF_LAYER) + var/turf/landing = get_turf(target) + var/turf/landing_image_turf = get_step(landing, SOUTHWEST) //the icon is 3x3 + fakerune = image('icons/effects/96x96.dmi', landing_image_turf, "landing", layer = ABOVE_OPEN_TURF_LAYER) + fakebroken.override = TRUE + if(target.client) + target.client.images |= fakebroken + target.client.images |= fakerune + target.playsound_local(wall,'sound/effects/meteorimpact.ogg', 150, 1) + bubblegum = new(wall, target) + addtimer(CALLBACK(src, .proc/bubble_attack, landing), 10) + +/datum/hallucination/oh_yeah/proc/bubble_attack(turf/landing) + var/charged = FALSE //only get hit once + while(get_turf(bubblegum) != landing && target && target.stat != DEAD) + bubblegum.forceMove(get_step_towards(bubblegum, landing)) + bubblegum.setDir(get_dir(bubblegum, landing)) + target.playsound_local(get_turf(bubblegum), 'sound/effects/meteorimpact.ogg', 150, 1) + shake_camera(target, 2, 1) + if(bubblegum.Adjacent(target) && !charged) + charged = TRUE + target.Knockdown(80) + target.adjustStaminaLoss(40) + step_away(target, bubblegum) + shake_camera(target, 4, 3) + target.visible_message("[target] jumps backwards, falling on the ground!","[bubblegum] slams into you!") + sleep(2) + sleep(30) + qdel(src) + +/datum/hallucination/oh_yeah/Destroy() + if(target.client) + target.client.images.Remove(fakebroken) + target.client.images.Remove(fakerune) + QDEL_NULL(fakebroken) + QDEL_NULL(fakerune) + QDEL_NULL(bubblegum) + return ..() + +/datum/hallucination/singularity_scare + //Singularity moving towards you. + //todo Hide where it moved with fake space images + var/obj/effect/hallucination/simple/singularity/s = null + cost = 75 + +/datum/hallucination/singularity_scare/New(mob/living/carbon/T, forced = TRUE) + ..() + var/turf/start = get_turf(T) + var/screen_border = pick(SOUTH,EAST,WEST,NORTH) + for(var/i in 1 to 13) + start = get_step(start,screen_border) + feedback_details += "Source: [start.x],[start.y],[start.z]" + s = new(start,target) + s.parent = src + for(var/i in 1 to 13) + sleep(10) + s.forceMove(get_step(get_turf(s),get_dir(s,target))) + s.Show() + s.Eat() + qdel(s) + +/obj/effect/hallucination/simple/singularity + image_icon = 'icons/effects/224x224.dmi' + image_state = "singularity_s7" + image_layer = MASSIVE_OBJ_LAYER + px = -96 + py = -96 + var/datum/hallucination/singularity_scare/parent + +/obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir) + var/target_dist = get_dist(src,target) + if(target_dist<=3) //"Eaten" + target.set_screwyhud(SCREWYHUD_DEAD) + target.SetUnconscious(160) + addtimer(CALLBACK(parent, /datum/hallucination/.proc/wake_and_restore), rand(30, 50)) + +/datum/hallucination/battle + cost = 15 + +/datum/hallucination/battle/New(mob/living/carbon/T, forced = TRUE, battle_type) + ..() + var/hits = rand(3,6) + if(!battle_type) + battle_type = pick("laser","esword","gun","stunprod","bomb") + feedback_details += "Type: [battle_type]" + switch(battle_type) + if("laser") //Laser fight + for(var/i in 1 to hits) + target.playsound_local(null, 'sound/weapons/laser.ogg', 25, 1) + if(prob(50)) + addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/sear.ogg', 25, 1), rand(10,20)) + else + addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(10,20)) + sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8)) + target.playsound_local(null, get_sfx("bodyfall"), 25, 1) + if("esword") //Esword fight + target.playsound_local(null, 'sound/weapons/saberon.ogg',15, 1) + for(var/i=0,i...wabbajack...wabbajack...") + target.playsound_local(target,'sound/magic/staff_change.ogg', 50, 1) + delusion = A + target.client.images |= A + QDEL_IN(src, duration) + +/datum/hallucination/self_delusion/Destroy() + if(target.client) + target.client.images.Remove(delusion) + return ..() + +/datum/hallucination/fakeattacker/New(mob/living/carbon/T, forced = TRUE) + ..() + var/mob/living/carbon/human/clone = null + var/clone_weapon = null + + for(var/mob/living/carbon/human/H in GLOB.living_mob_list) + if(H.stat || H.lying) + continue + clone = H + feedback_details += "Clone of: [H.real_name]" + break + + if(!clone) + return + + var/static/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/ballistic, /obj/item/ammo_box/a357,\ + /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow, /obj/item/weapon/melee/transforming/energy/sword/saber,\ + /obj/item/weapon/storage/box/syndicate, /obj/item/weapon/storage/box/emps,\ + /obj/item/weapon/cartridge/virus/syndicate, /obj/item/clothing/under/chameleon,\ + /obj/item/clothing/shoes/chameleon, /obj/item/weapon/card/id/syndicate,\ + /obj/item/clothing/mask/chameleon, /obj/item/clothing/glasses/thermal,\ + /obj/item/device/chameleon, /obj/item/weapon/card/emag, /obj/item/weapon/grenade/plastic/x4,\ + /obj/item/weapon/storage/toolbox/syndicate, /obj/item/weapon/aiModule,\ + /obj/item/device/radio/headset/syndicate, /obj/item/weapon/grenade/plastic/c4,\ + /obj/item/device/powersink, /obj/item/weapon/storage/box/syndie_kit,\ + /obj/item/toy/syndicateballoon, /obj/item/weapon/gun/energy/laser/captain,\ + /obj/item/weapon/hand_tele, /obj/item/weapon/construction/rcd, /obj/item/weapon/tank/jetpack,\ + /obj/item/clothing/under/rank/captain, /obj/item/device/aicard,\ + /obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/weapon/disk/nuclear,\ + /obj/item/clothing/suit/space/nasavoid, /obj/item/weapon/tank) + + var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(get_turf(target),target) + + for(var/obj/item/I in clone.held_items) + if(!(locate(I) in non_fakeattack_weapons)) + clone_weapon = I.name + F.weap = I + + F.name = clone.name + F.my_target = target + F.weapon_name = clone_weapon + + F.left = image(clone,dir = WEST) + F.right = image(clone,dir = EAST) + F.up = image(clone,dir = NORTH) + F.down = image(clone,dir = SOUTH) + + F.updateimage() + qdel(src) + +/obj/effect/fake_attacker + icon = null + icon_state = null + name = "" + desc = "" + density = FALSE + anchored = TRUE + opacity = 0 + var/mob/living/carbon/human/my_target = null + var/weapon_name = null + var/obj/item/weap = null + var/image/stand_icon = null + var/image/currentimage = null + var/icon/base = null + var/skin_tone + var/mob/living/clone = null + var/image/left + var/image/right + var/image/up + var/collapse + var/image/down + + max_integrity = 100 + +/obj/effect/fake_attacker/attackby(obj/item/weapon/P, mob/living/user, params) + step_away(src,my_target,2) + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + my_target.playsound_local(src, P.hitsound, 1) + my_target.visible_message("[my_target] flails around wildly.", \ + "[my_target] has attacked [src]!") + + obj_integrity -= P.force + +/obj/effect/fake_attacker/Crossed(mob/M, somenumber) + if(M == my_target) + step_away(src,my_target,2) + if(prob(30)) + for(var/mob/O in oviewers(world.view , my_target)) + to_chat(O, "[my_target] stumbles around.") + +/obj/effect/fake_attacker/Initialize(mapload, mob/living/carbon/T) + ..() + my_target = T + QDEL_IN(src, 300) + step_away(src,my_target,2) + INVOKE_ASYNC(src, .proc/attack_loop) + + +/obj/effect/fake_attacker/proc/updateimage() +// del src.currentimage + if(src.dir == NORTH) + del src.currentimage + src.currentimage = new /image(up,src) + else if(src.dir == SOUTH) + del src.currentimage + src.currentimage = new /image(down,src) + else if(src.dir == EAST) + del src.currentimage + src.currentimage = new /image(right,src) + else if(src.dir == WEST) + del src.currentimage + src.currentimage = new /image(left,src) + SEND_IMAGE(my_target, currentimage) + + +/obj/effect/fake_attacker/proc/attack_loop() + while(1) + sleep(rand(5,10)) + if(obj_integrity < 0 || my_target.stat) + collapse() + continue + if(get_dist(src,my_target) > 1) + src.setDir(get_dir(src,my_target)) + step_towards(src,my_target) + updateimage() + else + if(prob(15)) + if(weapon_name) + my_target.playsound_local(my_target, weap.hitsound, weap.get_clamped_volume(), 1) + my_target.show_message("[src.name] has attacked [my_target] with [weapon_name]!", 1) + my_target.staminaloss += 30 + if(prob(20)) + my_target.blur_eyes(3) + if(prob(33)) + if(!locate(/obj/effect/overlay) in my_target.loc) + fake_blood(my_target) + else + my_target.playsound_local(my_target, pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'), 25, 1) + my_target.show_message("[src.name] has punched [my_target]!", 1) + my_target.staminaloss += 30 + if(prob(33)) + if(!locate(/obj/effect/overlay) in my_target.loc) + fake_blood(my_target) + + if(prob(15)) + step_away(src,my_target,2) + +/obj/effect/fake_attacker/proc/collapse() + collapse = 1 + updateimage() + qdel(src) + +/obj/effect/fake_attacker/proc/fake_blood(mob/target) + var/obj/effect/overlay/O = new/obj/effect/overlay(target.loc) + O.name = "blood" + var/image/I = image('icons/effects/blood.dmi',O,"floor[rand(1,7)]",O.dir,1) + SEND_IMAGE(target, I) + QDEL_IN(O, 300) + + +/datum/hallucination/bolts + var/list/doors = list() + cost = 25 + +/datum/hallucination/bolts/New(mob/living/carbon/T, forced, door_number=-1) //-1 for severe, 1-2 for subtle + ..() + var/image/I = null + var/count = 0 + feedback_details += "Door amount: [door_number]" + for(var/obj/machinery/door/airlock/A in range(7, target)) + if(count>door_number && door_number>0) + break + count++ + I = image(A.overlays_file, get_turf(A), "lights_bolts",layer=A.layer+0.1) + doors += I + if(target.client) + target.client.images |= I + target.playsound_local(get_turf(A), 'sound/machines/boltsdown.ogg',30,0,3) + sleep(rand(6,12)) + sleep(100) + for(var/image/B in doors) + if(target.client) + target.client.images.Remove(B) + target.playsound_local(get_turf(B), 'sound/machines/boltsup.ogg',30,0,3) + sleep(rand(6,12)) + qdel(src) + +/datum/hallucination/whispers + cost = 15 + +/datum/hallucination/whispers/New(mob/living/carbon/T, forced = TRUE) + ..() + var/speak_messages = list("[pick_list_replacements(HAL_LINES_FILE, "suspicion")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "greetings")][target.first_name()]!",\ + "[pick_list_replacements(HAL_LINES_FILE, "getout")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "weird")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "didyouhearthat")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "imatraitor")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "doubt")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "aggressive")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "help")]!!",\ + "[pick_list_replacements(HAL_LINES_FILE, "escape")]",\ + "I'm infected, [pick_list_replacements(HAL_LINES_FILE, "infection_advice")]!") + + var/radio_messages = list("Set [target.first_name()] to arrest!",\ + "[pick_list_replacements(HAL_LINES_FILE, "people")] is [pick_list_replacements(HAL_LINES_FILE, "accusations")]!",\ + "Help!",\ + "[pick_list_replacements(HAL_LINES_FILE, "threat")] in [pick_list_replacements(HAL_LINES_FILE, "location")][prob(50)?"!":"!!"]",\ + "Where's [target.first_name()]?"\ + ,"[pick("C","Ai, c","Someone c","Rec")]all the shuttle!"\ + ,"AI [pick("rogue", "is dead")]!!") + + var/list/mob/living/carbon/people = list() + var/list/mob/living/carbon/person = null + var/datum/language/understood_language = target.get_random_understood_language() + for(var/mob/living/carbon/H in view(target)) + if(H == target) + continue + if(!person) + person = H + else + if(get_dist(target,H)The light burns you!", \ + "You don't feel like yourself.", \ + "You hear something squeezing through the ducts...", \ + "You hear a distant scream.", \ + "You feel invincible, nothing can hurt you!", \ + "You feel a tiny prick!", \ + "[target] sneezes.", \ + //The truth, revealed + "You're hallucinating.", \ + //Direct advice + "[pick_list_replacements(HAL_LINES_FILE, "advice")]") + feedback_details += "Message: [chosen]" + to_chat(target, chosen) + qdel(src) + +/datum/hallucination/sounds + cost = 15 + +/datum/hallucination/sounds/New(mob/living/carbon/T, forced = TRUE, sound_type) + ..() + if(!sound_type) + sound_type = pick("airlock","explosion","far_explosion","glass","phone","summon_guns","alarm","beepsky","hallelujah","creepy","ratvar","shuttle_dock", + "wall_decon","door_hack","esword","blob_alert","tesla","malf_ai") + feedback_details += "Type: [sound_type]" + //Strange audio + switch(sound_type) + if("airlock") + target.playsound_local(null,'sound/machines/airlock.ogg', 15, 1) + if("explosion") + if(prob(50)) + target.playsound_local(null,'sound/effects/explosion1.ogg', 50, 1) + else + target.playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1) + if("far_explosion") + target.playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1) + if("glass") + target.playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1) + if("phone") + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + sleep(15) + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + sleep(15) + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + if("summon_guns") + target.playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1) + if("alarm") + target.playsound_local(null, 'sound/machines/alarm.ogg', 100, 0) + if("beepsky") + target.playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0) + if("hallelujah") + target.playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50) + //Rare audio + if("creepy") + //These sounds are (mostly) taken from Hidden: Source + var/static/list/hallucinations_creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\ + 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ + 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ + 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ + 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') + target.playsound_local(null, pick(hallucinations_creepyasssounds), 50, 1) + if("ratvar") + target.playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100) + sleep(150) + target.playsound_local(null, 'sound/effects/ratvar_reveal.ogg', 100) + if("shuttle_dock") + to_chat(target, "

Priority Announcement

") + to_chat(target, "

The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

") + target.playsound_local(null, 'sound/ai/shuttledock.ogg', 100) + //Deconstructing a wall + if("wall_decon") + target.playsound_local(null, 'sound/items/welder.ogg', 15, 1) + sleep(105) + target.playsound_local(null, 'sound/items/welder2.ogg', 15, 1) + sleep(15) + target.playsound_local(null, 'sound/items/ratchet.ogg', 15, 1) + //Hacking a door + if("door_hack") + target.playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1) + sleep(rand(10,30)) + for(var/i = rand(1,3), i>0, i--) + target.playsound_local(null, 'sound/weapons/empty.ogg', 15, 1) + sleep(rand(10,30)) + target.playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1) + if("esword") + target.playsound_local(null, 'sound/weapons/saberon.ogg',35,1) + if("blob_alert") + to_chat(target, "

Biohazard Alert

") + to_chat(target, "

Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.

") + target.playsound_local(null, 'sound/ai/outbreak5.ogg', 100, 0) + if("tesla") //Tesla loose! + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1) + sleep(20) + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1) + sleep(20) + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1) + if("malf_ai") //AI is doomsdaying! + to_chat(target, "

Anomaly Alert

") + to_chat(target, "

Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.

") + target.playsound_local(null, 'sound/ai/aimalf.ogg', 100, 0) + qdel(src) + +/datum/hallucination/hudscrew + cost = 10 + +/datum/hallucination/hudscrew/New(mob/living/carbon/T, forced = TRUE) + ..() + //Screwy HUD + target.set_screwyhud(pick(SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY)) + feedback_details += "Type: [target.hal_screwyhud]" + sleep(rand(100,250)) + target.set_screwyhud(SCREWYHUD_NONE) + qdel(src) + +/datum/hallucination/fake_alert + cost = 15 + +/datum/hallucination/fake_alert/New(mob/living/carbon/T, forced = TRUE, specific, duration = 150) + ..() + var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temphot","tempcold","pressure") + if(specific) + alert_type = specific + feedback_details += "Type: [alert_type]" + switch(alert_type) + if("oxy") + target.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy, override = TRUE) + if("not_enough_tox") + target.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox, override = TRUE) + if("not_enough_co2") + target.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2, override = TRUE) + if("too_much_oxy") + target.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy, override = TRUE) + if("too_much_co2") + target.throw_alert("too_much_co2", /obj/screen/alert/too_much_co2, override = TRUE) + if("tox_in_air") + target.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox, override = TRUE) + if("nutrition") + if(prob(50)) + target.throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE) + else + target.throw_alert("nutrition", /obj/screen/alert/starving, override = TRUE) + if("weightless") + target.throw_alert("weightless", /obj/screen/alert/weightless, override = TRUE) + if("fire") + target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE) + if("temphot") + target.throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE) + if("tempcold") + target.throw_alert("temp", /obj/screen/alert/cold, 3, override = TRUE) + if("pressure") + if(prob(50)) + target.throw_alert("pressure", /obj/screen/alert/highpressure, 2, override = TRUE) + else + target.throw_alert("pressure", /obj/screen/alert/lowpressure, 2, override = TRUE) + //BEEP BOOP I AM A ROBOT + if("newlaw") + target.throw_alert("newlaw", /obj/screen/alert/newlaw, override = TRUE) + if("locked") + target.throw_alert("locked", /obj/screen/alert/locked, override = TRUE) + if("hacked") + target.throw_alert("hacked", /obj/screen/alert/hacked, override = TRUE) + if("charge") + target.throw_alert("charge",/obj/screen/alert/emptycell, override = TRUE) + sleep(duration) + target.clear_alert(alert_type, clear_override = TRUE) + qdel(src) + +/datum/hallucination/items + cost = 15 + +/datum/hallucination/items/New(mob/living/carbon/T, forced = TRUE) + ..() + //Strange items + if(!target.halitem) + target.halitem = new + var/obj/item/l_hand = target.get_item_for_held_index(1) + var/obj/item/r_hand = target.get_item_for_held_index(2) + var/l = ui_hand_position(target.get_held_index_of_item(l_hand)) + var/r = ui_hand_position(target.get_held_index_of_item(r_hand)) + var/list/slots_free = list(l,r) + if(l_hand) slots_free -= l + if(r_hand) slots_free -= r + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(!H.belt) slots_free += ui_belt + if(!H.l_store) slots_free += ui_storage1 + if(!H.r_store) slots_free += ui_storage2 + if(slots_free.len) + target.halitem.screen_loc = pick(slots_free) + target.halitem.layer = ABOVE_HUD_LAYER + target.halitem.plane = ABOVE_HUD_PLANE + switch(rand(1,6)) + if(1) //revolver + target.halitem.icon = 'icons/obj/guns/projectile.dmi' + target.halitem.icon_state = "revolver" + target.halitem.name = "Revolver" + if(2) //c4 + target.halitem.icon = 'icons/obj/grenade.dmi' + target.halitem.icon_state = "plastic-explosive0" + target.halitem.name = "C4" + if(prob(25)) + target.halitem.icon_state = "plasticx40" + if(3) //sword + target.halitem.icon = 'icons/obj/weapons.dmi' + target.halitem.icon_state = "sword0" + target.halitem.name = "Energy Sword" + if(4) //stun baton + target.halitem.icon = 'icons/obj/weapons.dmi' + target.halitem.icon_state = "stunbaton" + target.halitem.name = "Stun Baton" + if(5) //emag + target.halitem.icon = 'icons/obj/card.dmi' + target.halitem.icon_state = "emag" + target.halitem.name = "Cryptographic Sequencer" + if(6) //flashbang + target.halitem.icon = 'icons/obj/grenade.dmi' + target.halitem.icon_state = "flashbang1" + target.halitem.name = "Flashbang" + feedback_details += "Type: [target.halitem.name]" + if(target.client) target.client.screen += target.halitem + QDEL_IN(target.halitem, rand(150, 350)) + qdel(src) + +/datum/hallucination/dangerflash + cost = 15 + +/datum/hallucination/dangerflash/New(mob/living/carbon/T, forced = TRUE) + ..() + //Flashes of danger + if(!target.halimage) + var/list/possible_points = list() + for(var/turf/open/floor/F in view(target,world.view)) + possible_points += F + if(possible_points.len) + var/turf/open/floor/danger_point = pick(possible_points) + + switch(rand(1,5)) + if(1) + target.halimage = image('icons/turf/space.dmi',danger_point,"[rand(1,25)]",TURF_LAYER) + if(2) + target.halimage = image('icons/turf/floors/lava.dmi',danger_point,"smooth",TURF_LAYER) + if(3) + target.halimage = image('icons/turf/floors/Chasms.dmi',danger_point,"smooth",TURF_LAYER) + if(4) + target.halimage = image('icons/effects/effects.dmi',danger_point,"anom",OBJ_LAYER+0.01) + if(5) + target.halimage = image('icons/effects/effects.dmi',danger_point,"electricity2",OBJ_LAYER+0.01) + + + if(target.client) + target.client.images += target.halimage + sleep(rand(200,450)) + if(target.client) + target.client.images -= target.halimage + QDEL_NULL(target.halimage) + qdel(src) + +/datum/hallucination/death + cost = 40 + +/datum/hallucination/death/New(mob/living/carbon/T, forced = TRUE) + set waitfor = 0 + ..() + target.set_screwyhud(SCREWYHUD_DEAD) + target.Knockdown(300) + target.silent += 10 + var/area/area = get_area(target) + to_chat(target, "[target.mind.name] has died at [area.name].") + if(prob(50)) + var/mob/fakemob + var/list/dead_people = list() + for(var/mob/dead/observer/G in GLOB.player_list) + dead_people += G + if(LAZYLEN(dead_people)) + fakemob = pick(dead_people) + else + fakemob = target //ever been so lonely you had to haunt yourself? + if(fakemob) + sleep(rand(20, 50)) + to_chat(target, "DEAD: [fakemob.name] says, \"[pick("rip","hey [target.first_name()]","you too?","is the AI rogue?",\ + "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\"") + sleep(rand(70,90)) + target.set_screwyhud(SCREWYHUD_NONE) + target.SetKnockdown(0) + target.silent = 0 + qdel(src) + +/datum/hallucination/fire + cost = 25 + +/datum/hallucination/fire/New(mob/living/carbon/T, forced = TRUE) + ..() + var/image/fire_overlay = image('icons/mob/OnFire.dmi', target, "Standing", ABOVE_MOB_LAYER) + if(target.client) + target.client.images += fire_overlay + to_chat(target, "You're set on fire!") + target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE) + sleep(20) + target.throw_alert("temp", /obj/screen/alert/hot, 1, override = TRUE) + sleep(30) + target.clear_alert("temp", clear_override = TRUE) + target.throw_alert("temp", /obj/screen/alert/hot, 2, override = TRUE) + sleep(30) + target.clear_alert("temp", clear_override = TRUE) + target.throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE) + for(var/i in 1 to rand(5, 10)) + target.adjustStaminaLoss(15) + sleep(25) + target.clear_alert("fire", clear_override = TRUE) + target.clear_alert("temp", clear_override = TRUE) + if(target.client) + target.client.images -= fire_overlay + QDEL_NULL(fire_overlay) + qdel(src) + +/datum/hallucination/husks + cost = 20 + +/datum/hallucination/husks/New(mob/living/carbon/T, forced = TRUE) + ..() + if(!target.halbody) + var/list/possible_points = list() + for(var/turf/open/floor/F in view(target,world.view)) + possible_points += F + if(possible_points.len) + var/turf/open/floor/husk_point = pick(possible_points) + switch(rand(1,4)) + if(1) + var/image/body = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER) + var/matrix/M = matrix() + M.Turn(90) + body.transform = M + target.halbody = body + if(2,3) + target.halbody = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER) + if(4) + target.halbody = image('icons/mob/alien.dmi',husk_point,"alienother",TURF_LAYER) + + if(target.client) + target.client.images += target.halbody + sleep(rand(30,50)) //Only seen for a brief moment. + if(target.client) + target.client.images -= target.halbody + QDEL_NULL(target.halbody) + qdel(src) + +//hallucination projectile code in code/modules/projectiles/projectile/special.dm +/datum/hallucination/stray_bullet + cost = 15 + +/datum/hallucination/stray_bullet/New(mob/living/carbon/C, forced = TRUE) + ..() + var/list/turf/startlocs = list() + for(var/turf/open/T in view(world.view+1,target)-view(world.view,target)) + startlocs += T + var/turf/start = pick(startlocs) + var/proj_type = pick(subtypesof(/obj/item/projectile/hallucination)) + feedback_details += "Type: [proj_type]" + var/obj/item/projectile/hallucination/H = new proj_type(start) + target.playsound_local(start, H.hal_fire_sound, 60, 1) + H.hal_target = target + H.current = start + H.starting = start + H.yo = target.y - start.y + H.xo = target.x - start.x + H.original = target + H.fire() + qdel(src) + From f52d120cafdefc43694d002e3f4a2f774375086d Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 08:27:50 -0500 Subject: [PATCH 072/164] Update world.dm --- code/world.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/world.dm b/code/world.dm index b6badeb348..df267f2536 100644 --- a/code/world.dm +++ b/code/world.dm @@ -59,7 +59,7 @@ if(config.sql_enabled) if(SSdbcore.Connect()) log_world("Database connection established.") - var/datum/DBQuery/db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_version")]") + var/datum/DBQuery/db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")]") db_version.Execute() if(db_version.NextRow()) var/db_major = db_version.item[1] From 822cddc718e534720ecccfc8b9b206decfe9c4e0 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 08:55:45 -0500 Subject: [PATCH 073/164] Update Hallucination.dm --- code/modules/flufftext/Hallucination.dm | 798 +++++++++++++----------- 1 file changed, 432 insertions(+), 366 deletions(-) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 6ae32a9d6a..2b8fe4b064 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -18,46 +18,76 @@ Gunshots/explosions/opening doors/less rare audio (done) var/image/halbody var/obj/halitem var/hal_screwyhud = SCREWYHUD_NONE - var/handling_hal = 0 + var/next_hallucination = 0 + +GLOBAL_LIST_INIT(hallucinations_minor, list( + /datum/hallucination/sounds, + /datum/hallucination/bolts, + /datum/hallucination/whispers, + /datum/hallucination/message, + /datum/hallucination/hudscrew)) + +GLOBAL_LIST_INIT(hallucinations_medium, list( + /datum/hallucination/fake_alert, + /datum/hallucination/items, + /datum/hallucination/items_other, + /datum/hallucination/dangerflash, + /datum/hallucination/bolts, + /datum/hallucination/fake_flood, + /datum/hallucination/husks, + /datum/hallucination/battle, + /datum/hallucination/fire, + /datum/hallucination/self_delusion)) + +GLOBAL_LIST_INIT(hallucinations_major, list( + /datum/hallucination/fakeattacker, + /datum/hallucination/death, + /datum/hallucination/xeno_attack, + /datum/hallucination/singularity_scare, + /datum/hallucination/delusion, + /datum/hallucination/oh_yeah)) /mob/living/carbon/proc/handle_hallucinations() - if(handling_hal) + if(world.time < next_hallucination) return - //Least obvious - var/list/minor = list("sounds"=25,"bolts_minor"=5,"whispers"=15,"message"=10,"hudscrew"=15) - //Something's wrong here - var/list/medium = list("fake_alert"=15,"items"=10,"items_other"=10,"dangerflash"=10,"bolts"=5,"flood"=5,"husks"=10,"battle"=15,"self_delusion"=10) - //AAAAH - var/list/major = list("fake"=20,"death"=10,"xeno"=10,"singulo"=10,"borer"=10,"delusion"=20,"koolaid"=10) + if(hallucination) + var/list/current = GLOB.hallucinations_minor + if(prob(25) && hallucination > 100) + current = GLOB.hallucinations_medium + else if(prob(10) && hallucination > 200) + current = GLOB.hallucinations_major + var/halpick = pick(current) + new halpick(src, FALSE) - handling_hal = 1 - while(hallucination > 20) - sleep(rand(200,500)/(hallucination/25)) - if(prob(20)) - continue - var/list/current = list() - switch(rand(100)) - if(1 to 50) - current = minor - if(51 to 85) - current = medium - if(86 to 100) - current = major +/mob/living/carbon/proc/set_screwyhud(hud_type) + hal_screwyhud = hud_type + update_health_hud() - var/halpick = pickweight(current) +/datum/hallucination + var/mob/living/carbon/target + var/cost = 5 //affects the amount of hallucination reduced, and cooldown until the next hallucination + var/feedback_details //extra info for investigate - hallucinate(halpick) - handling_hal = 0 +/datum/hallucination/New(mob/living/carbon/T, forced = TRUE) + set waitfor = 0 + target = T + if(!forced) + target.hallucination = max(0, target.hallucination - cost) + target.next_hallucination = world.time + (rand(cost * 0.5, cost * 3) * 10) + +/datum/hallucination/proc/wake_and_restore() + target.set_screwyhud(SCREWYHUD_NONE) + target.SetSleeping(0) + +/datum/hallucination/Destroy() + target.investigate_log("was afflicted with a hallucination of type [type]. [feedback_details]", INVESTIGATE_HALLUCINATIONS) + return ..() /obj/effect/hallucination invisibility = INVISIBILITY_OBSERVER var/mob/living/carbon/target = null -/obj/effect/hallucination/proc/wake_and_restore() - target.hal_screwyhud = SCREWYHUD_NONE - target.SetSleeping(0) - /obj/effect/hallucination/simple var/image_icon = 'icons/mob/alien.dmi' var/image_state = "alienh_pounce" @@ -226,39 +256,6 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/simple/clown/scary image_state = "scary_clown" -/obj/effect/hallucination/simple/borer - image_icon = 'icons/mob/borer.dmi' - image_state = "brainslug" - -/obj/effect/hallucination/borer - //A borer unconsciouss you and crawls in your ear - var/obj/machinery/atmospherics/components/unary/vent_pump/pump = null - var/obj/effect/hallucination/simple/borer/borer = null - -/obj/effect/hallucination/borer/Initialize(mapload, var/mob/living/carbon/T) - ..() - target = T - for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) - if(!U.welded) - pump = U - break - if(pump) - borer = new(pump.loc,target) - for(var/i=0, i<11, i++) - walk_to(borer, get_step(borer, get_cardinal_dir(borer, T))) - if(borer.Adjacent(T)) - to_chat(T, "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.") - T.Stun(80) - sleep(50) - qdel(borer) - sleep(rand(60, 90)) - to_chat(T, "Primary [rand(1000,9999)] states: [pick("Hello","Hi","You're my slave now!","Don't try to get rid of me...")]") - break - sleep(4) - if(!QDELETED(borer)) - qdel(borer) - qdel(src) - /obj/effect/hallucination/simple/bubblegum name = "Bubblegum" image_icon = 'icons/mob/lavaland/96x96megafauna.dmi' @@ -728,22 +725,22 @@ Gunshots/explosions/opening doors/less rare audio (done) /datum/hallucination/whispers/New(mob/living/carbon/T, forced = TRUE) ..() - var/speak_messages = list("[pick("I'm watching you...","I know what you're doing","What are you hiding?","I saw that")]",\ - "[pick("","Hey, ","Hi ","Hello ","Wait, ","It's ")][target.first_name()]!",\ - "[pick("Get out","Go away","Fuck off","OUT!")]",\ - "[pick("Kchck-Chkck? Kchchck!","EEEeeeeEEEE","#@§*&£","H-hhhhh...")]",\ - "[pick("Did you hear that?","Did you see that?","What was that?")]",\ - "[pick("Hail Ratvar","Hail Nar'Sie","Viva!","[generate_code_phrase()]","Are you mr. [pick(GLOB.possible_changeling_IDs)]?")]",\ - "[pick("Why?","What?","Wait, what?","Wait","Hold on","Uh...")]",\ - "Give me that!",\ - "HELP[pick(""," ME"," HIM"," HER"," THEM")]!!",\ - "RUN!!",\ - "I'm infected, [pick("stay away","don't get close","be careful","help me","kill me")]") + var/speak_messages = list("[pick_list_replacements(HAL_LINES_FILE, "suspicion")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "greetings")][target.first_name()]!",\ + "[pick_list_replacements(HAL_LINES_FILE, "getout")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "weird")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "didyouhearthat")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "imatraitor")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "doubt")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "aggressive")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "help")]!!",\ + "[pick_list_replacements(HAL_LINES_FILE, "escape")]",\ + "I'm infected, [pick_list_replacements(HAL_LINES_FILE, "infection_advice")]!") var/radio_messages = list("Set [target.first_name()] to arrest!",\ - "[pick("Captain","Hos","Cmo","Rd","Ce","Hop","Janitor","AI","Viro","Qm","[target.first_name()]")] is [pick("rogue","cult","clockcult","a revhead","a gang leader","a traitor","a ling","dead")]!",\ + "[pick_list_replacements(HAL_LINES_FILE, "people")] is [pick_list_replacements(HAL_LINES_FILE, "accusations")]!",\ "Help!",\ - "[pick("Cult", "Wizard", "Blob", "Ling", "Ops", "Swarmers", "Revenant", "Traitor", "Harm", "I hear flashing", "Help")] in [pick(GLOB.teleportlocs)][prob(50)?"!":"!!"]",\ + "[pick_list_replacements(HAL_LINES_FILE, "threat")] in [pick_list_replacements(HAL_LINES_FILE, "location")][prob(50)?"!":"!!"]",\ "Where's [target.first_name()]?"\ ,"[pick("C","Ai, c","Someone c","Rec")]all the shuttle!"\ ,"AI [pick("rogue", "is dead")]!!") @@ -774,312 +771,381 @@ Gunshots/explosions/opening doors/less rare audio (done) for(var/mob/living/carbon/human/H in GLOB.living_mob_list) humans += H person = pick(humans) - to_chat(target, target.compose_message(person,understood_language,pick(radio_messages),"1459",person.get_spans())) + var/message = target.compose_message(person,understood_language,pick(radio_messages),"1459",person.get_spans()) + feedback_details += "Type: Radio, Source: [person.real_name], Message: [message]" + to_chat(target, message) qdel(src) -/obj/effect/hallucination/message +/datum/hallucination/message + cost = 15 -/obj/effect/hallucination/message/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/message/New(mob/living/carbon/T, forced = TRUE) ..() - target = T var/chosen = pick("The light burns you!", \ "You don't feel like yourself.", \ - "Unknown has punched [target]!", \ "You hear something squeezing through the ducts...", \ "You hear a distant scream.", \ "You feel invincible, nothing can hurt you!", \ "You feel a tiny prick!", \ "[target] sneezes.", \ - "You feel faint.", \ - "You hear a strange, alien voice in your head...[pick("Hiss","Ssss")]", \ - "You can see...everything!") + //The truth, revealed + "You're hallucinating.", \ + //Direct advice + "[pick_list_replacements(HAL_LINES_FILE, "advice")]") + feedback_details += "Message: [chosen]" to_chat(target, chosen) qdel(src) -/mob/living/carbon/proc/hallucinate(hal_type, specific) // specific is used to specify a particular hallucination - set waitfor = 0 - switch(hal_type) - if("xeno") - new /obj/effect/hallucination/xeno_attack(src.loc,src) - if("borer") - new /obj/effect/hallucination/borer(src.loc,src) - if("singulo") - new /obj/effect/hallucination/singularity_scare(src.loc,src) - if("koolaid") - new /obj/effect/hallucination/oh_yeah(src.loc,src) - if("battle") - new /obj/effect/hallucination/battle(src.loc,src) - if("flood") - new /obj/effect/hallucination/fake_flood(src.loc,src) - if("delusion") - new /obj/effect/hallucination/delusion(src.loc,src) - if("self_delusion") - new /obj/effect/hallucination/self_delusion(src.loc,src) - if("fake") - new /obj/effect/hallucination/fakeattacker(src.loc,src) - if("bolts") - new /obj/effect/hallucination/bolts(src.loc,src) - if("bolts_minor") - new /obj/effect/hallucination/bolts(src.loc,src,rand(1,2)) - if("whispers") - new /obj/effect/hallucination/whispers(src.loc,src) - if("message") - new /obj/effect/hallucination/message(src.loc,src) - if("items_other") - new /obj/effect/hallucination/items_other(src.loc,src) - if("sounds") - //Strange audio - switch(rand(1,20)) - if(1) playsound_local(null,'sound/machines/airlock.ogg', 15, 1) - if(2) - if(prob(50)) playsound_local(null,'sound/effects/explosion1.ogg', 50, 1) - else playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1) - if(3) playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1) - if(4) playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1) - if(5) - playsound_local(null, 'sound/weapons/ring.ogg', 35) - sleep(15) - playsound_local(null, 'sound/weapons/ring.ogg', 35) - sleep(15) - playsound_local(null, 'sound/weapons/ring.ogg', 35) - if(6) playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1) - if(7) playsound_local(null, 'sound/machines/alarm.ogg', 100, 0) - if(8) playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0) - if(9) - //To make it more realistic, I added two gunshots (enough to kill) - playsound_local(null, 'sound/weapons/gunshot.ogg', 25, 1) - spawn(rand(10,30)) - playsound_local(null, 'sound/weapons/gunshot.ogg', 25, 1) - sleep(rand(5,10)) - playsound_local(null, sound(get_sfx("bodyfall"), 25), 25, 1) - if(10) playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50) - if(11) - //Same as above, but with tasers. - playsound_local(null, 'sound/weapons/taser.ogg', 25, 1) - spawn(rand(10,30)) - playsound_local(null, 'sound/weapons/taser.ogg', 25, 1) - sleep(rand(5,10)) - playsound_local(null, sound(get_sfx("bodyfall"), 25), 25, 1) - //Rare audio - if(12) - //These sounds are (mostly) taken from Hidden: Source - var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\ - 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ - 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ - 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ - 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') - playsound_local(null, pick(creepyasssounds), 50, 1) - if(13) - playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100) - sleep(150) - playsound_local(null, 'sound/effects/ratvar_reveal.ogg', 100) - if(14) - to_chat(src, "

Priority Announcement

") - to_chat(src, "

The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

") - playsound_local(null, 'sound/ai/shuttledock.ogg', 100) - //Deconstructing a wall - if(15) - playsound_local(null, 'sound/items/welder.ogg', 15, 1) - sleep(105) - playsound_local(null, 'sound/items/welder2.ogg', 15, 1) - sleep(15) - playsound_local(null, 'sound/items/ratchet.ogg', 15, 1) - //Hacking a door - if(16) - playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1) - sleep(rand(10,30)) - for(var/i = rand(1,3), i>0, i--) - playsound_local(null, 'sound/weapons/empty.ogg', 15, 1) - sleep(rand(10,30)) - playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1) - if(17) - playsound_local(null, 'sound/weapons/saberon.ogg',35,1) - if(18) - to_chat(src, "

Biohazard Alert

") - to_chat(src, "

Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.

") - playsound_local(null, 'sound/ai/outbreak5.ogg') - if(19) //Tesla loose! - playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1) - sleep(20) - playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1) - sleep(20) - playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1) - if(20) //AI is doomsdaying! - to_chat(src, "

Anomaly Alert

") - to_chat(src, "

Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.

") - playsound_local(null, 'sound/ai/aimalf.ogg', 100) - if("hudscrew") - //Screwy HUD - //to_chat(src, "Screwy HUD") - hal_screwyhud = pick(SCREWYHUD_NONE,SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY) - sleep(rand(100,250)) - hal_screwyhud = 0 +/datum/hallucination/sounds + cost = 15 - if("fake_alert") - var/alert_type = pick("oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","tox_in_air","newlaw","nutrition","charge","weightless","fire","locked","hacked","temp","pressure") - if(specific) - alert_type = specific - switch(alert_type) - if("oxy") - throw_alert("oxy", /obj/screen/alert/oxy, override = TRUE) - if("not_enough_tox") - throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox, override = TRUE) - if("not_enough_co2") - throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2, override = TRUE) - if("too_much_oxy") - throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy, override = TRUE) - if("too_much_co2") - throw_alert("too_much_co2", /obj/screen/alert/too_much_co2, override = TRUE) - if("tox_in_air") - throw_alert("tox_in_air", /obj/screen/alert/tox_in_air, override = TRUE) - if("nutrition") - if(prob(50)) - throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE) - else - throw_alert("nutrition", /obj/screen/alert/starving, override = TRUE) - if("weightless") - throw_alert("weightless", /obj/screen/alert/weightless, override = TRUE) - if("fire") - throw_alert("fire", /obj/screen/alert/fire, override = TRUE) - if("temp") - if(prob(50)) - throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE) - else - throw_alert("temp", /obj/screen/alert/cold, 3, override = TRUE) - if("pressure") - if(prob(50)) - throw_alert("pressure", /obj/screen/alert/highpressure, 2, override = TRUE) - else - throw_alert("pressure", /obj/screen/alert/lowpressure, 2, override = TRUE) - //BEEP BOOP I AM A ROBOT - if("newlaw") - throw_alert("newlaw", /obj/screen/alert/newlaw, override = TRUE) - if("locked") - throw_alert("locked", /obj/screen/alert/locked, override = TRUE) - if("hacked") - throw_alert("hacked", /obj/screen/alert/hacked, override = TRUE) - if("charge") - throw_alert("charge",/obj/screen/alert/emptycell, override = TRUE) - sleep(rand(100,200)) - clear_alert(alert_type, clear_override = TRUE) - - if("items") - //Strange items - //to_chat(src, "Traitor Items") - if(!halitem) - halitem = new - var/obj/item/l_hand = get_item_for_held_index(1) - var/obj/item/r_hand = get_item_for_held_index(2) - var/l = ui_hand_position(get_held_index_of_item(l_hand)) - var/r = ui_hand_position(get_held_index_of_item(r_hand)) - var/list/slots_free = list(l,r) - if(l_hand) slots_free -= l - if(r_hand) slots_free -= r - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(!H.belt) slots_free += ui_belt - if(!H.l_store) slots_free += ui_storage1 - if(!H.r_store) slots_free += ui_storage2 - if(slots_free.len) - halitem.screen_loc = pick(slots_free) - halitem.layer = ABOVE_HUD_LAYER - halitem.plane = ABOVE_HUD_PLANE - switch(rand(1,6)) - if(1) //revolver - halitem.icon = 'icons/obj/guns/projectile.dmi' - halitem.icon_state = "revolver" - halitem.name = "Revolver" - if(2) //c4 - halitem.icon = 'icons/obj/grenade.dmi' - halitem.icon_state = "plastic-explosive0" - halitem.name = "Mysterious Package" - if(prob(25)) - halitem.icon_state = "c4small_1" - if(3) //sword - halitem.icon = 'icons/obj/weapons.dmi' - halitem.icon_state = "sword1" - halitem.name = "Sword" - if(4) //stun baton - halitem.icon = 'icons/obj/weapons.dmi' - halitem.icon_state = "stunbaton" - halitem.name = "Stun Baton" - if(5) //emag - halitem.icon = 'icons/obj/card.dmi' - halitem.icon_state = "emag" - halitem.name = "Cryptographic Sequencer" - if(6) //flashbang - halitem.icon = 'icons/obj/grenade.dmi' - halitem.icon_state = "flashbang1" - halitem.name = "Flashbang" - if(client) client.screen += halitem - QDEL_IN(halitem, rand(100, 250)) - if("dangerflash") - //Flashes of danger - //to_chat(src, "Danger Flash") - if(!halimage) - var/list/possible_points = list() - for(var/turf/open/floor/F in view(src,world.view)) - possible_points += F - if(possible_points.len) - var/turf/open/floor/target = pick(possible_points) - - switch(rand(1,4)) - if(1) - //to_chat(src, "Space") - halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER) - if(2) - //to_chat(src, "Lava") - halimage = image('icons/turf/floors/lava.dmi',target,"smooth",TURF_LAYER) - if(3) - //to_chat(src, "Chasm") - halimage = image('icons/turf/floors/Chasms.dmi',target,"smooth",TURF_LAYER) - if(4) - //to_chat(src, "C4") - halimage = image('icons/obj/grenade.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01) - - - if(client) client.images += halimage - sleep(rand(40,60)) //Only seen for a brief moment. - if(client) client.images -= halimage - halimage = null - if("death") - //Fake death - hal_screwyhud = SCREWYHUD_DEAD - SetUnconscious(400) - var/area/area = get_area(src) - to_chat(src, "[mind.name] has died at [area.name].") +/datum/hallucination/sounds/New(mob/living/carbon/T, forced = TRUE, sound_type) + ..() + if(!sound_type) + sound_type = pick("airlock","explosion","far_explosion","glass","phone","summon_guns","alarm","beepsky","hallelujah","creepy","ratvar","shuttle_dock", + "wall_decon","door_hack","esword","blob_alert","tesla","malf_ai") + feedback_details += "Type: [sound_type]" + //Strange audio + switch(sound_type) + if("airlock") + target.playsound_local(null,'sound/machines/airlock.ogg', 15, 1) + if("explosion") if(prob(50)) - var/list/dead_people = list() - for(var/mob/dead/observer/G in GLOB.player_list) - dead_people += G - var/mob/dead/observer/fakemob = pick(dead_people) - if(fakemob) - sleep(rand(30, 60)) - to_chat(src, "DEAD: [fakemob.name] says, \"[pick("rip","welcome [first_name()]","you too?","is the AI malf?",\ - "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\"") - sleep(rand(50,70)) - hal_screwyhud = SCREWYHUD_NONE - SetSleeping(0) - if("husks") - if(!halbody) - var/list/possible_points = list() - for(var/turf/open/floor/F in view(src,world.view)) - possible_points += F - if(possible_points.len) - var/turf/open/floor/target = pick(possible_points) - switch(rand(1,4)) - if(1) - var/image/body = image('icons/mob/human.dmi',target,"husk",TURF_LAYER) - var/matrix/M = matrix() - M.Turn(90) - body.transform = M - halbody = body - if(2,3) - halbody = image('icons/mob/human.dmi',target,"husk",TURF_LAYER) - if(4) - halbody = image('icons/mob/alien.dmi',target,"alienother",TURF_LAYER) + target.playsound_local(null,'sound/effects/explosion1.ogg', 50, 1) + else + target.playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1) + if("far_explosion") + target.playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1) + if("glass") + target.playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1) + if("phone") + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + sleep(15) + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + sleep(15) + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + if("summon_guns") + target.playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1) + if("alarm") + target.playsound_local(null, 'sound/machines/alarm.ogg', 100, 0) + if("beepsky") + target.playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0) + if("hallelujah") + target.playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50) + //Rare audio + if("creepy") + //These sounds are (mostly) taken from Hidden: Source + var/static/list/hallucinations_creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\ + 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ + 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ + 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ + 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') + target.playsound_local(null, pick(hallucinations_creepyasssounds), 50, 1) + if("ratvar") + target.playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100) + sleep(150) + target.playsound_local(null, 'sound/effects/ratvar_reveal.ogg', 100) + if("shuttle_dock") + to_chat(target, "

Priority Announcement

") + to_chat(target, "

The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

") + target.playsound_local(null, 'sound/ai/shuttledock.ogg', 100) + //Deconstructing a wall + if("wall_decon") + target.playsound_local(null, 'sound/items/welder.ogg', 15, 1) + sleep(105) + target.playsound_local(null, 'sound/items/welder2.ogg', 15, 1) + sleep(15) + target.playsound_local(null, 'sound/items/ratchet.ogg', 15, 1) + //Hacking a door + if("door_hack") + target.playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1) + sleep(rand(10,30)) + for(var/i = rand(1,3), i>0, i--) + target.playsound_local(null, 'sound/weapons/empty.ogg', 15, 1) + sleep(rand(10,30)) + target.playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1) + if("esword") + target.playsound_local(null, 'sound/weapons/saberon.ogg',35,1) + if("blob_alert") + to_chat(target, "

Biohazard Alert

") + to_chat(target, "

Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.

") + target.playsound_local(null, 'sound/ai/outbreak5.ogg', 100, 0) + if("tesla") //Tesla loose! + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1) + sleep(20) + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1) + sleep(20) + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1) + if("malf_ai") //AI is doomsdaying! + to_chat(target, "

Anomaly Alert

") + to_chat(target, "

Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.

") + target.playsound_local(null, 'sound/ai/aimalf.ogg', 100, 0) + qdel(src) + +/datum/hallucination/hudscrew + cost = 10 + +/datum/hallucination/hudscrew/New(mob/living/carbon/T, forced = TRUE) + ..() + //Screwy HUD + target.set_screwyhud(pick(SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY)) + feedback_details += "Type: [target.hal_screwyhud]" + sleep(rand(100,250)) + target.set_screwyhud(SCREWYHUD_NONE) + qdel(src) + +/datum/hallucination/fake_alert + cost = 15 + +/datum/hallucination/fake_alert/New(mob/living/carbon/T, forced = TRUE, specific, duration = 150) + ..() + var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temphot","tempcold","pressure") + if(specific) + alert_type = specific + feedback_details += "Type: [alert_type]" + switch(alert_type) + if("oxy") + target.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy, override = TRUE) + if("not_enough_tox") + target.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox, override = TRUE) + if("not_enough_co2") + target.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2, override = TRUE) + if("too_much_oxy") + target.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy, override = TRUE) + if("too_much_co2") + target.throw_alert("too_much_co2", /obj/screen/alert/too_much_co2, override = TRUE) + if("tox_in_air") + target.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox, override = TRUE) + if("nutrition") + if(prob(50)) + target.throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE) + else + target.throw_alert("nutrition", /obj/screen/alert/starving, override = TRUE) + if("weightless") + target.throw_alert("weightless", /obj/screen/alert/weightless, override = TRUE) + if("fire") + target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE) + if("temphot") + target.throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE) + if("tempcold") + target.throw_alert("temp", /obj/screen/alert/cold, 3, override = TRUE) + if("pressure") + if(prob(50)) + target.throw_alert("pressure", /obj/screen/alert/highpressure, 2, override = TRUE) + else + target.throw_alert("pressure", /obj/screen/alert/lowpressure, 2, override = TRUE) + //BEEP BOOP I AM A ROBOT + if("newlaw") + target.throw_alert("newlaw", /obj/screen/alert/newlaw, override = TRUE) + if("locked") + target.throw_alert("locked", /obj/screen/alert/locked, override = TRUE) + if("hacked") + target.throw_alert("hacked", /obj/screen/alert/hacked, override = TRUE) + if("charge") + target.throw_alert("charge",/obj/screen/alert/emptycell, override = TRUE) + sleep(duration) + target.clear_alert(alert_type, clear_override = TRUE) + qdel(src) + +/datum/hallucination/items + cost = 15 + +/datum/hallucination/items/New(mob/living/carbon/T, forced = TRUE) + ..() + //Strange items + if(!target.halitem) + target.halitem = new + var/obj/item/l_hand = target.get_item_for_held_index(1) + var/obj/item/r_hand = target.get_item_for_held_index(2) + var/l = ui_hand_position(target.get_held_index_of_item(l_hand)) + var/r = ui_hand_position(target.get_held_index_of_item(r_hand)) + var/list/slots_free = list(l,r) + if(l_hand) slots_free -= l + if(r_hand) slots_free -= r + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(!H.belt) slots_free += ui_belt + if(!H.l_store) slots_free += ui_storage1 + if(!H.r_store) slots_free += ui_storage2 + if(slots_free.len) + target.halitem.screen_loc = pick(slots_free) + target.halitem.layer = ABOVE_HUD_LAYER + target.halitem.plane = ABOVE_HUD_PLANE + switch(rand(1,6)) + if(1) //revolver + target.halitem.icon = 'icons/obj/guns/projectile.dmi' + target.halitem.icon_state = "revolver" + target.halitem.name = "Revolver" + if(2) //c4 + target.halitem.icon = 'icons/obj/grenade.dmi' + target.halitem.icon_state = "plastic-explosive0" + target.halitem.name = "C4" + if(prob(25)) + target.halitem.icon_state = "plasticx40" + if(3) //sword + target.halitem.icon = 'icons/obj/weapons.dmi' + target.halitem.icon_state = "sword0" + target.halitem.name = "Energy Sword" + if(4) //stun baton + target.halitem.icon = 'icons/obj/weapons.dmi' + target.halitem.icon_state = "stunbaton" + target.halitem.name = "Stun Baton" + if(5) //emag + target.halitem.icon = 'icons/obj/card.dmi' + target.halitem.icon_state = "emag" + target.halitem.name = "Cryptographic Sequencer" + if(6) //flashbang + target.halitem.icon = 'icons/obj/grenade.dmi' + target.halitem.icon_state = "flashbang1" + target.halitem.name = "Flashbang" + feedback_details += "Type: [target.halitem.name]" + if(target.client) target.client.screen += target.halitem + QDEL_IN(target.halitem, rand(150, 350)) + qdel(src) + +/datum/hallucination/dangerflash + cost = 15 + +/datum/hallucination/dangerflash/New(mob/living/carbon/T, forced = TRUE) + ..() + //Flashes of danger + if(!target.halimage) + var/list/possible_points = list() + for(var/turf/open/floor/F in view(target,world.view)) + possible_points += F + if(possible_points.len) + var/turf/open/floor/danger_point = pick(possible_points) + + switch(rand(1,5)) + if(1) + target.halimage = image('icons/turf/space.dmi',danger_point,"[rand(1,25)]",TURF_LAYER) + if(2) + target.halimage = image('icons/turf/floors/lava.dmi',danger_point,"smooth",TURF_LAYER) + if(3) + target.halimage = image('icons/turf/floors/Chasms.dmi',danger_point,"smooth",TURF_LAYER) + if(4) + target.halimage = image('icons/effects/effects.dmi',danger_point,"anom",OBJ_LAYER+0.01) + if(5) + target.halimage = image('icons/effects/effects.dmi',danger_point,"electricity2",OBJ_LAYER+0.01) + + + if(target.client) + target.client.images += target.halimage + sleep(rand(200,450)) + if(target.client) + target.client.images -= target.halimage + QDEL_NULL(target.halimage) + qdel(src) + +/datum/hallucination/death + cost = 40 + +/datum/hallucination/death/New(mob/living/carbon/T, forced = TRUE) + set waitfor = 0 + ..() + target.set_screwyhud(SCREWYHUD_DEAD) + target.Knockdown(300) + target.silent += 10 + var/area/area = get_area(target) + to_chat(target, "[target.mind.name] has died at [area.name].") + if(prob(50)) + var/mob/fakemob + var/list/dead_people = list() + for(var/mob/dead/observer/G in GLOB.player_list) + dead_people += G + if(LAZYLEN(dead_people)) + fakemob = pick(dead_people) + else + fakemob = target //ever been so lonely you had to haunt yourself? + if(fakemob) + sleep(rand(20, 50)) + to_chat(target, "DEAD: [fakemob.name] says, \"[pick("rip","hey [target.first_name()]","you too?","is the AI rogue?",\ + "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\"") + sleep(rand(70,90)) + target.set_screwyhud(SCREWYHUD_NONE) + target.SetKnockdown(0) + target.silent = 0 + qdel(src) + +/datum/hallucination/fire + cost = 25 + +/datum/hallucination/fire/New(mob/living/carbon/T, forced = TRUE) + ..() + var/image/fire_overlay = image('icons/mob/OnFire.dmi', target, "Standing", ABOVE_MOB_LAYER) + if(target.client) + target.client.images += fire_overlay + to_chat(target, "You're set on fire!") + target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE) + sleep(20) + target.throw_alert("temp", /obj/screen/alert/hot, 1, override = TRUE) + sleep(30) + target.clear_alert("temp", clear_override = TRUE) + target.throw_alert("temp", /obj/screen/alert/hot, 2, override = TRUE) + sleep(30) + target.clear_alert("temp", clear_override = TRUE) + target.throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE) + for(var/i in 1 to rand(5, 10)) + target.adjustStaminaLoss(15) + sleep(25) + target.clear_alert("fire", clear_override = TRUE) + target.clear_alert("temp", clear_override = TRUE) + if(target.client) + target.client.images -= fire_overlay + QDEL_NULL(fire_overlay) + qdel(src) + +/datum/hallucination/husks + cost = 20 + +/datum/hallucination/husks/New(mob/living/carbon/T, forced = TRUE) + ..() + if(!target.halbody) + var/list/possible_points = list() + for(var/turf/open/floor/F in view(target,world.view)) + possible_points += F + if(possible_points.len) + var/turf/open/floor/husk_point = pick(possible_points) + switch(rand(1,4)) + if(1) + var/image/body = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER) + var/matrix/M = matrix() + M.Turn(90) + body.transform = M + target.halbody = body + if(2,3) + target.halbody = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER) + if(4) + target.halbody = image('icons/mob/alien.dmi',husk_point,"alienother",TURF_LAYER) + + if(target.client) + target.client.images += target.halbody + sleep(rand(30,50)) //Only seen for a brief moment. + if(target.client) + target.client.images -= target.halbody + QDEL_NULL(target.halbody) + qdel(src) + +//hallucination projectile code in code/modules/projectiles/projectile/special.dm +/datum/hallucination/stray_bullet + cost = 15 + +/datum/hallucination/stray_bullet/New(mob/living/carbon/C, forced = TRUE) + ..() + var/list/turf/startlocs = list() + for(var/turf/open/T in view(world.view+1,target)-view(world.view,target)) + startlocs += T + var/turf/start = pick(startlocs) + var/proj_type = pick(subtypesof(/obj/item/projectile/hallucination)) + feedback_details += "Type: [proj_type]" + var/obj/item/projectile/hallucination/H = new proj_type(start) + target.playsound_local(start, H.hal_fire_sound, 60, 1) + H.hal_target = target + H.current = start + H.starting = start + H.yo = target.y - start.y + H.xo = target.x - start.x + H.original = target + H.fire() + qdel(src) - if(client) client.images += halbody - spawn(rand(30,50)) //Only seen for a brief moment. - if(client) client.images -= halbody - halbody = null From d58b2f7af36f2fe2441986106f5ee474ba9e4b35 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 08:56:20 -0500 Subject: [PATCH 074/164] Automatic changelog generation for PR #2231 [ci skip] --- html/changelogs/AutoChangeLog-pr-2231.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2231.yml diff --git a/html/changelogs/AutoChangeLog-pr-2231.yml b/html/changelogs/AutoChangeLog-pr-2231.yml new file mode 100644 index 0000000000..c25b4b2b49 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2231.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - tweak: "Spell action buttons now have their description in a tooltip." From 7faec4505367e3fd73c8ac78fa9ed9547c6a127d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 09:07:03 -0500 Subject: [PATCH 075/164] Tiny bit better splitting on add_details --- code/controllers/subsystem/blackbox.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index afa77b0207..3344afcaaa 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -250,7 +250,7 @@ SUBSYSTEM_DEF(blackbox) return 0 return value -/datum/feedback_variable/proc/get_variable() +/datum/feedback_variable/proc/get_variable() return variable /datum/feedback_variable/proc/set_details(text) @@ -260,12 +260,12 @@ SUBSYSTEM_DEF(blackbox) /datum/feedback_variable/proc/add_details(text) if (istext(text)) if (!details) - details = text + details = "\"[text]\"" else - details += " [text]" + details += " | \"[text]\"" -/datum/feedback_variable/proc/get_details() +/datum/feedback_variable/proc/get_details() return details /datum/feedback_variable/proc/get_parsed() - return list(variable,value,details) + return list(variable,value,details) \ No newline at end of file From fa8ed2de17ed9065ce6587a60d675ba068c2dab0 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 09:13:33 -0500 Subject: [PATCH 076/164] Update component.dm --- code/datums/components/component.dm | 229 ++-------------------------- 1 file changed, 14 insertions(+), 215 deletions(-) diff --git a/code/datums/components/component.dm b/code/datums/components/component.dm index bc65b1cabe..5e25a581f8 100644 --- a/code/datums/components/component.dm +++ b/code/datums/components/component.dm @@ -26,7 +26,7 @@ //set up the typecache var/our_type = type - for(var/I in _GetInverseTypeList(our_type)) + for(var/I in _GetInverseTypeListExceptRoot(our_type)) var/test = dc[I] if(test) //already another component of this type here var/list/components_of_type @@ -66,7 +66,7 @@ if(P) var/list/dc = P.datum_components var/our_type = type - for(var/I in _GetInverseTypeList(our_type)) + for(var/I in _GetInverseTypeListExceptRoot(our_type)) var/list/components_of_type = dc[I] if(islist(components_of_type)) // var/list/subtracted = components_of_type - src @@ -110,226 +110,25 @@ /datum/component/proc/OnTransfer(datum/new_parent) return -/datum/component/proc/AfterComponentActivated() - return - -/datum/component/proc/_GetInverseTypeList(current_type) - . = list(current_type) +/datum/component/proc/_GetInverseTypeListExceptRoot(our_type_cached) + var/datum/component/current_type = our_type_cached + . = list() while (current_type != /datum/component) - current_type = type2parent(current_type) . += current_type + current_type = type2parent(current_type) + +/datum/var/list/datum_components //special typecache of /datum/component /datum/proc/SendSignal(sigtype, ...) var/list/comps = datum_components . = FALSE - if(!comps) - return - var/target = comps[/datum/component] - if(!islist(target)) - var/datum/component/C = target - if(C.enabled && C.ReceiveSignal(arglist(args))) + for(var/I in comps) + var/datum/component/C = I + if(!C.enabled) + continue + if(C.ReceiveSignal(arglist(args))) ComponentActivated(C) - C.AfterComponentActivated() - return TRUE - else - for(var/I in target) - var/datum/component/C = I - if(!C.enabled) - continue - if(C.ReceiveSignal(arglist(args))) - ComponentActivated(C) - . = TRUE - -/datum/proc/ComponentActivated(datum/component/C) - return - -/datum/proc/GetComponent(c_type) - var/list/dc = datum_components - if(!dc) - return null - . = dc[c_type] - if(islist(.)) - return .[1] - -/datum/proc/GetExactComponent(c_type) - var/list/dc = datum_components - if(!dc) - return null - var/datum/component/C = dc[c_type] - if(C) - if(islist(C)) - C = C[1] - if(C.type == c_type) - return C - return null - -/datum/proc/GetComponents(c_type) - var/list/dc = datum_components - if(!dc) - return null - . = dc[c_type] - if(!islist(.)) - return list(.) - -/datum/proc/AddComponent(new_type, ...) - var/nt = new_type - args[1] = src - var/datum/component/C = new nt(arglist(args)) - return QDELING(C) ? GetComponent(new_type) : C - -/datum/proc/TakeComponent(datum/component/C) - if(!C) - return - var/datum/helicopter = C.parent - if(helicopter == src) - //wat - return - C._RemoveNoSignal() - helicopter.SendSignal(COMSIG_COMPONENT_REMOVING, C) - C.OnTransfer(src) - C.parent = src - SendSignal(COMSIG_COMPONENT_ADDED, C) -/datum/component - var/enabled = TRUE - var/dupe_mode = COMPONENT_DUPE_HIGHLANDER - var/list/signal_procs - var/datum/parent - -/datum/component/New(datum/P, ...) - var/dm = dupe_mode - if(dm != COMPONENT_DUPE_ALLOWED) - var/datum/component/old = P.GetExactComponent(type) - if(old) - switch(dm) - if(COMPONENT_DUPE_HIGHLANDER) - InheritComponent(old, FALSE) - qdel(old) - if(COMPONENT_DUPE_UNIQUE) - old.InheritComponent(src, TRUE) - qdel(src) - return - P.SendSignal(COMSIG_COMPONENT_ADDED, src) - - //lazy init the parent's dc list - var/list/dc = P.datum_components - if(!dc) - P.datum_components = dc = list() - - //set up the typecache - var/our_type = type - for(var/I in _GetInverseTypeList(our_type)) - var/test = dc[I] - if(test) //already another component of this type here - var/list/components_of_type - if(!islist(test)) - components_of_type = list(test) - dc[I] = components_of_type - else - components_of_type = test - if(I == our_type) //exact match, take priority - var/inserted = FALSE - for(var/J in 1 to components_of_type.len) - var/datum/component/C = components_of_type[J] - if(C.type != our_type) //but not over other exact matches - components_of_type.Insert(J, I) - inserted = TRUE - break - if(!inserted) - components_of_type += src - else //indirect match, back of the line with ya - components_of_type += src - else //only component of this type, no list - dc[I] = src - - parent = P - -/datum/component/Destroy() - enabled = FALSE - var/datum/P = parent - if(P) - _RemoveNoSignal() - P.SendSignal(COMSIG_COMPONENT_REMOVING, src) - LAZYCLEARLIST(signal_procs) - return ..() - -/datum/component/proc/_RemoveNoSignal() - var/datum/P = parent - if(P) - var/list/dc = P.datum_components - var/our_type = type - for(var/I in _GetInverseTypeList(our_type)) - var/list/components_of_type = dc[I] - if(islist(components_of_type)) // - var/list/subtracted = components_of_type - src - if(subtracted.len == 1) //only 1 guy left - dc[I] = subtracted[1] //make him special - else - dc[I] = subtracted - else //just us - dc -= I - if(!dc.len) - P.datum_components = null - parent = null - -/datum/component/proc/RegisterSignal(sig_type, proc_on_self, override = FALSE) - if(QDELETED(src)) - return - var/list/procs = signal_procs - if(!procs) - 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) - -/datum/component/proc/ReceiveSignal(sigtype, ...) - var/list/sps = signal_procs - var/datum/callback/CB = LAZYACCESS(sps, sigtype) - if(!CB) - return FALSE - var/list/arguments = args.Copy() - arguments.Cut(1, 2) - return CB.InvokeAsync(arglist(arguments)) - -/datum/component/proc/InheritComponent(datum/component/C, i_am_original) - return - -/datum/component/proc/OnTransfer(datum/new_parent) - return - -/datum/component/proc/AfterComponentActivated() - return - -/datum/component/proc/_GetInverseTypeList(current_type) - . = list(current_type) - while (current_type != /datum/component) - current_type = type2parent(current_type) - . += current_type - -/datum/proc/SendSignal(sigtype, ...) - var/list/comps = datum_components - . = FALSE - if(!comps) - return - var/target = comps[/datum/component] - if(!islist(target)) - var/datum/component/C = target - if(C.enabled && C.ReceiveSignal(arglist(args))) - ComponentActivated(C) - C.AfterComponentActivated() - return TRUE - else - for(var/I in target) - var/datum/component/C = I - if(!C.enabled) - continue - if(C.ReceiveSignal(arglist(args))) - ComponentActivated(C) - . = TRUE + . = TRUE /datum/proc/ComponentActivated(datum/component/C) return From f8329e2a89a5308b482ec1259a3f0af422429347 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 09:17:25 -0500 Subject: [PATCH 077/164] Update brain_damage_lines.json --- strings/brain_damage_lines.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/strings/brain_damage_lines.json b/strings/brain_damage_lines.json index e25af310c3..af040d5ba0 100644 --- a/strings/brain_damage_lines.json +++ b/strings/brain_damage_lines.json @@ -172,6 +172,19 @@ "abdoocters" ], + "bug": [ + "", + "IS TIS A BUG??", + "SI IST A BUGG/", + "BUG!!!" + ], + + "semicolon": [ + "", + ";", + ".h" + ], + "roles": [ "heds", "ceptin", From f088e812a9ca1bd98429a450f7fd5dc4505bb5b8 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 09:31:49 -0500 Subject: [PATCH 078/164] Update flora.dm --- code/game/objects/structures/flora.dm | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 76b1462304..d141f71b7a 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -1,12 +1,13 @@ /obj/structure/flora resistance_flags = FLAMMABLE + obj_integrity = 150 max_integrity = 150 - anchored = TRUE + anchored = 1 //trees /obj/structure/flora/tree name = "tree" - density = TRUE + density = 1 pixel_x = -16 layer = FLY_LAYER var/cut = FALSE @@ -25,7 +26,7 @@ playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 100 , 0, 0) icon = 'icons/obj/flora/pinetrees.dmi' icon_state = "tree_stump" - density = FALSE + density = 0 pixel_x = -16 name += " stump" cut = TRUE @@ -88,12 +89,7 @@ /obj/structure/flora/tree/jungle/Initialize() icon_state = "[icon_state][rand(1, 6)]" - ..() - -/obj/structure/flora/tree/jungle/small - pixel_y = 0 - pixel_x = -32 - icon = 'icons/obj/flora/jungletreesmall.dmi' + . = ..() //grass /obj/structure/flora/grass @@ -129,7 +125,7 @@ name = "bush" icon = 'icons/obj/flora/snowflora.dmi' icon_state = "snowbush1" - anchored = TRUE + anchored = 1 /obj/structure/flora/bush/Initialize() icon_state = "snowbush[rand(1, 6)]" @@ -308,10 +304,10 @@ desc = "A volcanic rock" icon = 'icons/obj/flora/rocks.dmi' resistance_flags = FIRE_PROOF - density = TRUE + density = 1 /obj/structure/flora/rock/Initialize() - ..() + . = ..() icon_state = "[icon_state][rand(1,3)]" /obj/structure/flora/rock/pile From cfebaa664618a892246184d4d8f18efbebf16e62 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 16:05:29 -0500 Subject: [PATCH 079/164] Unlocked miner closet in Pubby aux_base dock --- _maps/map_files/PubbyStation/PubbyStation.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 4cc0b5c158..b4b78673a1 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -49675,7 +49675,7 @@ /turf/open/floor/plating, /area/maintenance/department/engine) "cdF" = ( -/obj/structure/closet/secure_closet/miner, +/obj/structure/closet/secure_closet/miner/unlocked, /turf/open/floor/plating, /area/shuttle/auxillary_base) "cdG" = ( From 5fd3a8355c7a76592c1f6f6ea2c6c97e571f58e5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 16:05:33 -0500 Subject: [PATCH 080/164] Fixes the Resurrect Cultist rune not working --- code/game/gamemodes/cult/runes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 69b730d574..4c80f53b94 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -538,7 +538,7 @@ structure_check() searches for nearby cultist structures required for the invoca mob_to_revive = input(user, "Choose a cultist to revive.", "Cultist to Revive") as null|anything in potential_revive_mobs else mob_to_revive = potential_revive_mobs[1] - if(!src || QDELETED(src) || rune_in_use || !validness_checks(mob_to_revive, user)) + if(QDELETED(src) || !validness_checks(mob_to_revive, user)) rune_in_use = FALSE return if(user.name == "Herbert West") From 97243fca3a60bbc76dc765a2f827ee003692b6b3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 16:05:43 -0500 Subject: [PATCH 081/164] Moved can_trigger_gun to item/weapon parent --- code/game/objects/items/weapons/flamethrower.dm | 8 ++------ code/game/objects/items/weapons/pneumaticCannon.dm | 7 ++----- code/game/objects/items/weapons/weaponry.dm | 6 ++++++ .../modules/mob/living/carbon/human/human_helpers.dm | 2 +- code/modules/mob/living/carbon/monkey/monkey.dm | 2 +- code/modules/mob/living/living.dm | 2 +- .../friendly/drone/extra_drone_types.dm | 2 +- code/modules/projectiles/gun.dm | 12 +++++------- 8 files changed, 19 insertions(+), 22 deletions(-) diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 0e6d6cc66f..1829538a01 100755 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -26,6 +26,7 @@ var/create_full = FALSE var/create_with_tank = FALSE var/igniter_type = /obj/item/device/assembly/igniter + trigger_guard = TRIGGER_GUARD_NORMAL /obj/item/weapon/flamethrower/Destroy() if(weldtool) @@ -69,12 +70,7 @@ if(flag) return // too close if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.dna.check_mutation(HULK)) - to_chat(user, "Your meaty finger is much too large for the trigger guard!") - return - if(NOGUNS in H.dna.species.species_traits) - to_chat(user, "Your fingers don't fit in the trigger guard!") + if(!can_trigger_gun(user)) return if(user && user.get_active_held_item() == src) // Make sure our user is still holding us var/turf/target_turf = get_turf(target) diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index d2f5714d5e..90c0eceaad 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -26,6 +26,7 @@ var/fire_mode = PCANNON_FIREALL var/automatic = FALSE var/clumsyCheck = TRUE + trigger_guard = TRIGGER_GUARD_NORMAL /obj/item/weapon/pneumatic_cannon/CanItemAutoclick() return automatic @@ -108,11 +109,7 @@ if(!istype(user) && !target) return var/discharge = 0 - if(user.dna.check_mutation(HULK)) - to_chat(user, "Your meaty finger is much too large for the trigger guard!") - return - if(NOGUNS in user.dna.species.species_traits) - to_chat(user, "Your fingers don't fit in the trigger guard!") + if(!can_trigger_gun(user)) return if(!loadedItems || !loadedWeightClass) to_chat(user, "\The [src] has nothing loaded.") diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index bb723ffb33..53bfe5d64c 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -1,4 +1,5 @@ /obj/item/weapon + var/trigger_guard = TRIGGER_GUARD_NONE /obj/item/weapon/banhammer desc = "A banhammer" @@ -584,3 +585,8 @@ throwforce = 0 flags = DROPDEL | ABSTRACT attack_verb = list("bopped") + +/obj/item/weapon/proc/can_trigger_gun(mob/living/user) + if(!user.can_use_guns(src)) + return FALSE + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 69b581995b..3dacc2f444 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -143,7 +143,7 @@ var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7 return protection -/mob/living/carbon/human/can_use_guns(var/obj/item/weapon/gun/G) +/mob/living/carbon/human/can_use_guns(var/obj/item/weapon/G) . = ..() if(G.trigger_guard == TRIGGER_GUARD_NORMAL) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index f57a48b5c6..9ed0a74d31 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -140,7 +140,7 @@ return 0 return 1 -/mob/living/carbon/monkey/can_use_guns(var/obj/item/weapon/gun/G) +/mob/living/carbon/monkey/can_use_guns(var/obj/item/weapon/G) return 1 /mob/living/carbon/monkey/angry diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b58fb0ec13..edf54e547a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -795,7 +795,7 @@ else to_chat(src, "You don't have the dexterity to do this!") return -/mob/living/proc/can_use_guns(var/obj/item/weapon/gun/G) +/mob/living/proc/can_use_guns(var/obj/item/weapon/G) if (G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser()) to_chat(src, "You don't have the dexterity to do this!") return 0 diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index c984194805..51d28df31b 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -176,7 +176,7 @@ else ..() -/mob/living/simple_animal/drone/cogscarab/can_use_guns(obj/item/weapon/gun/G) +/mob/living/simple_animal/drone/cogscarab/can_use_guns(obj/item/weapon/G) return GLOB.ratvar_awakens /mob/living/simple_animal/drone/cogscarab/get_armor_effectiveness() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 156a5ee81e..d5109a2c0c 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -27,7 +27,7 @@ var/recoil = 0 //boom boom shake the room var/clumsy_check = 1 var/obj/item/ammo_casing/chambered = null - var/trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers + trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers var/sawn_desc = null //description change if weapon is sawn-off var/sawn_state = SAWN_INTACT var/burst_size = 1 //how large a burst is @@ -188,12 +188,10 @@ -/obj/item/weapon/gun/proc/can_trigger_gun(var/mob/living/user) - - if(!handle_pins(user) || !user.can_use_guns(src)) - return 0 - - return 1 +/obj/item/weapon/gun/can_trigger_gun(mob/living/user) + . = ..() + if(!handle_pins(user)) + return FALSE /obj/item/weapon/gun/proc/handle_pins(mob/living/user) if(pin) From 048c782156035b3a7d59ff160152fdc131bfe543 Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Mon, 14 Aug 2017 17:09:11 -0600 Subject: [PATCH 082/164] xenomorph update A long overdue overhall and readdition of xenos --- .../new_player/sprite_accessories_Citadel.dm | 57 ++++++++++++------ .../carbon/human/species_types/furrypeople.dm | 24 ++++++++ icons/mob/human_parts_greyscale.dmi | Bin 43762 -> 44525 bytes icons/mob/xeno_parts_greyscale.dmi | Bin 0 -> 3061 bytes 4 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 icons/mob/xeno_parts_greyscale.dmi diff --git a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm index 9808923e33..2d01d365ff 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm @@ -464,7 +464,6 @@ /datum/sprite_accessory/mam_tails/rabbit name = "Rabbit" icon_state = "rabbit" - color_src = 0 icon = 'icons/mob/mam_bodyparts.dmi' /datum/sprite_accessory/mam_ears/rabbit @@ -673,49 +672,67 @@ //Xeno Dorsal Tubes /datum/sprite_accessory/xeno_dorsal - icon = 'icons/mob/exotic_bodyparts.dmi' - color_src = 0 + icon = 'icons/mob/xeno_parts_greyscale.dmi' /datum/sprite_accessory/xeno_dorsal/none name = "None" -/datum/sprite_accessory/xeno_dorsal/normal - name = "Dorsal Tubes" - icon_state = "dortubes" +/datum/sprite_accessory/xeno_dorsal/standard + name = "Standard" + icon_state = "standard" + icon = 'icons/mob/xeno_parts_greyscale.dmi' + +/datum/sprite_accessory/xeno_dorsal/royal + name = "Royal" + icon_state = "royal" + icon = 'icons/mob/xeno_parts_greyscale.dmi' + +/datum/sprite_accessory/xeno_dorsal/down + name = "Dorsal Down" + icon_state = "down" + icon = 'icons/mob/xeno_parts_greyscale.dmi' //Xeno Tail /datum/sprite_accessory/xeno_tail - icon = 'icons/mob/exotic_bodyparts.dmi' - color_src = 0 + icon = 'icons/mob/xeno_parts_greyscale.dmi' /datum/sprite_accessory/xeno_tail/none name = "None" -/datum/sprite_accessory/xeno_tail/normal +/datum/sprite_accessory/xeno_tail/standard name = "Xenomorph Tail" icon_state = "xeno" + icon = 'icons/mob/xeno_parts_greyscale.dmi' //Xeno Caste Heads //unused as of October 3, 2016 /datum/sprite_accessory/xeno_head - icon = 'icons/mob/exotic_bodyparts.dmi' - color_src = 0 + icon = 'icons/mob/xeno_parts_greyscale.dmi' /datum/sprite_accessory/xeno_head/none name = "None" +/datum/sprite_accessory/xeno_head/standard + name = "Standard" + icon_state = "standard" + icon = 'icons/mob/xeno_parts_greyscale.dmi' -/datum/sprite_accessory/xeno_head/hunter - name = "Hunter" - icon_state = "hunter" -/datum/sprite_accessory/xeno_head/drone - name = "Drone" - icon_state = "drone" +/datum/sprite_accessory/xeno_head/royal + name = "royal" + icon_state = "royal" + icon = 'icons/mob/xeno_parts_greyscale.dmi' + +/datum/sprite_accessory/xeno_head/hollywood + name = "hollywood" + icon_state = "hollywood" + icon = 'icons/mob/xeno_parts_greyscale.dmi' + +/datum/sprite_accessory/xeno_head/warrior + name = "warrior" + icon_state = "warrior" + icon = 'icons/mob/xeno_parts_greyscale.dmi' -/datum/sprite_accessory/xeno_head/sentinel - name = "Sentinel" - icon_state = "sentinel" /* //Slimecoon Parts /datum/sprite_accessory/slimecoon_ears diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index d612a4f061..1fc4e848ec 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -79,6 +79,30 @@ datum/species/mammal return TRUE //HERBIVOROUS// +//Alien// +/datum/species/xeno + // A cloning mistake, crossing human and xenomorph DNA + name = "xeno" + id = "xeno" + say_mod = "hisses" + default_color = "00FF00" + species_traits = list(MUTCOLORS,LIPS,DIGITIGRADE) + mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur",) + default_features = list("xenotail"="xeno","xenohead"="none","xenodorsal"="none","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None") + armor = 15 + heatmod = 1.5 + no_equip = list(slot_head) + attack_verb = "slash" + attack_sound = 'sound/weapons/slash.ogg' + miss_sound = 'sound/weapons/slashmiss.ogg' + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno + skinned_type = /obj/item/stack/sheet/animalhide/xeno + exotic_bloodtype = "L" + damage_overlay_type = "xeno" + roundstart = 1 + +//Praise the Omnissiah, A challange worthy of my skills - HS + //EXOTIC// //These races will likely include lots of downsides and upsides. Keep them relatively balanced.// /* diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index 968e12949b016810264ce8387373706fdd47e056..e7309556354492f8e627ff9200c8a627397d5ac9 100644 GIT binary patch literal 44525 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

Ltjqw{5-D@{$RpiQJ9AN+n)IA`Oh9)3>)fc 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 literal 43762 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 DQt}3> literal 0 HcmV?d00001 From 46c6a54a7578627ad3a4e661c7a141d935d1ef4d Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 18:38:55 -0500 Subject: [PATCH 083/164] Update misc.dm --- code/modules/clothing/head/misc.dm | 568 +++++++++++++++-------------- 1 file changed, 285 insertions(+), 283 deletions(-) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index ac82fc92db..348be6ad6d 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -1,291 +1,292 @@ - - -/obj/item/clothing/head/centhat - name = "\improper Centcom hat" - icon_state = "centcom" - desc = "It's good to be emperor." - item_state = "that" - flags_inv = 0 - armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50) - strip_delay = 80 - -/obj/item/clothing/head/powdered_wig - name = "powdered wig" - desc = "A powdered wig." - icon_state = "pwig" - item_state = "pwig" - -/obj/item/clothing/head/that - name = "top-hat" - desc = "It's an amish looking hat." - icon_state = "tophat" - item_state = "that" - dog_fashion = /datum/dog_fashion/head - throwforce = 1 - -/obj/item/clothing/head/canada - name = "striped red tophat" - desc = "it smells like fresh donut holes / il sent comme des trous de beignets frais" - icon_state = "canada" - item_state = "canada" - -/obj/item/clothing/head/redcoat - name = "redcoat's hat" - icon_state = "redcoat" - desc = "'I guess it's a redhead.'" - -/obj/item/clothing/head/mailman - name = "mailman's hat" - icon_state = "mailman" - desc = "'Right-on-time' mail service head wear." - -/obj/item/clothing/head/plaguedoctorhat - name = "plague doctor's hat" - desc = "These were once used by plague doctors. They're pretty much useless." - icon_state = "plaguedoctor" - permeability_coefficient = 0.01 - -/obj/item/clothing/head/hasturhood - name = "hastur's hood" - desc = "It's unspeakably stylish." - icon_state = "hasturhood" - flags_inv = HIDEHAIR - flags_cover = HEADCOVERSEYES - -/obj/item/clothing/head/nursehat - name = "nurse's hat" - desc = "It allows quick identification of trained medical personnel." - icon_state = "nursehat" + + +/obj/item/clothing/head/centhat + name = "\improper Centcom hat" + icon_state = "centcom" + desc = "It's good to be emperor." + item_state = "that" + flags_inv = 0 + armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50) + strip_delay = 80 + +/obj/item/clothing/head/powdered_wig + name = "powdered wig" + desc = "A powdered wig." + icon_state = "pwig" + item_state = "pwig" + +/obj/item/clothing/head/that + name = "top-hat" + desc = "It's an amish looking hat." + icon_state = "tophat" + item_state = "that" + dog_fashion = /datum/dog_fashion/head + throwforce = 1 + +/obj/item/clothing/head/canada + name = "striped red tophat" + desc = "it smells like fresh donut holes / il sent comme des trous de beignets frais" + icon_state = "canada" + item_state = "canada" + +/obj/item/clothing/head/redcoat + name = "redcoat's hat" + icon_state = "redcoat" + desc = "'I guess it's a redhead.'" + +/obj/item/clothing/head/mailman + name = "mailman's hat" + icon_state = "mailman" + desc = "'Right-on-time' mail service head wear." + +/obj/item/clothing/head/plaguedoctorhat + name = "plague doctor's hat" + desc = "These were once used by plague doctors. They're pretty much useless." + icon_state = "plaguedoctor" + permeability_coefficient = 0.01 + +/obj/item/clothing/head/hasturhood + name = "hastur's hood" + desc = "It's unspeakably stylish." + icon_state = "hasturhood" + flags_inv = HIDEHAIR + flags_cover = HEADCOVERSEYES + +/obj/item/clothing/head/nursehat + name = "nurse's hat" + desc = "It allows quick identification of trained medical personnel." + icon_state = "nursehat" dynamic_hair_suffix = "" - - dog_fashion = /datum/dog_fashion/head/nurse - -/obj/item/clothing/head/syndicatefake - name = "black space-helmet replica" - icon_state = "syndicate-helm-black-red" - item_state = "syndicate-helm-black-red" - desc = "A plastic replica of a Syndicate agent's space helmet. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!" - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -/obj/item/clothing/head/cueball - name = "cueball helmet" - desc = "A large, featureless white orb meant to be worn on your head. How do you even see out of this thing?" - icon_state = "cueball" - item_state="cueball" - flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -/obj/item/clothing/head/snowman - name = "Snowman Head" - desc = "A ball of white styrofoam. So festive." - icon_state = "snowman_h" - item_state = "snowman_h" - flags_cover = HEADCOVERSEYES - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -/obj/item/clothing/head/justice - name = "justice hat" - desc = "Fight for what's righteous!" - icon_state = "justicered" - item_state = "justicered" - flags_inv = HIDEHAIR|HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR - flags_cover = HEADCOVERSEYES - -/obj/item/clothing/head/justice/blue - icon_state = "justiceblue" - item_state = "justiceblue" - -/obj/item/clothing/head/justice/yellow - icon_state = "justiceyellow" - item_state = "justiceyellow" - -/obj/item/clothing/head/justice/green - icon_state = "justicegreen" - item_state = "justicegreen" - -/obj/item/clothing/head/justice/pink - icon_state = "justicepink" - item_state = "justicepink" - -/obj/item/clothing/head/rabbitears - name = "rabbit ears" - desc = "Wearing these makes you look useless, and only good for your sex appeal." - icon_state = "bunny" + + dog_fashion = /datum/dog_fashion/head/nurse + +/obj/item/clothing/head/syndicatefake + name = "black space-helmet replica" + icon_state = "syndicate-helm-black-red" + item_state = "syndicate-helm-black-red" + desc = "A plastic replica of a Syndicate agent's space helmet. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!" + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + +/obj/item/clothing/head/cueball + name = "cueball helmet" + desc = "A large, featureless white orb meant to be worn on your head. How do you even see out of this thing?" + icon_state = "cueball" + item_state="cueball" + flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + +/obj/item/clothing/head/snowman + name = "Snowman Head" + desc = "A ball of white styrofoam. So festive." + icon_state = "snowman_h" + item_state = "snowman_h" + flags_cover = HEADCOVERSEYES + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + +/obj/item/clothing/head/justice + name = "justice hat" + desc = "Fight for what's righteous!" + icon_state = "justicered" + item_state = "justicered" + flags_inv = HIDEHAIR|HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR + flags_cover = HEADCOVERSEYES + +/obj/item/clothing/head/justice/blue + icon_state = "justiceblue" + item_state = "justiceblue" + +/obj/item/clothing/head/justice/yellow + icon_state = "justiceyellow" + item_state = "justiceyellow" + +/obj/item/clothing/head/justice/green + icon_state = "justicegreen" + item_state = "justicegreen" + +/obj/item/clothing/head/justice/pink + icon_state = "justicepink" + item_state = "justicepink" + +/obj/item/clothing/head/rabbitears + name = "rabbit ears" + desc = "Wearing these makes you look useless, and only good for your sex appeal." + icon_state = "bunny" dynamic_hair_suffix = "" - - dog_fashion = /datum/dog_fashion/head/rabbit - - -/obj/item/clothing/head/flatcap - name = "flat cap" - desc = "A working man's cap." - icon_state = "flat_cap" - item_state = "detective" - -/obj/item/clothing/head/pirate - name = "pirate hat" - desc = "Yarr." - icon_state = "pirate" - item_state = "pirate" - dog_fashion = /datum/dog_fashion/head/pirate - -/obj/item/clothing/head/pirate/captain - icon_state = "hgpiratecap" - item_state = "hgpiratecap" - -/obj/item/clothing/head/bandana - name = "pirate bandana" - desc = "Yarr." - icon_state = "bandana" - item_state = "bandana" + + dog_fashion = /datum/dog_fashion/head/rabbit + + +/obj/item/clothing/head/flatcap + name = "flat cap" + desc = "A working man's cap." + icon_state = "flat_cap" + item_state = "detective" + +/obj/item/clothing/head/pirate + name = "pirate hat" + desc = "Yarr." + icon_state = "pirate" + item_state = "pirate" + dog_fashion = /datum/dog_fashion/head/pirate + +/obj/item/clothing/head/pirate/captain + icon_state = "hgpiratecap" + item_state = "hgpiratecap" + +/obj/item/clothing/head/bandana + name = "pirate bandana" + desc = "Yarr." + icon_state = "bandana" + item_state = "bandana" dynamic_hair_suffix = "" - -/obj/item/clothing/head/bowler - name = "bowler-hat" - desc = "Gentleman, elite aboard!" - icon_state = "bowler" - item_state = "bowler" + +/obj/item/clothing/head/bowler + name = "bowler-hat" + desc = "Gentleman, elite aboard!" + icon_state = "bowler" + item_state = "bowler" dynamic_hair_suffix = "" - -/obj/item/clothing/head/witchwig - name = "witch costume wig" - desc = "Eeeee~heheheheheheh!" - icon_state = "witch" - item_state = "witch" - flags_inv = HIDEHAIR - -/obj/item/clothing/head/chicken - name = "chicken suit head" - desc = "Bkaw!" - icon_state = "chickenhead" - item_state = "chickensuit" - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -/obj/item/clothing/head/griffin - name = "griffon head" - desc = "Why not 'eagle head'? Who knows." - icon_state = "griffinhat" - item_state = "griffinhat" - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -/obj/item/clothing/head/bearpelt - name = "bear pelt hat" - desc = "Fuzzy." - icon_state = "bearpelt" - item_state = "bearpelt" - -/obj/item/clothing/head/xenos - name = "xenos helmet" - icon_state = "xenos" - item_state = "xenos_helm" - desc = "A helmet made out of chitinous alien hide." - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -/obj/item/clothing/head/fedora - name = "fedora" - icon_state = "fedora" - item_state = "fedora" - armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 50) - desc = "A really cool hat if you're a mobster. A really lame hat if you're not." - pockets = /obj/item/weapon/storage/internal/pocket/small - -/obj/item/clothing/head/fedora/suicide_act(mob/user) - if(user.gender == FEMALE) - return 0 - var/mob/living/carbon/human/H = user - user.visible_message("[user] is donning [src]! It looks like they're trying to be nice to girls.") - user.say("M'lady.") - sleep(10) - H.facial_hair_style = "Neckbeard" - return(BRUTELOSS) - -/obj/item/clothing/head/sombrero - name = "sombrero" - icon_state = "sombrero" - item_state = "sombrero" - desc = "You can practically taste the fiesta." - flags_inv = HIDEHAIR - - dog_fashion = /datum/dog_fashion/head/sombrero - -/obj/item/clothing/head/sombrero/green - name = "green sombrero" - icon_state = "greensombrero" - item_state = "greensombrero" - desc = "As elegant as a dancing cactus." - flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS - dog_fashion = null - -/obj/item/clothing/head/sombrero/shamebrero - name = "shamebrero" - icon_state = "shamebrero" - item_state = "shamebrero" - desc = "Once it's on, it never comes off." - flags = NODROP - dog_fashion = null - -/obj/item/clothing/head/cone - desc = "This cone is trying to warn you of something!" - name = "warning cone" - icon = 'icons/obj/janitor.dmi' - icon_state = "cone" - item_state = "cone" - force = 1 - throwforce = 3 - throw_speed = 2 - throw_range = 5 - w_class = WEIGHT_CLASS_SMALL - attack_verb = list("warned", "cautioned", "smashed") - resistance_flags = 0 - -/obj/item/clothing/head/santa - name = "santa hat" - desc = "On the first day of christmas my employer gave to me!" - icon_state = "santahatnorm" - item_state = "that" - cold_protection = HEAD - min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - dog_fashion = /datum/dog_fashion/head/santa - -/obj/item/clothing/head/jester - name = "jester hat" + +/obj/item/clothing/head/witchwig + name = "witch costume wig" + desc = "Eeeee~heheheheheheh!" + icon_state = "witch" + item_state = "witch" + flags_inv = HIDEHAIR + +/obj/item/clothing/head/chicken + name = "chicken suit head" + desc = "Bkaw!" + icon_state = "chickenhead" + item_state = "chickensuit" + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + +/obj/item/clothing/head/griffin + name = "griffon head" + desc = "Why not 'eagle head'? Who knows." + icon_state = "griffinhat" + item_state = "griffinhat" + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + +/obj/item/clothing/head/bearpelt + name = "bear pelt hat" + desc = "Fuzzy." + icon_state = "bearpelt" + item_state = "bearpelt" + +/obj/item/clothing/head/xenos + name = "xenos helmet" + icon_state = "xenos" + item_state = "xenos_helm" + desc = "A helmet made out of chitinous alien hide." + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + +/obj/item/clothing/head/fedora + name = "fedora" + icon_state = "fedora" + item_state = "fedora" + armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 50) + desc = "A really cool hat if you're a mobster. A really lame hat if you're not." + pockets = /obj/item/weapon/storage/internal/pocket/small + +/obj/item/clothing/head/fedora/suicide_act(mob/user) + if(user.gender == FEMALE) + return 0 + var/mob/living/carbon/human/H = user + user.visible_message("[user] is donning [src]! It looks like they're trying to be nice to girls.") + user.say("M'lady.") + sleep(10) + H.facial_hair_style = "Neckbeard" + return(BRUTELOSS) + +/obj/item/clothing/head/sombrero + name = "sombrero" + icon_state = "sombrero" + item_state = "sombrero" + desc = "You can practically taste the fiesta." + flags_inv = HIDEHAIR + + dog_fashion = /datum/dog_fashion/head/sombrero + +/obj/item/clothing/head/sombrero/green + name = "green sombrero" + icon_state = "greensombrero" + item_state = "greensombrero" + desc = "As elegant as a dancing cactus." + flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS + dog_fashion = null + +/obj/item/clothing/head/sombrero/shamebrero + name = "shamebrero" + icon_state = "shamebrero" + item_state = "shamebrero" + desc = "Once it's on, it never comes off." + flags = NODROP + dog_fashion = null + +/obj/item/clothing/head/cone + desc = "This cone is trying to warn you of something!" + name = "warning cone" + icon = 'icons/obj/janitor.dmi' + icon_state = "cone" + item_state = "cone" + force = 1 + throwforce = 3 + throw_speed = 2 + throw_range = 5 + w_class = WEIGHT_CLASS_SMALL + attack_verb = list("warned", "cautioned", "smashed") + resistance_flags = 0 + +/obj/item/clothing/head/santa + name = "santa hat" + desc = "On the first day of christmas my employer gave to me!" + icon_state = "santahatnorm" + item_state = "that" + cold_protection = HEAD + min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + dog_fashion = /datum/dog_fashion/head/santa + +/obj/item/clothing/head/jester + name = "jester hat" desc = "A hat with bells, to add some merriness to the suit." - icon_state = "jester_hat" - -/obj/item/clothing/head/rice_hat - name = "rice hat" - desc = "Welcome to the rice fields, motherfucker." - icon_state = "rice_hat" - -/obj/item/clothing/head/lizard - name = "lizardskin cloche hat" - desc = "How many lizards died to make this hat? Not enough." - icon_state = "lizard" - -/obj/item/clothing/head/papersack - name = "paper sack hat" - desc = "A paper sack with crude holes cut out for eyes. Useful for hiding one's identity or ugliness." - icon_state = "papersack" - flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS - -/obj/item/clothing/head/papersack/smiley - name = "paper sack hat" - desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all." - icon_state = "papersack_smile" - flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS - -/obj/item/clothing/head/crown - name = "crown" - desc = "A crown fit for a king, a petty king maybe." - icon_state = "crown" - armor = list(melee = 15, bullet = 0, laser = 0,energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) - resistance_flags = FIRE_PROOF + icon_state = "jester_hat" dynamic_hair_suffix = "" - -/obj/item/clothing/head/crown/fancy - name = "magnificent crown" - desc = "A crown worn by only the highest emperors of the land." - icon_state = "fancycrown" + +/obj/item/clothing/head/rice_hat + name = "rice hat" + desc = "Welcome to the rice fields, motherfucker." + icon_state = "rice_hat" + +/obj/item/clothing/head/lizard + name = "lizardskin cloche hat" + desc = "How many lizards died to make this hat? Not enough." + icon_state = "lizard" + +/obj/item/clothing/head/papersack + name = "paper sack hat" + desc = "A paper sack with crude holes cut out for eyes. Useful for hiding one's identity or ugliness." + icon_state = "papersack" + flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS + +/obj/item/clothing/head/papersack/smiley + name = "paper sack hat" + desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all." + icon_state = "papersack_smile" + flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS + +/obj/item/clothing/head/crown + name = "crown" + desc = "A crown fit for a king, a petty king maybe." + icon_state = "crown" + armor = list(melee = 15, bullet = 0, laser = 0,energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) + resistance_flags = FIRE_PROOF + dynamic_hair_suffix = "" + +/obj/item/clothing/head/crown/fancy + name = "magnificent crown" + desc = "A crown worn by only the highest emperors of the land." + icon_state = "fancycrown" /obj/item/clothing/head/scarecrow_hat name = "scarecrow hat" @@ -301,4 +302,5 @@ /obj/item/clothing/head/jester/alt name = "jester hat" desc = "A hat with bells, to add some merriness to the suit." - icon_state = "jester_hat2" \ No newline at end of file + icon_state = "jester_hat2" + dynamic_hair_suffix = "" From 9b57f5fd62c954bd2482bcee9a71664264b69101 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 18:39:22 -0500 Subject: [PATCH 084/164] Update collectable.dm --- code/modules/clothing/head/collectable.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 6c7acefe8f..67ce9ea370 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -4,7 +4,6 @@ /obj/item/clothing/head/collectable name = "collectable hat" desc = "A rare collectable hat." - dynamic_hair_suffix = "+detective" /obj/item/clothing/head/collectable/petehat name = "ultra rare Pete's hat!" From 98ff124b68213796fc98b00054dab365da6a9202 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 18:50:44 -0500 Subject: [PATCH 085/164] Update shieldgen.dm --- code/game/machinery/shieldgen.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index a7d857844a..fbfbe61c0f 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -10,10 +10,11 @@ max_integrity = 200 //The shield can only take so much beating (prevents perma-prisons) CanAtmosPass = ATMOS_PASS_DENSITY -/obj/structure/emergency_shield/New() - src.setDir(pick(1,2,3,4)) - ..() - air_update_turf(1) +/obj/structure/emergency_shield/Initialize() + . = ..() + setDir(pick(1,2,3,4)) + setDir(pick(GLOB.cardinals)) + air_update_turf(1) /obj/structure/emergency_shield/Destroy() density = FALSE From 2719f23e52a352e09323625f92210eee1b8350cb Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 18:53:01 -0500 Subject: [PATCH 086/164] Update shieldgen.dm --- code/game/machinery/shieldgen.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index fbfbe61c0f..0629eea303 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -10,9 +10,8 @@ max_integrity = 200 //The shield can only take so much beating (prevents perma-prisons) CanAtmosPass = ATMOS_PASS_DENSITY -/obj/structure/emergency_shield/Initialize() - . = ..() - setDir(pick(1,2,3,4)) + /obj/structure/emergency_shield/Initialize() + . = ..() setDir(pick(GLOB.cardinals)) air_update_turf(1) From d8e7194e6dab5e8c20a60a87ab39c0ae661533df Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 18:53:54 -0500 Subject: [PATCH 087/164] Automatic changelog generation for PR #2371 [ci skip] --- html/changelogs/AutoChangeLog-pr-2371.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2371.yml diff --git a/html/changelogs/AutoChangeLog-pr-2371.yml b/html/changelogs/AutoChangeLog-pr-2371.yml new file mode 100644 index 0000000000..ec1810b8a6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2371.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - bugfix: "The Resurrect Cultist rune now works as intended." From f2c011a37b2407e1249ce2ac9dd081d109ec9a6f Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 18:55:25 -0500 Subject: [PATCH 088/164] Update console.dm --- code/modules/cargo/console.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 15117c1cbb..7926cfc34d 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -145,7 +145,7 @@ var/reason = "" if(requestonly) - reason = input("Reason:", name, "") as text|null + reason = stripped_input("Reason:", name, "") if(isnull(reason) || ..()) return From 0c72b3ec53dafed312cd723314a50421921b1570 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 19:09:51 -0500 Subject: [PATCH 089/164] Update world.dm --- code/world.dm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/code/world.dm b/code/world.dm index e115ed6934..a0c5ae43f8 100644 --- a/code/world.dm +++ b/code/world.dm @@ -58,12 +58,11 @@ /world/proc/CheckSchemaVersion() if(config.sql_enabled) if(SSdbcore.Connect()) - log_world("Database connection established.") var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1") - db_version.Execute() - if(db_version.NextRow()) - var/db_major = db_version.item[1] - var/db_minor = db_version.item[2] + query_db_version.Execute() + if(query_db_version.NextRow()) + var/db_major = text2num(query_db_version.item[1]) + var/db_minor = text2num(query_db_version.item[2]) if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION) message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") From 64b3fe43d9a8412d534619c3781b62eeb26943dd Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 19:38:43 -0500 Subject: [PATCH 090/164] Update shieldgen.dm --- code/game/machinery/shieldgen.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 0629eea303..c857ddaf16 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -10,10 +10,10 @@ max_integrity = 200 //The shield can only take so much beating (prevents perma-prisons) CanAtmosPass = ATMOS_PASS_DENSITY - /obj/structure/emergency_shield/Initialize() - . = ..() +/obj/structure/emergency_shield/Initialize() + . = ..() setDir(pick(GLOB.cardinals)) - air_update_turf(1) + air_update_turf(1) /obj/structure/emergency_shield/Destroy() density = FALSE From 1d4e15502aebbf233f740d88e195a60cc0683394 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 19:40:45 -0500 Subject: [PATCH 091/164] Update browserOutput.dm --- code/modules/goonchat/browserOutput.dm | 136 +------------------------ 1 file changed, 3 insertions(+), 133 deletions(-) diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 7dd0fd5bb3..cc44c47f4e 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -100,7 +100,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic sendClientData() //do not convert to to_chat() - owner << {"If you can see this, update byond."} + SEND_TEXT(owner, "If you can see this, update byond.") pingLoop() @@ -152,7 +152,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic if (found.len > 0) //TODO: add a new evasion ban for the CURRENT client details, using the matched row details message_admins("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") - log_admin_private("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") + log_admin_private("[key_name(owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") cookieSent = TRUE @@ -166,135 +166,6 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic //Global chat procs -//Converts an icon to base64. Operates by putting the icon in the iconCache savefile, -// exporting it as text, and then parsing the base64 from that. -// (This relies on byond automatically storing icons in savefiles as base64) -/proc/icon2base64(icon/icon, iconKey = "misc") - if (!isicon(icon)) - return FALSE - GLOB.iconCache[iconKey] << icon - var/iconData = GLOB.iconCache.ExportText(iconKey) - var/list/partial = splittext(iconData, "{") - return replacetext(copytext(partial[2], 3, -5), "\n", "") - -/proc/icon2html(thing, target, icon_state, dir, frame = 1, moving) - if (!thing) - return - var/static/datum/callback/CB = CALLBACK(GLOBAL_PROC, .proc/send_asset) - - var/key - var/icon/I = thing - if (!target) - return - if (target == world) - target = GLOB.clients - - var/list/targets - if (!islist(target)) - targets = list(target) - else - targets = target - if (!targets.len) - return - debug_usr("start") - if (!isicon(I)) - debug_usr("not icon") - if (isfile(thing)) //special snowflake - debug_usr("file") - var/name = sanitize_filename("bicon.[thing]") - debug_usr("file:[name]") - register_asset(name, thing) - var/list/callbacks - var/list/callback_args = list() - for (var/thing2 in targets) - callbacks += CB - callback_args[++callback_args.len] = list(thing2, name, TRUE) - callback_select(callbacks, callback_args, savereturns = FALSE) - return "" - debug_usr("not file") - var/atom/A - if (isnull(dir)) - dir = A.dir - if (isnull(icon_state)) - icon_state = A.icon_state - I = A.icon - if (ishuman(thing)) // Shitty workaround for a BYOND issue. - debug_usr("human") - var/icon/temp = I - I = icon() - I.Insert(temp, dir = SOUTH) - dir = SOUTH - else - debug_usr("icon") - if (isnull(dir)) - dir = SOUTH - if (isnull(icon_state)) - icon_state = "" - - I = icon(I, icon_state, dir, frame) - - key = sanitize_filename("bicon.[md5(icon2base64(I))].[icon_state].[dir].png") - debug_usr("key:[key]") - register_asset(key, I) - var/list/callbacks = list() - var/list/callback_args = list() - for (var/thing2 in targets) - callbacks += CB - callback_args[++callback_args.len] = list(thing2, key, TRUE) - - callback_select(callbacks, callback_args, savereturns = FALSE) - return "" - -/proc/icon2base64html(thing) - if (!thing) - return - var/static/list/bicon_cache = list() - if (isicon(thing)) - var/icon/I = thing - var/icon_base64 = icon2base64(I) - - if (I.Height() > world.icon_size || I.Width() > world.icon_size) - var/icon_md5 = md5(icon_base64) - debug_admins(icon_md5) - icon_base64 = bicon_cache[icon_md5] - if (!icon_base64) // Doesn't exist yet, make it. - I = icon(I) - I.Scale(world.icon_size, world.icon_size) - bicon_cache[icon_md5] = icon_base64 = icon2base64(I) - - - return "" - - // Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with. - var/atom/A = thing - var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]" - - - if (!bicon_cache[key]) // Doesn't exist, make it. - var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1) - if (ishuman(thing)) // Shitty workaround for a BYOND issue. - var/icon/temp = I - I = icon() - I.Insert(temp, dir = SOUTH) - - if (I.Height() > world.icon_size || I.Width() > world.icon_size) - I.Scale(world.icon_size, world.icon_size) - - bicon_cache[key] = icon2base64(I, key) - - return "" - -//Costlier version of icon2html() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. -/proc/costly_icon2html(thing, target) - if (!thing) - return - - if (isicon(thing)) - return icon2html(thing, target) - - var/icon/I = getFlatIcon(thing) - return icon2html(I, target) - /proc/to_chat(target, message) if(!target) return @@ -302,7 +173,6 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic //Ok so I did my best but I accept that some calls to this will be for shit like sound and images //It stands that we PROBABLY don't want to output those to the browser output so just handle them here if (istype(message, /image) || istype(message, /sound) || istype(target, /savefile)) - target << message CRASH("Invalid message! [message]") if(!istext(message)) @@ -333,7 +203,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic continue //Send it to the old style output window. - C << original_message + SEND_TEXT(C, original_message) if(!C.chatOutput || C.chatOutput.broken) // A player who hasn't updated his skin file. continue From c4090f5484559165cb81101a198ca4f2c014529f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 20:48:23 -0500 Subject: [PATCH 092/164] Automatic changelog generation for PR #2278 [ci skip] --- html/changelogs/AutoChangeLog-pr-2278.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2278.yml diff --git a/html/changelogs/AutoChangeLog-pr-2278.yml b/html/changelogs/AutoChangeLog-pr-2278.yml new file mode 100644 index 0000000000..111ae24812 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2278.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Fixed hair sticking through headgear." From 7e351b9b8ea6ce46887602b371108836c27003dc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 15 Aug 2017 05:09:00 -0500 Subject: [PATCH 093/164] =?UTF-8?q?=E2=9D=84=20---=20=3D=3D=3D=3D=20D=20E?= =?UTF-8?q?=20E=20P=20=20=20F=20R=20E=20E=20Z=20E=20=3D=3D=3D=3D=20---=20?= =?UTF-8?q?=E2=9D=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/PULL_REQUEST_TEMPLATE.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 82633fdc70..f67f095a4f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,3 @@ -[Feature Freeze!]: # We are currently not considering any balance or antagonist oriented pull requests. Full details, as well as ways to bypass this freeze, are available here https://github.com/tgstation/tgstation/pull/28223 - - [Changelogs]: # (Please make a changelog if you're adding, removing or changing content that'll affect players. This includes, but is not limited to, new features, sprites, sounds; balance changes; map edits and important fixes) []: # (See here for how to easily make a changelog: https://github.com/tgstation/tgstation/wiki/Changelogs. An example changelog has been provided below. Please edit or remove) From 3b1a0a0dc05e990a4c0e33dc4ef49e31336af2fe Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 15 Aug 2017 05:11:08 -0500 Subject: [PATCH 094/164] Fixes Singulo, Tesla, Reality Breaks, & Narsie being frozen by freon --- code/modules/power/singularity/singularity.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 07190b102c..1b65da86ab 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -26,7 +26,7 @@ var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing var/last_warning var/consumedSupermatter = 0 //If the singularity has eaten a supermatter shard and can go to stage six - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF dangerous_possession = TRUE /obj/singularity/Initialize(mapload, starting_energy = 50) From 402b9a6cab3ce916a6e661721b41240b4fef60e7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 15 Aug 2017 05:55:57 -0500 Subject: [PATCH 095/164] Fixes mining hardsuit heat_protection --- code/modules/clothing/spacesuits/hardsuit.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 00f622b751..19f777ac4a 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -200,7 +200,7 @@ item_color = "mining" max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF - heat_protection = CHEST|GROIN|LEGS|ARMS + heat_protection = HEAD armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 75) brightness_on = 7 allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator) @@ -216,6 +216,7 @@ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 75) allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/storage/bag/ore, /obj/item/weapon/pickaxe) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining + heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Syndicate hardsuit /obj/item/clothing/head/helmet/space/hardsuit/syndi From fdc4a4403bbb90bffaff791a301c493a3f877d70 Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Tue, 15 Aug 2017 07:02:57 -0600 Subject: [PATCH 096/164] headupdate --- icons/mob/xeno_parts_greyscale.dmi | Bin 3061 -> 3103 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/xeno_parts_greyscale.dmi b/icons/mob/xeno_parts_greyscale.dmi index ba6b8e5e80cad658514f4aec1204812446eaf13a..8b4630afe7f8a6a80b3fc08ef7883255c7f0ac2a 100644 GIT binary patch delta 2767 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 V-TGW(+_V4y002ovPDHLkV1lbOXEy)< delta 2725 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 From a8c706126d4f261fad9e72cf71921cdfa1da2f6c Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Tue, 15 Aug 2017 07:25:47 -0600 Subject: [PATCH 097/164] headupdates --- icons/mob/xeno_parts_greyscale.dmi | Bin 3103 -> 3103 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/xeno_parts_greyscale.dmi b/icons/mob/xeno_parts_greyscale.dmi index 8b4630afe7f8a6a80b3fc08ef7883255c7f0ac2a..3e180e8baaf9f0b7e43f116d6b0f8cdad1698cb8 100644 GIT binary patch delta 2474 zcmV;b303x=7@ruh!U2DoF~$A;@OBp}@~i8c154Q@7Bp~*PK)xZ>zf@`QC4V2Ueg;>G&#v1 zQ{U{c7irOYeTpV0`D5yv9i|>&AbP4Up5%|IZ+4iv1MOP$efxh9CFzOzW9pk7_GVWV z-FX##Z!}QST4Mf~`eui{RUYxwG-Gg*M_nI55ClOG z1VIo)UeO(|Qv_kwYb-bCScXQ6jSmdndfy|6+9k(yywu%5!&ZFr+ubVERf zVv|?h4CPhu%2t1T16J8}fx4!#I_JovMb67Ge|4|JQF&g@QeK4x4HO$F)~g&E%m%It zZqqf*aor}&FM6>4T|Y~C6)eevPUyiZY#{71?14TX!2IC>R#ACg&Qe}!;2toLg$+Q- ziPbBpOVT{R+`$0l4?T#&Wx0HsV#mtRz|euHLNVOrKK6frk3C?zHPl|QjE30AgIh3N z_tQNHyI6buMf>+K)v9pZAQ}PVBR~dQ7k!l8uJB!$eIS>Y#~?Zct<-~|H_xibKzq+a zFY>@E(waUbt&qLD8F2vbBd3M_2IVLf~tMg-ZLq~Bcy7V1beJ+M1AoQGVrZf z9s5dfxq}Q;wU649cP<-nzdEZ53aupxvL>b3I zx_y5l<~KVai+Li|=Lm<$_PbGFUC}X0S-!qB8~fq zb&`)*>>tJR04Tp)A8U7o7-&IS`|A&7c#Po1jz?t~zrzlaCAH?CZ=~bk+PY?t_ z5O?TX>3JTMmSmutTp%TR(dgHbfwIY{!29JHqoO6ZS5GvdRbHAc)3&Dv2`)@bTn2Ty zJ^k|}1LYyHTxyE;6h=?bSKPx&V^l`pqZi}TmO>-%9%PEsTCP0U+LNNjHYjZzJ>!3y zWc^}kj$6`gslm}KR$l2#`Jska5EC^| z*u&cQvAlFQ74)HG;K<~iGnIj(*vTMdfU!-SxAM5Ej%N zePoEPIBhh-N#d%E#ejv5S#ZBI|$lK!^}uDAKUpR$V^JX!`4xZmA92+apqbD+039ENKPb`z7 z|LNW~3LhO#z0Fv6V=fmcK~V4hEFEl`{^$N01r>@Pu~bBvKW`h+nfEsw=KpvgOJcCS z1LQJ`KhKp5ndc!FGVb?tII4nG_01Z67q6G ztdN%*;)Fcn{|WZt-^$uk-G!RqPLPGSh0q{-!`uLO)~V$+jX%YyC|ux*ce-Q&+3_9tv0=aGRL54~}NT=@K_ zFe>VH<^)45535dj2L`cX5S)V-jBDEC^B@54i86lo<(Kd-bItTGY*7A} zSAQ8|0}pceiN^?vHzpU;L zS68t7)zx27`37R6udxd(&@oe3 ztxVDHmR_D92!bF8f*=Tj_^2@w!`<$Ti_Z&#eU1M^Id%lY=Ha1ap<#%}v{Z`QSU&st z_HTf6w7*`xUBd?u+E*&A@F8^Oe%-_GJU;?q7P#&<7LT-2vDcGd6|gi|BN$=>c^QPA zz!mgE7W7;-4pR>>5It2FPx8mqH#TBIjk8zq;4qs5~!cDX+qU28s<7>s1a7W&_s+ zx9OVZxNZ~X7d=@2uAim63YO$SC-h(yHV}3h_CTKxVE*s`tEfCLXDP2Va1R*B!Umw^ z#Of8)C21aD?qGoOhaN=XvRpn*v14UuVCX!Di#|$kSNJZ>K9I}HV-OvJR_ejfn`c#IpuOjz z@(%ZL13pJxW|i>)dF2W;Ff89sEI$U7(DwFV=yio70|gJVzR-YKx zkBV2N^mQacmjuPwx)k+AlwYpTImJiB`f%HALDfEL@0pb05mL2Ff<4wZqQ3YD8TeML zj(sJ#+(8Da+DGllJC_Z(U!7G2h1QY;T80di*IFH+2^%_~Ah*xZFmYZ;f~$1`qKso9 z-9CR2^P3%z#XOPfbA&@=``sw8u4o_G%;XA@kF0$m)sVK9mtdE%zL+ex00*T)k;Z+* zI>|>Y_K)Iu0F+;@kF~o(474Dvea)0tO`Ho5WeXl*mb4y@@+<1IH-#$Tuuf~Aou0}S zc0ix8{a>KOBXLZQ&LdHNcIrv#NmZn`|HFR|VtP0%;7t7VQ4>HAREmt0F?MYE%84mf z>|yQuSYEoD3i?noaAfk%naaRX>|_u!L7>ze(Lkiv$$FkAmKOxYT5)0yW^}1@m6NsZ zf=dq*H$2*+w($rVDCvJ&l#MFRzWPPd9%`p@dB(~QoBY7ZW4Y)yuQ z^m2%%*u_XHk@Y`&AVi2S6lqv)t1h2qH2rl;x6}r1ZoPjtF;J9rB?D9RKgoYUN64W! zY}-~D(y&@P>hs{)`^|~R#U7C-Ns9g_=9d*t-F20Y(i>s#D-&v)(GwZ0gw?yACzeUk z|8#E~g^v!W-e#=3F_#OJAgFhLmJT*e|8swhf(pftSSq5-pSO+Z%=;S-^M5>$B{A6E z0dkqepXbVj%=3^78Tb3Sa-n}@VAc2YW#Dkh25wD0W`i9B!51)W`WK5_CK>;Vff54}ruuG4LGd@>7BybP~<9Ib&HzS4h%G0|xx%3)J; zq!mExr%D&9W7A0zbEd}Fg_{TrUzKMz2QEks>2-Usd1(tqY~&Oy!h?8{Xok9rXY`;- z!^=z;ou0euNn)sCQ_(X$^f?tq%;}^z+bljCQoxCqW>! zUV`R(nG_uog_l4zkB zgpm^y>h<=ZZ-#&c2&`9@jfz){rweQ2tHAFrm_EhY!Rar@7^Vlxr^f-x?UCwSnMMRf*=Tj zAP9n39No!BKEdw~%p;>4<@wa1C1YIXTVK>Yj86A-F7;~Z;P(gS5d8kY95Szhx@?5^ o2j-A&uFum1K@bE%5FZc!1rYGv`dnk&v;Y7A07*qoM6N<$g1)oVGXMYp From 5885d490ac2db5fdc4fdea3fdafe4f61098ffe16 Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Tue, 15 Aug 2017 07:35:35 -0600 Subject: [PATCH 098/164] futher updates to head and spines head and spine updates --- icons/mob/xeno_parts_greyscale.dmi | Bin 3103 -> 3104 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/xeno_parts_greyscale.dmi b/icons/mob/xeno_parts_greyscale.dmi index 3e180e8baaf9f0b7e43f116d6b0f8cdad1698cb8..44456309a763f59264a6812875f6cb1e32711564 100644 GIT binary patch delta 2768 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 V-hvq6Z;b!|002ovPDHLkV1i+5Qh)#e From 22ad3c6afe4441d6dfcf5651b870188b2effefa5 Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Tue, 15 Aug 2017 08:03:08 -0600 Subject: [PATCH 099/164] xeno markings addition added markings to the xenomorph, for polish --- .../new_player/sprite_accessories_Citadel.dm | 7 +++++++ .../carbon/human/species_types/furrypeople.dm | 4 ++-- icons/mob/mam_body_markings.dmi | Bin 43972 -> 45530 bytes 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm index 2d01d365ff..0b21852a8e 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm @@ -594,6 +594,13 @@ extra2 = 1 icon = 'icons/mob/mam_body_markings.dmi' + /datum/sprite_accessory/mam_body_markings/xeno + name = "Xeno" + icon_state = "xeno" + color_src = MUTCOLORS2 + extra_color_src = MUTCOLORS3 + gender_specific = 1 + /****************************************** ************ Taur Bodies ****************** *******************************************/ diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 1fc4e848ec..ad0cddabf1 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -87,8 +87,8 @@ datum/species/mammal say_mod = "hisses" default_color = "00FF00" species_traits = list(MUTCOLORS,LIPS,DIGITIGRADE) - mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur",) - default_features = list("xenotail"="xeno","xenohead"="none","xenodorsal"="none","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None") + mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur","mam_body_markings") + default_features = list("xenotail"="xeno","xenohead"="none","xenodorsal"="none","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "xeno") armor = 15 heatmod = 1.5 no_equip = list(slot_head) diff --git a/icons/mob/mam_body_markings.dmi b/icons/mob/mam_body_markings.dmi index a50181340db49512940e42edff85fd9cbb29c42d..737fa15c4276828ae4f9b4c2493a2721865494df 100644 GIT binary patch literal 45530 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 Bik|=g literal 43972 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 From 1cc9a1decf04c1e8b9c6ec7b20e2879cb42bfbaf Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Tue, 15 Aug 2017 08:06:59 -0600 Subject: [PATCH 100/164] set xeno standard parts to be default --- .../mob/living/carbon/human/species_types/furrypeople.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index ad0cddabf1..123966c453 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -88,7 +88,7 @@ datum/species/mammal default_color = "00FF00" species_traits = list(MUTCOLORS,LIPS,DIGITIGRADE) mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur","mam_body_markings") - default_features = list("xenotail"="xeno","xenohead"="none","xenodorsal"="none","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "xeno") + default_features = list("xenotail"="xeno","xenohead"="standard","xenodorsal"="standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "xeno") armor = 15 heatmod = 1.5 no_equip = list(slot_head) From 313ba00dd5cb415b27522644498c8c697b4abbd8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 15 Aug 2017 09:59:51 -0500 Subject: [PATCH 101/164] Deathsquads no longer get shielded hardsuits --- code/modules/clothing/outfits/standard.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 66b62d3a67..abdb42d5b3 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -338,7 +338,7 @@ name = "Death Commando" uniform = /obj/item/clothing/under/color/green - suit = /obj/item/clothing/suit/space/hardsuit/shielded/swat + suit = /obj/item/clothing/suit/space/hardsuit/deathsquad shoes = /obj/item/clothing/shoes/combat/swat gloves = /obj/item/clothing/gloves/combat mask = /obj/item/clothing/mask/gas/sechailer/swat From f6babfeb8a3a4b506698cd3d1f55ab79cb761ca7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 15 Aug 2017 10:01:57 -0500 Subject: [PATCH 102/164] Makes IRC status return round id --- code/modules/server_tools/server_tools.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/server_tools/server_tools.dm b/code/modules/server_tools/server_tools.dm index d6a98ad2e5..be8c80ac24 100644 --- a/code/modules/server_tools/server_tools.dm +++ b/code/modules/server_tools/server_tools.dm @@ -73,7 +73,7 @@ GLOBAL_PROTECT(reboot_mode) if(rtod - last_irc_status < IRC_STATUS_THROTTLE) return last_irc_status = rtod - return "[GLOB.clients.len] players on [SSmapping.config.map_name], Mode: [GLOB.master_mode]; Round [SSticker.HasRoundStarted() ? (SSticker.IsRoundInProgress() ? "Active" : "Finishing") : "Starting"] -- [config.server ? config.server : "[world.internet_address]:[world.port]"]" + return "[GLOB.round_id ? "Round #[GLOB.round_id]: " : ""][GLOB.clients.len] players on [SSmapping.config.map_name], Mode: [GLOB.master_mode]; Round [SSticker.HasRoundStarted() ? (SSticker.IsRoundInProgress() ? "Active" : "Finishing") : "Starting"] -- [config.server ? config.server : "[world.internet_address]:[world.port]"]" if(SERVICE_CMD_ADMIN_MSG) return IrcPm(params[SERVICE_CMD_PARAM_TARGET], params[SERVICE_CMD_PARAM_MESSAGE], params[SERVICE_CMD_PARAM_SENDER]) From 6c3b6a261a9b69d1adfe1a7f78cd49f194d42cfa Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 15 Aug 2017 10:12:15 -0500 Subject: [PATCH 103/164] Automatic changelog generation for PR #2376 [ci skip] --- html/changelogs/AutoChangeLog-pr-2376.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2376.yml diff --git a/html/changelogs/AutoChangeLog-pr-2376.yml b/html/changelogs/AutoChangeLog-pr-2376.yml new file mode 100644 index 0000000000..1d1a2007b5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2376.yml @@ -0,0 +1,4 @@ +author: "ShizCalev" +delete-after: True +changes: + - bugfix: "The Singularity, Tesla energy ball, tears in the fabric of reality, and Narsie will no longer be frozen by freon." From 662786ba596f07e9d28d83f656856e581a8938e5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 15 Aug 2017 10:12:30 -0500 Subject: [PATCH 104/164] Automatic changelog generation for PR #2377 [ci skip] --- html/changelogs/AutoChangeLog-pr-2377.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2377.yml diff --git a/html/changelogs/AutoChangeLog-pr-2377.yml b/html/changelogs/AutoChangeLog-pr-2377.yml new file mode 100644 index 0000000000..4996a03563 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2377.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - bugfix: "Fixes mining hardsuit heat_protection" From 93ae8c0e44bbb2e057fdd97bd4aad941efccb3df Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Tue, 15 Aug 2017 09:21:08 -0600 Subject: [PATCH 105/164] did some number crunching in regards to armor and practiced, balanced more, still no shoes from digitgrade --- .../mob/living/carbon/human/species_types/furrypeople.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 123966c453..dc70828960 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -89,8 +89,9 @@ datum/species/mammal species_traits = list(MUTCOLORS,LIPS,DIGITIGRADE) mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur","mam_body_markings") default_features = list("xenotail"="xeno","xenohead"="standard","xenodorsal"="standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "xeno") - armor = 15 + armor = 20 heatmod = 1.5 + stunmod = 0.9 no_equip = list(slot_head) attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' From 7eaaa2e6473128f1a0a8265bcb90c9f0f04cebb3 Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Tue, 15 Aug 2017 09:25:51 -0600 Subject: [PATCH 106/164] lowered armor value,in search of fixing digitigradelegs --- .../mob/living/carbon/human/species_types/furrypeople.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index dc70828960..774a81b4bb 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -89,7 +89,7 @@ datum/species/mammal species_traits = list(MUTCOLORS,LIPS,DIGITIGRADE) mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur","mam_body_markings") default_features = list("xenotail"="xeno","xenohead"="standard","xenodorsal"="standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "xeno") - armor = 20 + armor = 15 heatmod = 1.5 stunmod = 0.9 no_equip = list(slot_head) From b65234b733f1ae947ff9c047a8f784151f9b5a96 Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Tue, 15 Aug 2017 09:33:31 -0600 Subject: [PATCH 107/164] rebalanced armor downward, removed stunmod, and made more vulnerable to heat thanks to Pierceimmune being added --- .../mob/living/carbon/human/species_types/furrypeople.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 774a81b4bb..26e4fa16fd 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -86,12 +86,11 @@ datum/species/mammal id = "xeno" say_mod = "hisses" default_color = "00FF00" - species_traits = list(MUTCOLORS,LIPS,DIGITIGRADE) + species_traits = list(MUTCOLORS,LIPS,DIGITIGRADE,PIERCEIMMUNE) mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur","mam_body_markings") default_features = list("xenotail"="xeno","xenohead"="standard","xenodorsal"="standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "xeno") armor = 15 - heatmod = 1.5 - stunmod = 0.9 + heatmod = 1.7 no_equip = list(slot_head) attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' From 3d83b55cf649da7743112419db7254eb291bbd78 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 15 Aug 2017 10:49:55 -0500 Subject: [PATCH 108/164] Annihilates the colons! --- code/__HELPERS/_lists.dm | 4 +-- code/__HELPERS/icons.dm | 28 ++++++++------- code/datums/mind.dm | 12 +++---- code/game/communications.dm | 2 +- code/game/machinery/overview.dm | 6 ++-- code/game/machinery/robot_fabricator.dm | 36 +++++++++---------- code/game/mecha/mecha.dm | 4 +-- code/game/objects/items/devices/scanners.dm | 2 +- .../objects/items/devices/transfer_valve.dm | 6 ++-- code/modules/admin/DB_ban/functions.dm | 16 ++++----- code/modules/admin/verbs/adminjump.dm | 4 +-- code/modules/admin/verbs/debug.dm | 24 ++++++------- code/modules/admin/verbs/diagnostics.dm | 5 +-- code/modules/assembly/bomb.dm | 3 +- code/modules/hydroponics/grown/chili.dm | 10 +++--- code/modules/mob/living/carbon/carbon.dm | 7 ++-- .../mob/living/silicon/pai/software.dm | 3 +- .../modules/ninja/suit/suit_initialisation.dm | 2 +- code/modules/paperwork/photography.dm | 5 +-- .../chemistry/reagents/food_reagents.dm | 2 +- 20 files changed, 93 insertions(+), 88 deletions(-) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 9c64fb8b74..9646f03252 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -320,7 +320,7 @@ return r // Returns the key based on the index -#define KEYBYINDEX(L, index) (((index <= L:len) && (index > 0)) ? L[index] : null) +#define KEYBYINDEX(L, index) (((index <= length(L)) && (index > 0)) ? L[index] : null) /proc/count_by_type(list/L, type) var/i = 0 @@ -468,7 +468,7 @@ . |= key_list[key] //Picks from the list, with some safeties, and returns the "default" arg if it fails -#define DEFAULTPICK(L, default) ((islist(L) && L:len) ? pick(L) : default) +#define DEFAULTPICK(L, default) ((islist(L) && length(L)) ? pick(L) : default) #define LAZYINITLIST(L) if (!L) L = list() #define UNSETEMPTY(L) if (L && !L.len) L = null #define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } } diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 04ea69a43f..ef20844c91 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -712,7 +712,8 @@ The _flatIcons list is a cache for generated icon files. if(!current) curIndex++ //Try the next layer continue - currentLayer = current:layer + var/image/I = current + currentLayer = I.layer if(currentLayer<0) // Special case for FLY_LAYER if(currentLayer <= -1000) return flat if(pSet == 0) // Underlay @@ -747,22 +748,22 @@ The _flatIcons list is a cache for generated icon files. // Dimensions of overlay being added var/{addX1;addX2;addY1;addY2} - for(var/I in layers) - - if(I:alpha == 0) + for(var/V in layers) + var/image/I = V + if(I.alpha == 0) continue if(I == copy) // 'I' is an /image based on the object being flattened. curblend = BLEND_OVERLAY - add = icon(I:icon, I:icon_state, I:dir) + add = icon(I.icon, I.icon_state, I.dir) else // 'I' is an appearance object. add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend) // Find the new dimensions of the flat icon to fit the added overlay - addX1 = min(flatX1, I:pixel_x+1) - addX2 = max(flatX2, I:pixel_x+add.Width()) - addY1 = min(flatY1, I:pixel_y+1) - addY2 = max(flatY2, I:pixel_y+add.Height()) + addX1 = min(flatX1, I.pixel_x+1) + addX2 = max(flatX2, I.pixel_x+add.Width()) + addY1 = min(flatY1, I.pixel_y+1) + addY2 = max(flatY2, I.pixel_y+add.Height()) if(addX1!=flatX1 || addX2!=flatX2 || addY1!=flatY1 || addY2!=flatY2) // Resize the flattened icon so the new icon fits @@ -771,7 +772,7 @@ The _flatIcons list is a cache for generated icon files. flatY1=addY1;flatY2=addY2 // Blend the overlay into the flattened icon - flat.Blend(add, blendMode2iconMode(curblend), I:pixel_x + 2 - flatX1, I:pixel_y + 2 - flatY1) + flat.Blend(add, blendMode2iconMode(curblend), I.pixel_x + 2 - flatX1, I.pixel_y + 2 - flatY1) if(A.color) flat.Blend(A.color, ICON_MULTIPLY) @@ -782,10 +783,11 @@ The _flatIcons list is a cache for generated icon files. /proc/getIconMask(atom/A)//By yours truly. Creates a dynamic mask for a mob/whatever. /N var/icon/alpha_mask = new(A.icon,A.icon_state)//So we want the default icon and icon state of A. - for(var/I in A.overlays)//For every image in overlays. var/image/I will not work, don't try it. - if(I:layer>A.layer) + for(var/V in A.overlays)//For every image in overlays. var/image/I will not work, don't try it. + var/image/I = V + if(I.layer>A.layer) continue//If layer is greater than what we need, skip it. - var/icon/image_overlay = new(I:icon,I:icon_state)//Blend only works with icon objects. + var/icon/image_overlay = new(I.icon,I.icon_state)//Blend only works with icon objects. //Also, icons cannot directly set icon_state. Slower than changing variables but whatever. alpha_mask.Blend(image_overlay,ICON_OR)//OR so they are lumped together in a nice overlay. return alpha_mask//And now return the mask. diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 7017149d53..d943e417e5 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -805,11 +805,11 @@ possible_targets += possible_target.current var/mob/def_target = null - var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain, /datum/objective/maroon) - if (objective&&(objective.type in objective_list) && objective:target) - def_target = objective:target.current + var/list/objective_list = typecacheof(list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain, /datum/objective/maroon)) + if (is_type_in_typecache(objective, objective_list) && objective.target) + def_target = objective.target.current - var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets + var/mob/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets if (!new_target) return @@ -817,12 +817,12 @@ if (new_target == "Free objective") new_objective = new objective_path new_objective.owner = src - new_objective:target = null + new_objective.target = null new_objective.explanation_text = "Free objective" else new_objective = new objective_path new_objective.owner = src - new_objective:target = new_target:mind + new_objective.target = new_target.mind //Will display as special role if the target is set as MODE. Ninjas/commandos/nuke ops. new_objective.update_explanation_text() diff --git a/code/game/communications.dm b/code/game/communications.dm index 66bb91ef59..19c3f87460 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -292,7 +292,7 @@ GLOBAL_VAR_INIT(RADIO_MAGNETS, "9") /datum/signal/proc/debug_print() if (source) - . = "signal = {source = '[source]' ([source:x],[source:y],[source:z])\n" + . = "signal = {source = '[source]' [COORD(source)]\n" else . = "signal = {source = '[source]' ()\n" for (var/i in data) diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index ffcb36678a..0cf97586c3 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -96,7 +96,8 @@ colour2 = rgb(255,128,0) if(ismob(AM)) - if(AM:client) + var/mob/M = AM + if(M.client) colour = rgb(255,0,0) else colour = rgb(255,128,128) @@ -242,7 +243,8 @@ colour = rgb(255,255,0) if(ismob(AM)) - if(AM:client) + var/mob/M = AM + if(M.client) colour = rgb(255,0,0) else colour = rgb(255,128,128) diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index 2183ec6448..20fd729304 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -11,31 +11,29 @@ idle_power_usage = 20 active_power_usage = 5000 -/obj/machinery/robotic_fabricator/attackby(obj/item/O, mob/user, params) +/obj/machinery/robotic_fabricator/attackby(obj/item/O, mob/living/user, params) if (istype(O, /obj/item/stack/sheet/metal)) - if (src.metal_amount < 150000) - var/count = 0 - src.add_overlay("fab-load-metal") - spawn(15) - if(O) - if(!O:amount) - return - while(metal_amount < 150000 && O:amount) - src.metal_amount += O:materials[MAT_METAL] /*O:height * O:width * O:length * 100000*/ - O:amount-- - count++ - - if (O:amount < 1) - qdel(O) - - to_chat(user, "You insert [count] metal sheet\s into \the [src].") - cut_overlay("fab-load-metal") - updateDialog() + if (metal_amount < 150000) + add_overlay("fab-load-metal") + addtimer(CALLBACK(src, .proc/FinishLoadingMetal, O, user), 15) else to_chat(user, "\The [src] is full.") else return ..() +/obj/machinery/robotic_fabricator/proc/FinishLoadingMetal(obj/item/stack/sheet/metal/M, mob/living/user) + cut_overlay("fab-load-metal") + if(QDELETED(M) || QDELETED(user)) + return + var/count = 0 + while(metal_amount < 150000 && !QDELETED(M)) + metal_amount += M.materials[MAT_METAL] + M.use(1) + count++ + + to_chat(user, "You insert [count] metal sheet\s into \the [src].") + updateDialog() + /obj/machinery/robotic_fabricator/power_change() if (powered()) stat &= ~NOPOWER diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 5564cd2c0a..5d5879206b 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -713,8 +713,8 @@ AI.remote_control = src AI.canmove = 1 //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow. AI.can_shunt = 0 //ONE AI ENTERS. NO AI LEAVES. - to_chat(AI, "[AI.can_dominate_mechs ? "Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!" \ - : "You have been uploaded to a mech's onboard computer."]") + to_chat(AI, AI.can_dominate_mechs ? "Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!" :\ + "You have been uploaded to a mech's onboard computer.") to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.") if(interaction == AI_TRANS_FROM_CARD) GrantActions(AI, FALSE) //No eject/return to core action for AI uploaded by card diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 3d7e575215..ae84bd2f2c 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -147,7 +147,7 @@ MASS SPECTROMETER if (M.getCloneLoss()) to_chat(user, "\tSubject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.") if (M.reagents && M.reagents.get_reagent_amount("epinephrine")) - to_chat(user, "\tBloodstream analysis located [M.reagents:get_reagent_amount("epinephrine")] units of rejuvenation chemicals.") + to_chat(user, "\tBloodstream analysis located [M.reagents.get_reagent_amount("epinephrine")] units of rejuvenation chemicals.") if (M.getBrainLoss() >= 100 || !M.getorgan(/obj/item/organ/brain)) to_chat(user, "\tSubject brain function is non-existent.") else if (M.getBrainLoss() >= 60) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index c21ff386bd..4663e2142a 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -8,7 +8,7 @@ desc = "Regulates the transfer of air between two tanks" var/obj/item/weapon/tank/tank_one var/obj/item/weapon/tank/tank_two - var/obj/item/device/attached_device + var/obj/item/device/assembly/attached_device var/mob/attacher = null var/valve_open = FALSE var/toggle = 1 @@ -99,8 +99,8 @@ toggle_valve() else if(attached_device) if(href_list["rem_device"]) - attached_device.loc = get_turf(src) - attached_device:holder = null + attached_device.forceMove(get_turf(src)) + attached_device.holder = null attached_device = null update_icon() if(href_list["device"]) diff --git a/code/modules/admin/DB_ban/functions.dm b/code/modules/admin/DB_ban/functions.dm index 23bf656b8c..e580b306b3 100644 --- a/code/modules/admin/DB_ban/functions.dm +++ b/code/modules/admin/DB_ban/functions.dm @@ -83,10 +83,10 @@ var/a_computerid var/a_ip - if(src.owner && istype(src.owner, /client)) - a_ckey = src.owner:ckey - a_computerid = src.owner:computer_id - a_ip = src.owner:address + if(istype(owner)) + a_ckey = owner.ckey + a_computerid = owner.computer_id + a_ip = owner.address if(blockselfban) if(a_ckey == ckey) @@ -309,12 +309,12 @@ to_chat(usr, "Database update failed due to multiple bans having the same ID. Contact the database admin.") return - if(!src.owner || !istype(src.owner, /client)) + if(!istype(owner)) return - var/unban_ckey = src.owner:ckey - var/unban_computerid = src.owner:computer_id - var/unban_ip = src.owner:address + var/unban_ckey = owner.ckey + var/unban_computerid = owner.computer_id + var/unban_ip = owner.address var/sql_update = "UPDATE [format_table_name("ban")] SET unbanned = 1, unbanned_datetime = Now(), unbanned_ckey = '[unban_ckey]', unbanned_computerid = '[unban_computerid]', unbanned_ip = INET_ATON('[unban_ip]') WHERE id = [id]" var/datum/DBQuery/query_unban = SSdbcore.NewQuery(sql_update) diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 7f4dd3ebb9..ec1091bb3c 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -84,11 +84,11 @@ var/list/keys = list() for(var/mob/M in GLOB.player_list) keys += M.client - var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys) + var/client/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys) if(!selection) to_chat(src, "No keys found.") return - var/mob/M = selection:mob + var/mob/M = selection.mob log_admin("[key_name(usr)] jumped to [key_name(M)]") message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index c69628c625..66438d1fac 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -316,10 +316,8 @@ GLOBAL_PROTECT(AdminProcCallCount) alert("Wait until the game starts") return if(ishuman(M)) - log_admin("[key_name(src)] has alienized [M.key].") - spawn(0) - M:Alienize() - SSblackbox.add_details("admin_verb","Make Alien") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + INVOKE_ASYNC(M, /mob/living/carbon/human/proc/Alienize) + SSblackbox.add_details("admin_verb","Make Alien") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into an alien.") message_admins("[key_name_admin(usr)] made [key_name(M)] into an alien.") else @@ -333,10 +331,8 @@ GLOBAL_PROTECT(AdminProcCallCount) alert("Wait until the game starts") return if(ishuman(M)) - log_admin("[key_name(src)] has slimeized [M.key].") - spawn(0) - M:slimeize() - SSblackbox.add_details("admin_verb","Make Slime") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + INVOKE_ASYNC(M, /mob/living/carbon/human/proc/slimeize) + SSblackbox.add_details("admin_verb","Make Slime") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into a slime.") message_admins("[key_name_admin(usr)] made [key_name(M)] into a slime.") else @@ -461,12 +457,14 @@ GLOBAL_PROTECT(AdminProcCallCount) if(worn) if(istype(worn, /obj/item/device/pda)) - worn:id = id - id.loc = worn + var/obj/item/device/pda/PDA = worn + PDA.id = id + id.forceMove(PDA) else if(istype(worn, /obj/item/weapon/storage/wallet)) - worn:front_id = id - id.loc = worn - worn.update_icon() + var/obj/item/weapon/storage/wallet/W = worn + W.front_id = id + id.forceMove(W) + W.update_icon() else H.equip_to_slot(id,slot_wear_id) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 15b619f653..a4482154d8 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -78,8 +78,9 @@ continue output += "  [filters[filter]]: [f.len]
" for (var/device in f) - if (isobj(device)) - output += "    [device] ([device:x],[device:y],[device:z] in area [get_area(device:loc)])
" + if (istype(device, /atom)) + var/atom/A = device + output += "    [device] ([A.x],[A.y],[A.z] in area [get_area(device)])
" else output += "    [device]
" diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 2853fefcbf..f0fa90aa20 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -44,7 +44,8 @@ qdel(src) return - if((istype(W, /obj/item/weapon/weldingtool) && W:welding)) + var/obj/item/weapon/weldingtool/WT = W + if((istype(WT) && WT.welding)) if(!status) status = TRUE GLOB.bombers += "[key_name(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]" diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index 7707a4d438..66bd823a89 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -71,21 +71,21 @@ name = "ghost chili" desc = "It seems to be vibrating gently." icon_state = "ghostchilipepper" - var/mob/held_mob + var/mob/living/carbon/human/held_mob filling_color = "#F8F8FF" bitesize_mod = 4 origin_tech = "biotech=4;magnets=5" /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili/attack_hand(mob/user) ..() - if( ismob(src.loc) ) - held_mob = src.loc + if( ismob(loc) ) + held_mob = loc START_PROCESSING(SSobj, src) /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili/process() - if(held_mob && src.loc == held_mob) + if(held_mob && loc == held_mob) if(held_mob.is_holding(src)) - if(hasvar(held_mob,"gloves") && held_mob:gloves) + if(istype(held_mob) && held_mob.gloves) return held_mob.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT if(prob(10)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 9179221137..8f5720164e 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -51,9 +51,10 @@ var/obj/item/item_in_hand = src.get_active_held_item() if(item_in_hand) //this segment checks if the item in your hand is twohanded. - if(istype(item_in_hand, /obj/item/weapon/twohanded)) - if(item_in_hand:wielded == 1) - to_chat(usr, "Your other hand is too busy holding the [item_in_hand.name]") + var/obj/item/weapon/twohanded/TH = item_in_hand + if(istype(TH)) + if(TH.wielded == 1) + to_chat(usr, "Your other hand is too busy holding [TH]") return var/oindex = active_hand_index active_hand_index = held_index diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 77874ad403..719b17c734 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -619,7 +619,8 @@ src.paiInterface() if(hackprogress >= 100) src.hackprogress = 0 - src.cable.machine:open() + var/obj/machinery/door/D = cable.machine + D.open() sleep(50) // Update every 5 seconds // Digital Messenger diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm index b723ade381..5fb3fe8a62 100644 --- a/code/modules/ninja/suit/suit_initialisation.dm +++ b/code/modules/ninja/suit/suit_initialisation.dm @@ -70,7 +70,7 @@ addtimer(CALLBACK(src, .proc/deinitialize_three, delay, U), delay) /obj/item/clothing/suit/space/space_ninja/proc/deinitialize_three(delay, mob/living/carbon/human/U) - to_chat(U, "Logging off, [U:real_name]. Shutting down SpiderOS.") + to_chat(U, "Logging off, [U.real_name]. Shutting down SpiderOS.") addtimer(CALLBACK(src, .proc/deinitialize_four, delay, U), delay) /obj/item/clothing/suit/space/space_ninja/proc/deinitialize_four(delay, mob/living/carbon/human/U) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index b1896f930a..4755f3d64a 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -222,8 +222,9 @@ var/offX = 32 * (A.x - center.x) + A.pixel_x + 33 var/offY = 32 * (A.y - center.y) + A.pixel_y + 33 if(ismovableatom(A)) - offX += A:step_x - offY += A:step_y + var/atom/movable/AM = A + offX += AM.step_x + offY += AM.step_y res.Blend(img, blendMode2iconMode(A.blend_mode), offX, offY) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 1fae98e2f3..72001d5ca9 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -390,7 +390,7 @@ T.MakeSlippery(min_wet_time = 10, wet_time_to_add = reac_volume*2) var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot) - var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() ) + var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles()) lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) lowertemp.react() T.assume_air(lowertemp) From 67cd217681b306bfc3c39748b6ecab69f4708d59 Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Tue, 15 Aug 2017 10:19:38 -0600 Subject: [PATCH 109/164] bumped heat damage after calculating armor --- .../mob/living/carbon/human/species_types/furrypeople.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 26e4fa16fd..3d494a5a05 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -90,7 +90,7 @@ datum/species/mammal mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur","mam_body_markings") default_features = list("xenotail"="xeno","xenohead"="standard","xenodorsal"="standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "xeno") armor = 15 - heatmod = 1.7 + heatmod = 1.9 no_equip = list(slot_head) attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' From 41c9cf3a4a5609f7c7569a7cb5056c89e1068972 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 15 Aug 2017 18:53:10 -0500 Subject: [PATCH 110/164] Update machinery.dm --- code/game/machinery/machinery.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index f5958843fc..cf51158356 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -439,7 +439,7 @@ Class Procs: /obj/machinery/proc/display_parts(mob/user) to_chat(user, "Following parts detected in the machine:") for(var/obj/item/C in component_parts) - to_chat(user, "[bicon(C)] [C.name]") + to_chat(user, "[icon2html(C, user)] [C.name]") /obj/machinery/examine(mob/user) ..() From 24be45e6fac2d8490ccc59cbc1ca749099991771 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 15 Aug 2017 18:56:57 -0500 Subject: [PATCH 111/164] Update sound.dm --- code/game/sound.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/game/sound.dm b/code/game/sound.dm index f0891eaefb..ff35915b08 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -175,7 +175,3 @@ 'sound/vore/prey/death_07.ogg','sound/vore/prey/death_08.ogg','sound/vore/prey/death_09.ogg', 'sound/vore/prey/death_10.ogg') return soundin - -/proc/playsound_global(file, repeat = 0, wait, channel, volume) - for(var/V in GLOB.clients) - V << sound(file, repeat, wait, channel, volume) From d133510288a26dcc079bb78015aa96afebc2acf9 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 15 Aug 2017 19:06:41 -0500 Subject: [PATCH 112/164] Update preferences_savefile.dm --- code/modules/client/preferences_savefile.dm | 142 ++++++++++---------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index d7cfcf92cc..244afc69f3 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -226,34 +226,34 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car return 0 S.cd = "/" - S["version"] << SAVEFILE_VERSION_MAX //updates (or failing that the sanity checks) will ensure data is not invalid at load. Assume up-to-date + WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //updates (or failing that the sanity checks) will ensure data is not invalid at load. Assume up-to-date //general preferences - S["ooccolor"] << ooccolor - S["lastchangelog"] << lastchangelog - S["UI_style"] << UI_style - S["hotkeys"] << hotkeys - S["tgui_fancy"] << tgui_fancy - S["tgui_lock"] << tgui_lock - S["windowflash"] << windowflashing - S["be_special"] << be_special - S["default_slot"] << default_slot - S["toggles"] << toggles - S["chat_toggles"] << chat_toggles - S["ghost_form"] << ghost_form - S["ghost_orbit"] << ghost_orbit - S["ghost_accs"] << ghost_accs - S["ghost_others"] << ghost_others - S["preferred_map"] << preferred_map - S["ignoring"] << ignoring - S["ghost_hud"] << ghost_hud - S["inquisitive_ghost"] << inquisitive_ghost - S["uses_glasses_colour"]<< uses_glasses_colour - S["clientfps"] << clientfps - S["parallax"] << parallax - S["menuoptions"] << menuoptions - S["enable_tips"] << enable_tips - S["tip_delay"] << tip_delay + WRITE_FILE(S["ooccolor"], ooccolor) + WRITE_FILE(S["lastchangelog"], lastchangelog) + WRITE_FILE(S["UI_style"], UI_style) + WRITE_FILE(S["hotkeys"], hotkeys) + WRITE_FILE(S["tgui_fancy"], tgui_fancy) + WRITE_FILE(S["tgui_lock"], tgui_lock) + WRITE_FILE(S["windowflash"], windowflashing) + WRITE_FILE(S["be_special"], be_special) + WRITE_FILE(S["default_slot"], default_slot) + WRITE_FILE(S["toggles"], toggles) + WRITE_FILE(S["chat_toggles"], chat_toggles) + WRITE_FILE(S["ghost_form"], ghost_form) + WRITE_FILE(S["ghost_orbit"], ghost_orbit) + WRITE_FILE(S["ghost_accs"], ghost_accs) + WRITE_FILE(S["ghost_others"], ghost_others) + WRITE_FILE(S["preferred_map"], preferred_map) + WRITE_FILE(S["ignoring"], ignoring) + WRITE_FILE(S["ghost_hud"], ghost_hud) + WRITE_FILE(S["inquisitive_ghost"], inquisitive_ghost) + WRITE_FILE(S["uses_glasses_colour"], uses_glasses_colour) + WRITE_FILE(S["clientfps"], clientfps) + WRITE_FILE(S["parallax"], parallax) + WRITE_FILE(S["menuoptions"], menuoptions) + WRITE_FILE(S["enable_tips"], enable_tips) + WRITE_FILE(S["tip_delay"], tip_delay) //citadel code S["arousable"] << arousable @@ -470,53 +470,53 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["version"] << SAVEFILE_VERSION_MAX //load_character will sanitize any bad data, so assume up-to-date. //Character - S["OOC_Notes"] << metadata - S["real_name"] << real_name - S["name_is_always_random"] << be_random_name - S["body_is_always_random"] << be_random_body - S["gender"] << gender - S["age"] << age - S["hair_color"] << hair_color - S["facial_hair_color"] << facial_hair_color - S["eye_color"] << eye_color - S["skin_tone"] << skin_tone - S["hair_style_name"] << hair_style - S["facial_style_name"] << facial_hair_style - S["underwear"] << underwear - S["undershirt"] << undershirt - S["socks"] << socks - S["backbag"] << backbag - S["uplink_loc"] << uplink_spawn_loc - S["species"] << pref_species.id - S["feature_mcolor"] << features["mcolor"] - S["feature_lizard_tail"] << features["tail_lizard"] - S["feature_human_tail"] << features["tail_human"] - S["feature_lizard_snout"] << features["snout"] - S["feature_lizard_horns"] << features["horns"] - S["feature_human_ears"] << features["ears"] - S["feature_lizard_frills"] << features["frills"] - S["feature_lizard_spines"] << features["spines"] - S["feature_lizard_body_markings"] << features["body_markings"] - S["feature_lizard_legs"] << features["legs"] - S["clown_name"] << custom_names["clown"] - S["mime_name"] << custom_names["mime"] - S["ai_name"] << custom_names["ai"] - S["cyborg_name"] << custom_names["cyborg"] - S["religion_name"] << custom_names["religion"] - S["deity_name"] << custom_names["deity"] - S["prefered_security_department"] << prefered_security_department + WRITE_FILE(S["OOC_Notes"] , metadata) + WRITE_FILE(S["real_name"] , real_name) + WRITE_FILE(S["name_is_always_random"] , be_random_name) + WRITE_FILE(S["body_is_always_random"] , be_random_body) + WRITE_FILE(S["gender"] , gender) + WRITE_FILE(S["age"] , age) + WRITE_FILE(S["hair_color"] , hair_color) + WRITE_FILE(S["facial_hair_color"] , facial_hair_color) + WRITE_FILE(S["eye_color"] , eye_color) + WRITE_FILE(S["skin_tone"] , skin_tone) + WRITE_FILE(S["hair_style_name"] , hair_style) + WRITE_FILE(S["facial_style_name"] , facial_hair_style) + WRITE_FILE(S["underwear"] , underwear) + WRITE_FILE(S["undershirt"] , undershirt) + WRITE_FILE(S["socks"] , socks) + WRITE_FILE(S["backbag"] , backbag) + WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc) + WRITE_FILE(S["species"] , pref_species.id) + WRITE_FILE(S["feature_mcolor"] , features["mcolor"]) + WRITE_FILE(S["feature_lizard_tail"] , features["tail_lizard"]) + WRITE_FILE(S["feature_human_tail"] , features["tail_human"]) + WRITE_FILE(S["feature_lizard_snout"] , features["snout"]) + WRITE_FILE(S["feature_lizard_horns"] , features["horns"]) + WRITE_FILE(S["feature_human_ears"] , features["ears"]) + WRITE_FILE(S["feature_lizard_frills"] , features["frills"]) + WRITE_FILE(S["feature_lizard_spines"] , features["spines"]) + WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"]) + WRITE_FILE(S["feature_lizard_legs"] , features["legs"]) + WRITE_FILE(S["clown_name"] , custom_names["clown"]) + WRITE_FILE(S["mime_name"] , custom_names["mime"]) + WRITE_FILE(S["ai_name"] , custom_names["ai"]) + WRITE_FILE(S["cyborg_name"] , custom_names["cyborg"]) + WRITE_FILE(S["religion_name"] , custom_names["religion"]) + WRITE_FILE(S["deity_name"] , custom_names["deity"]) + WRITE_FILE(S["prefered_security_department"] , prefered_security_department) //Jobs - S["joblessrole"] << joblessrole - S["job_civilian_high"] << job_civilian_high - S["job_civilian_med"] << job_civilian_med - S["job_civilian_low"] << job_civilian_low - S["job_medsci_high"] << job_medsci_high - S["job_medsci_med"] << job_medsci_med - S["job_medsci_low"] << job_medsci_low - S["job_engsec_high"] << job_engsec_high - S["job_engsec_med"] << job_engsec_med - S["job_engsec_low"] << job_engsec_low + WRITE_FILE(S["joblessrole"] , joblessrole) + WRITE_FILE(S["job_civilian_high"] , job_civilian_high) + WRITE_FILE(S["job_civilian_med"] , job_civilian_med) + WRITE_FILE(S["job_civilian_low"] , job_civilian_low) + WRITE_FILE(S["job_medsci_high"] , job_medsci_high) + WRITE_FILE(S["job_medsci_med"] , job_medsci_med) + WRITE_FILE(S["job_medsci_low"] , job_medsci_low) + WRITE_FILE(S["job_engsec_high"] , job_engsec_high) + WRITE_FILE(S["job_engsec_med"] , job_engsec_med) + WRITE_FILE(S["job_engsec_low"] , job_engsec_low) //Citadel S["feature_exhibitionist"] << features["exhibitionist"] From 865c56afbf452339765e000667b96bb8cd8723d6 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 15 Aug 2017 19:08:05 -0500 Subject: [PATCH 113/164] Update areas.dm --- code/game/area/areas.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 8e87ffe0c3..218cb59f41 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -439,7 +439,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) // Ambience goes down here -- make sure to list each area separately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch if(L.client && !L.client.ambience_playing && L.client.prefs.toggles & SOUND_SHIP_AMBIENCE) L.client.ambience_playing = 1 - L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ) + SEND_SOUND(L, sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ)) if(!(L.client && (L.client.prefs.toggles & SOUND_AMBIENCE))) return //General ambience check is below the ship ambience so one can play without the other From 95cfe5baa0ee5afa3a14f3824f7fb6628f17435f Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 15 Aug 2017 19:48:26 -0500 Subject: [PATCH 114/164] Update browserOutput.dm --- code/modules/goonchat/browserOutput.dm | 51 -------------------------- 1 file changed, 51 deletions(-) diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index ebdc7ab421..85770f618a 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -165,57 +165,6 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic log_world("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]") //Global chat procs -//Converts an icon to base64. Operates by putting the icon in the iconCache savefile, -// exporting it as text, and then parsing the base64 from that. -// (This relies on byond automatically storing icons in savefiles as base64) -/proc/icon2base64(icon/icon, iconKey = "misc") - if (!isicon(icon)) - return FALSE - WRITE_FILE(GLOB.iconCache[iconKey], icon) - var/iconData = GLOB.iconCache.ExportText(iconKey) - var/list/partial = splittext(iconData, "{") - return replacetext(copytext(partial[2], 3, -5), "\n", "") - -/proc/bicon(thing) - if (!thing) - return - var/static/list/bicon_cache = list() - if (isicon(thing)) - var/icon/I = thing - var/icon_md5 = md5(I) - if (!bicon_cache[icon_md5]) // Doesn't exist yet, make it. - I = icon(I) //copy it - I.Scale(16,16) //scale it - bicon_cache[icon_md5] = icon2base64(thing) //base64 it - return "" - - // Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with. - var/atom/A = thing - var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]" - - - if (!bicon_cache[key]) // Doesn't exist, make it. - var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1) - I.Scale(16,16) - if (ishuman(thing)) // Shitty workaround for a BYOND issue. - var/icon/temp = I - I = icon() - I.Insert(temp, dir = SOUTH) - bicon_cache[key] = icon2base64(I, key) - - return "" - -//Costlier version of bicon() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. -/proc/costly_bicon(thing) - if (!thing) - return - - if (isicon(thing)) - return bicon(thing) - - var/icon/I = getFlatIcon(thing) - return bicon(I) - /proc/to_chat(target, message) if(!target) return From 90e1bbd3e13541ace554898d595c6f4e19ddcabd Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 01:01:06 -0500 Subject: [PATCH 115/164] Megafauna will now always show up in the orbit list --- code/__HELPERS/unsorted.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index f3d67905de..8cb34e23b5 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -289,7 +289,7 @@ Turf and target are separate in case you want to teleport some distance from a t var/list/pois = list() for(var/mob/M in mobs) if(skip_mindless && (!M.mind && !M.ckey)) - if(!isbot(M) && !istype(M, /mob/camera/)) + if(!isbot(M) && !istype(M, /mob/camera) && !ismegafauna(M)) continue if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins continue From 96acbf98534b714e39ba04665eebfabee5027bf9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 01:11:29 -0500 Subject: [PATCH 116/164] fixes a blue tile on delta --- _maps/map_files/Deltastation/DeltaStation2.dmm | 3 --- 1 file changed, 3 deletions(-) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index b0265ad94b..72f9a75ebd 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -7457,9 +7457,6 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aqr" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 From cff50c57715a590c35069d0db833353fe6bdb392 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 16 Aug 2017 09:25:32 -0500 Subject: [PATCH 117/164] Revert "Revert "[MIRROR] The wiki button now asks what page you want to be taken to"" --- interface/interface.dm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/interface/interface.dm b/interface/interface.dm index 253738064b..64e39587ce 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -1,12 +1,14 @@ //Please use mob or src (not usr) in these procs. This way they can be called in the same fashion as procs. -/client/verb/wiki() +/client/verb/wiki(query as text | null) set name = "wiki" - set desc = "Visit the wiki." + set desc = "Type what you want to know about. This will open the wiki on your web browser. Type nothing to go to the main page." set hidden = 1 if(config.wikiurl) - if(alert("This will open the wiki in your browser. Are you sure?",,"Yes","No")=="No") - return - src << link(config.wikiurl) + if(query) + var/output = config.wikiurl + "/index.php?title=Special%3ASearch&profile=default&search=" + query + src << link(output) + else if (query != null) + src << link(config.wikiurl) else to_chat(src, "The wiki URL is not set in the server configuration.") return From dd00a614665a4d99a5b20215b42fecc96d29af11 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 16 Aug 2017 09:26:58 -0500 Subject: [PATCH 118/164] Update interface.dm --- interface/interface.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/interface.dm b/interface/interface.dm index 64e39587ce..9ee5309585 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -1,7 +1,7 @@ //Please use mob or src (not usr) in these procs. This way they can be called in the same fashion as procs. -/client/verb/wiki(query as text | null) +/client/verb/wiki(query as text) set name = "wiki" - set desc = "Type what you want to know about. This will open the wiki on your web browser. Type nothing to go to the main page." + set desc = "Type what you want to know about. This will open the wiki in your web browser. Type nothing to go to the main page." set hidden = 1 if(config.wikiurl) if(query) From b3e984af5bf19493447793e9afe364d31187564a Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 16 Aug 2017 09:41:55 -0500 Subject: [PATCH 119/164] Update furrypeople.dm --- .../mob/living/carbon/human/species_types/furrypeople.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 26e4fa16fd..c2ff6eebd8 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -99,7 +99,7 @@ datum/species/mammal skinned_type = /obj/item/stack/sheet/animalhide/xeno exotic_bloodtype = "L" damage_overlay_type = "xeno" - roundstart = 1 + roundstart = 0 //Praise the Omnissiah, A challange worthy of my skills - HS @@ -241,4 +241,4 @@ datum/species/guilmon attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' - roundstart = 1 \ No newline at end of file + roundstart = 1 From e06288d41abb8313a7ab45d36c47ef8d70357b1f Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Wed, 16 Aug 2017 10:31:03 -0600 Subject: [PATCH 120/164] Xenonerfs --- .../mob/living/carbon/human/species_types/furrypeople.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 3d494a5a05..68520b9ae0 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -89,8 +89,8 @@ datum/species/mammal species_traits = list(MUTCOLORS,LIPS,DIGITIGRADE,PIERCEIMMUNE) mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur","mam_body_markings") default_features = list("xenotail"="xeno","xenohead"="standard","xenodorsal"="standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "xeno") - armor = 15 - heatmod = 1.9 + armor = 5 + heatmod = 1.4 no_equip = list(slot_head) attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' From bd48741a45d6a0121f27257cfc02e92b776fb380 Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Wed, 16 Aug 2017 11:22:57 -0600 Subject: [PATCH 121/164] Xeno nerfs fixed --- icons/mob/human_parts_greyscale.dmi | Bin 44525 -> 44523 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index e7309556354492f8e627ff9200c8a627397d5ac9..225a61e143b85612f8f56d55d20e3067344ce213 100644 GIT binary patch delta 2313 zcmV+k3HJ8w+XCy`04hL0gwV)WvTMn2h-cGJENex#SP=Xbc^rB`$O+p`a;Cioin*u|c>bc*&qQ zgsUp5O>IBjD=GSZ;L#@S%Q?AMG{?tBSEklS6wRM4$Kk)IVwAO#WsMlW>)cAug@j`o92UzEe zLKQ#$_P_7@(KwQ+5d_C^WYO5H=?-vOIZyxtz!JXi%XmC4Ot(}0pwt<|vMd>o$2vn4 zR@&=dwCgV`mSq`vahB}9#$%f5fW~t${em>veGP&j`n>55u!y|KgAOnNq^PLHp02!Y z+fMy!zD9p(t$$Ikzbx3ct-T9;b#)bf`0zn|-FY3OUI)W|j98xWS`~7}+a<ym1=VSmlGfWq-8J|h;7?OZYoQI>$+j1 z(TLs>O_RFc;>(vW>Qlznq}S_(DhCtsHkJ1J7wLcc%VLjQ*A1_)ujTssTAIzKk=Q{H zh-FzaoleEFtf&iWiW-T@Y8+`%2iVm3Lp%qOmmT0ua!BNT)!0UE!a3Ht0w}p8ddORM>?d`1`92{tkW81dz zH7UXkcxkVH(XKz!do&)8jTPOl>xOrCcTs=WQ#IUzAdtJeJ0lOFm`o<(`+juOpZfh| zGBNhBlpqLXFc?I$$UzVoc?gH1ZbTH3D349M@P&U6hDdSV9s^J;>L2yIzx^DiJ7@Js z*dncoNolTs5wAbfRAH$5=fCQJ4u`|&*fDi1nL2?$=RT?N8qf2j)9FMrz-mm!#La(_ z$&)Bd#*XI@Uk8=PCjTbAiUJq_06>@cv2>p2MaOZeQ3TyLq9xvfq-CdT5c9O7dT zS)Ed%ieNSVp=N+7fHhJ#+=)Ctfi4dn=U%TDs#zpckAYS(x3{-NMCAVdUQFNo*zfm4 zHFG|n&*h(g{>fx7OkNXN?DaC2mzR@QsEB{_k$Vph52nK|RMrl#+W#z$KRh`(*?M?* z$jw>+0E&eIcmsLrz-1{9>p%|K$;0=Zha3O^#X|wSraX3>C<3x)^15KZ0RZ@KD1bMR zw<35xpJ$fS-rk<{`+Xw^V8`9x-^MsWDZ&G^&)$Fdvbq&Z#-`N6bJwS)`AM$DB^5 z(SO};S9iFGiq-9QU*wRbv$HelcDpt*8ja-Q;v)6+S6^>58p(7z&BgV%X#Y)L2YK0l z06_8ZAPfK~DaUcLP5}TiK?fKB005;z0h0`>9DmqIrBVrxj*h}grDFUc7|0&`4*)2# z|7V>5is{|EchRq&=NXTGbaWIIUSGd{-7=m)$+7nK0aoaLzZ30tUI9Wf4TP`0E%v{0@!ukP(-BF zYJbUWHj6%Atybmc=0-$B+U>Tse~gpyEz1($_l?EJZ=UC6y3Rj-{K(Bd|N8YSlbCPb zyfGeEVgG+CSX9tyYWvEC>Qo--oXF@jM!h zMpS&OU&rIIvEn-qIRGd=9)%2`tk&uPcYit^5qT~+XS11jo+q|#OSM{!3es=izNMdK zBK}}7h<-03G8_)0k9EdZMfl<2p@@iBmKFW#d7ikg8|p4V^N<4o06>wgRR9kLgFil( zyaT*mum87TCGZ_(~15}XMB<8j>)2Ra2zKZ!_X}cIRF3v6xCVj3MX{}quJ-R3yc9pFW?+nr8F>j(${0KjXo@=b7xI*B2EL!9b5nwUL}7s0CY zYpVEFv6ppUPft&c%-;5Ty->XXQGa>FJHX5U16Tz&!2u|%jm`l+JUooX4O*?1)M_SNtp*9}$2J8Q`tYPFiQTCHeA1poj5i>>`6xXEM^bv;!FI0yonOeWgTppD;zm+Sz0 zo+sn+*vJ{U@ds~+Ja=Oc4-bu<1FY6OnF9a-0RC?65ePK{>o|@$juRDPrshv=+l~rf z)d5z=v5m)Lt+A6QQHYqo`F|{)Lwpp&)Qx}u002d|_6S6+RukK{qweEyI27Bqjg1AU z!gnwj$aFfD!C)Y^Z5tbd5P8{coy}&(3(t1Dy;ZN*Wj32F%n1Mh0LyKB44TOAZe;x9 z^io?b{?*l0`1JH-EPgTvlX3H!2Y_PYg)@M%TDt%S0K5(qzyQi>;}26H0001hBBB5W j002O#P?N8%Ar|Fd!-8fJ_?V+`00000NkvXXu0mjfi7am{ delta 2288 zcmVOvZeH%w9TVF8LrHjiF<-#Dy*;6f|W?5qO9pHVBslFB$X< z=BkS7P}`60l@$Gd@X{uI-kg(rMRI(6bY*INRM8a#fy`zz@jOp#+m>pzDwbtM`RJkw z-*_G>uKKrHt)_o1zKDq9I7%|Um5Cqzb(BW_x<)H*Y z5X~T)kY)~rFMt6+2lb29_x-F>S&Q%c+Pc8WU-!KYaKgzVFL)I+fksU1>I(^8NdF`S|gp))y(s zagTTh*u+SZiodM;YU&8Kv~x(c0Pgqu;mOH~(O0U;`Cm?e0Fai!U?8?_8@Z`04X*2k z^?E&eOEgXDev2<(zNk+bU6Wp~7v}xvd)n(?wCjJ*^d7mc8(v>u%k}lOG#U*fzyE_E zkY=+f)9F;2&1TdEHARiYWHpYotOIOn{2`u$$ny^HCOM>f4)EUIUYcKSB^MVL(ch=j zsqy##Ua$TAeW_NfQm@yuPGu$adR?m3s_gIYYm0Gwd@PMd!}yvMq5GWn`WNl`GrdRk zdR>1SjfNZ_9~+CQimu(=-De-0qRt;yM-s-5CDh4v-LTba{qg;p{QlK=(Xt#`t=8J- zAg5XYpP!$n`Q=vf>C-1UKR=hxpFbOq4d8V!})UK@iB@-JOw#P)sHh@qItK=}-NA zGMN~ASV|BCG8hb^S>zxHj68%xQ8yxrNR-E>UHHO32t#D?wu=bk4*=4oeyA7W?Po=I z&gzk{MOqV+(p>){UVo;k!ch0`f7JmU4u{dPW9nEkbpnCTeNy8!p65xY(}`w))tD}f ziJK*pCsCM;9nT@Y4l0jLekQ$&0vG@QK$rNjbe`u$$8o7q1l>2HCF9p>HIk?tH7uS$ zmxqpXuh$FJERw0mK&zPB+uI@{a({m>rf+`i_xqumIiJtx^3Om2WU?0~uZb-7`X!T5 zsEdE%$i0V$2h(AfDr*N=?SB@>AD*0?Y&|?YYd0nvI008_q6u=wETM;~;&oj$uZ*Ncf{l1X{u;cFU?`3Ca zCl`BRGKVbpdYQewJ-NTXHy$^B3IqTE>!N=EUQztGtGspKR6dPHBYG%^391;|+1W8x z1YcfWhW&m&+}YVN5pE?W)<2KeUvmF1FE5Q;18V>C_F@14P#hG%D|r9@eRy$kA*0bq zy4|jvotr4^{`KouCNbZ)oha2zKZ!_X}cIRJkE02I|)1+W@Dc&P&%1cBB9OvP6nVAXY2AM1`UvgkIy zG=ibK_|8)f0000*wQ>R6Znw9RbGRal8{kaL-^Sy=)B)B#|0^QTy3KK>JHX3kw>zDV z))5c@0D#wE<(uFXbrM7ThB(!AG%-9qQ0z~Bz z?*KCc3}6-91P7q3HaZ9R@bEAiH)yq5Vp*24&SSk^k8S|7ZCgYZoloEQjl_Sc`)YFZ zpjN9b&4C$U004l$+xS5kmSsu&Gy;><(O;hDMMr>{pvExb9pE4cjJ^O+mUVz{Zf@xQ z0ssK~#s4<_KL$Y{wOW5of*?pUpOvVizf=cUeXN`7x}oZLXDyk7Wm(c{wW1Lf0000i zxAv3ZCX-3j^;8|;AP8hKnP@+QHhvRcvIFdSo{Yz1BWK{oAG{&5=*Au%9vV9bSgm<7 z2LJ#7{N36k5NZb2aU5|RCo05D&7az~9TmQ+1FVi?8;{3YV<&%4q7X5E^I1HH_$Y>{ z8vy|T0E%wy5eUn&#J26I`#2m9#kOr@V*#r09SjCCola#i7>I4##>OB-o_AYkvzhV2 zv)yiQ)oL}F&1Oq;0ssKO%Qij+P2_hsGX8OTsjU|O>gpt|BUIz{eU;t&c@hK1h002M{QIoW-AsvMR7ytkOrSdPVDrON38q^p70000< KMNUMnLSTZDm|SB3 From aaaecf731c8273d4f4fae93edd08336f3c2375dc Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Wed, 16 Aug 2017 11:35:36 -0600 Subject: [PATCH 122/164] xenonerfs --- .../mob/living/carbon/human/species_types/furrypeople.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 68520b9ae0..d6f2a08abc 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -89,8 +89,7 @@ datum/species/mammal species_traits = list(MUTCOLORS,LIPS,DIGITIGRADE,PIERCEIMMUNE) mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur","mam_body_markings") default_features = list("xenotail"="xeno","xenohead"="standard","xenodorsal"="standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "xeno") - armor = 5 - heatmod = 1.4 + heatmod = 1.3 no_equip = list(slot_head) attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' From 6f20e222d3d7d7bdf7b84820c7b50bfe6b636bf4 Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Wed, 16 Aug 2017 11:55:40 -0600 Subject: [PATCH 123/164] xenofix --- .../modules/mob/living/carbon/human/species_types/furrypeople.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index d6f2a08abc..ddc3d84534 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -90,7 +90,6 @@ datum/species/mammal mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur","mam_body_markings") default_features = list("xenotail"="xeno","xenohead"="standard","xenodorsal"="standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "xeno") heatmod = 1.3 - no_equip = list(slot_head) attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' From 472e1c59c93604d4e2470bdf11e3b6543c0f51b1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 13:08:39 -0500 Subject: [PATCH 124/164] Fixed mop inhand, adds new inhand for the advanced mop --- .../inhands/equipment/custodial_lefthand.dmi | Bin 1284 -> 1578 bytes .../inhands/equipment/custodial_righthand.dmi | Bin 1317 -> 1603 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/inhands/equipment/custodial_lefthand.dmi b/icons/mob/inhands/equipment/custodial_lefthand.dmi index 80c77cf8dfe4d1ebfdb07797897b9fa551087103..b099ee15243fc4cb14d7d0fd443694ba4da44453 100644 GIT binary patch delta 1483 zcmX|>c|6n$5Ws)JI&y4F>rVNEM7u0DS6M!e=gN|#C}J&<^&Gk0vaTdK)=}$N(xTS6 zh1znpS~+SRMOyb2`p_y=uDpG#_j>ck%zS4)GoP9HW0FOy#E3Ey3}Jo%0DSk6^?8Px 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 v`S$i|K9%*=X7j#zFRp!TKepS39Q*;wjz Date: Wed, 16 Aug 2017 15:06:16 -0500 Subject: [PATCH 125/164] bonesless pizza --- .../mob/living/carbon/human/species_types/furrypeople.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 4aefe45878..32d6a89494 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -97,7 +97,7 @@ datum/species/mammal skinned_type = /obj/item/stack/sheet/animalhide/xeno exotic_bloodtype = "L" damage_overlay_type = "xeno" - roundstart = 0 + roundstart = 1 //Praise the Omnissiah, A challange worthy of my skills - HS From 55c021b386bf09260837872efb92ac6afda58a28 Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Wed, 16 Aug 2017 15:08:43 -0500 Subject: [PATCH 126/164] Update furrypeople.dm --- .../mob/living/carbon/human/species_types/furrypeople.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 55993487d2..32d6a89494 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -79,7 +79,6 @@ datum/species/mammal return TRUE //HERBIVOROUS// - //Alien// /datum/species/xeno // A cloning mistake, crossing human and xenomorph DNA @@ -240,4 +239,4 @@ datum/species/guilmon attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' - roundstart = 1 \ No newline at end of file + roundstart = 1 From 564d2aef7ad7ff4320c44882a46105fe59e2ae57 Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Wed, 16 Aug 2017 15:08:39 -0600 Subject: [PATCH 127/164] attempting to correct and make xenos roundstart --- .../modules/mob/living/carbon/human/species_types/furrypeople.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index ddc3d84534..55993487d2 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -79,6 +79,7 @@ datum/species/mammal return TRUE //HERBIVOROUS// + //Alien// /datum/species/xeno // A cloning mistake, crossing human and xenomorph DNA From 46c43c7ae76b3ba70ca18c85999193f7512867d6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 17:49:13 -0500 Subject: [PATCH 128/164] Removes out of date colon operator log --- .../2015-10-25-colon_operator_log.txt | 434 ------------------ 1 file changed, 434 deletions(-) delete mode 100644 tools/ColonCatcher/2015-10-25-colon_operator_log.txt diff --git a/tools/ColonCatcher/2015-10-25-colon_operator_log.txt b/tools/ColonCatcher/2015-10-25-colon_operator_log.txt deleted file mode 100644 index f8908a0fda..0000000000 --- a/tools/ColonCatcher/2015-10-25-colon_operator_log.txt +++ /dev/null @@ -1,434 +0,0 @@ -..code\world.dm Lines: 27, 28, 98?, 102?, 119?, 149?, 230? Total Colons: 7 -..code\ATMOSPHERICS\atmospherics.dm Lines: 213? Total Colons: 1 -..code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm Lines: 137? Total Colons: 1 -..code\ATMOSPHERICS\components\binary_devices\passive_gate.dm Lines: 134?, 163? Total Colons: 2 -..code\ATMOSPHERICS\components\binary_devices\pump.dm Lines: 43?, 139?, 167? Total Colons: 3 -..code\ATMOSPHERICS\components\binary_devices\valve.dm Lines: 25?, 33?, 38? Total Colons: 3 -..code\ATMOSPHERICS\components\binary_devices\volume_pump.dm Lines: 42?, 136?, 163? Total Colons: 3 -..code\ATMOSPHERICS\components\trinary_devices\filter.dm Lines: 66?, 69?, 214? Total Colons: 3 -..code\ATMOSPHERICS\components\trinary_devices\mixer.dm Lines: 36?, 39?, 151? Total Colons: 3 -..code\ATMOSPHERICS\components\unary_devices\cryo.dm Lines: 152?, 187?, 189, 190, 312?, 313? Total Colons: 7 -..code\ATMOSPHERICS\components\unary_devices\Freezer.dm Lines: 82?, 205? Total Colons: 2 -..code\ATMOSPHERICS\components\unary_devices\vent_pump.dm Lines: 175?, 196?, 197?, 228? Total Colons: 4 -..code\ATMOSPHERICS\components\unary_devices\vent_scrubber.dm Lines: 140?, 141? Total Colons: 2 -..code\ATMOSPHERICS\pipes\manifold.dm Lines: 28? Total Colons: 1 -..code\ATMOSPHERICS\pipes\manifold4w.dm Lines: 19? Total Colons: 1 -..code\ATMOSPHERICS\pipes\pipes.dm Lines: 30?, 32?, 33?, 34?, 43? Total Colons: 5 -..code\ATMOSPHERICS\pipes\heat_exchange\manifold.dm Lines: 25?, 51? Total Colons: 2 -..code\controllers\subsystem\air.dm Lines: 100 Total Colons: 1 -..code\controllers\subsystem\bots.dm Lines: 18, 20 Total Colons: 2 -..code\controllers\subsystem\diseases.dm Lines: 18 Total Colons: 1 -..code\controllers\subsystem\events.dm Lines: 41, 199?, 200? Total Colons: 3 -..code\controllers\subsystem\jobs.dm Lines: 370? Total Colons: 1 -..code\controllers\subsystem\machines.dm Lines: 41, 42, 43 Total Colons: 3 -..code\controllers\subsystem\mobs.dm Lines: 20 Total Colons: 1 -..code\controllers\subsystem\objects.dm Lines: 37 Total Colons: 1 -..code\controllers\subsystem\shuttles.dm Lines: 251?, 253, 261?, 262?, 284, 285 Total Colons: 6 -..code\controllers\subsystem\ticker.dm Lines: 382?, 405? Total Colons: 4 -..code\controllers\subsystem\voting.dm Lines: 203?, 211? Total Colons: 2 -..code\controllers\subsystem\shuttles\emergency.dm Lines: 52?, 65? Total Colons: 4 -..code\controllers\subsystem\shuttles\supply.dm Lines: 97, 316?, 347?, 488?, 505? Total Colons: 10 -..code\datums\browser.dm Lines: 79? Total Colons: 1 -..code\datums\datacore.dm Lines: 91?, 127?, 132?, 137?, 142?, 147?, 152?, 157?, 163?, 169?, 259? Total Colons: 23 -..code\datums\datumvars.dm Lines: 57?, 93 Total Colons: 3 -..code\datums\material_container.dm Lines: 194? Total Colons: 1 -..code\datums\mind.dm Lines: 228?, 229?, 290?, 581?, 633, 634, 643, 648, 720?, 1243, 1244, 1245 Total Colons: 13 -..code\datums\mutations.dm Lines: 34?, 135?, 329? Total Colons: 3 -..code\datums\recipe.dm Lines: 52?, 114?, 115? Total Colons: 3 -..code\datums\diseases\_disease.dm Lines: 125? Total Colons: 1 -..code\datums\helper_datums\teleport.dm Lines: 63?, 64?, 74?, 75? Total Colons: 4 -..code\datums\helper_datums\topic_input.dm Lines: 23?, 27?, 31?, 35?, 42?, 46?, 50?, 56?, 60? Total Colons: 9 -..code\datums\spells\dumbfire.dm Lines: 43 Total Colons: 1 -..code\datums\spells\knock.dm Lines: 21 Total Colons: 1 -..code\datums\spells\projectile.dm Lines: 35 Total Colons: 1 -..code\datums\wires\airlock.dm Lines: 37?, 38?, 39?, 40?, 41?, 42?, 43? Total Colons: 7 -..code\datums\wires\alarm.dm Lines: 21? Total Colons: 3 -..code\datums\wires\apc.dm Lines: 13? Total Colons: 3 -..code\datums\wires\autolathe.dm Lines: 13? Total Colons: 3 -..code\datums\wires\particle_accelerator.dm Lines: 50? Total Colons: 1 -..code\datums\wires\pizza_bomb.dm Lines: 45?, 46? Total Colons: 2 -..code\datums\wires\robot.dm Lines: 16?, 17?, 18? Total Colons: 4 -..code\datums\wires\r_n_d.dm Lines: 48?, 49?, 50? Total Colons: 3 -..code\datums\wires\syndicatebomb.dm Lines: 46?, 75? Total Colons: 2 -..code\datums\wires\vending.dm Lines: 28?, 29?, 30?, 31? Total Colons: 4 -..code\datums\wires\wires.dm Lines: 119?, 121? Total Colons: 2 -..code\game\atoms.dm Lines: 297? Total Colons: 1 -..code\game\atoms_movable.dm Lines: 181?, 182?, 216? Total Colons: 3 -..code\game\communications.dm Lines: 288 Total Colons: 3 -..code\game\data_huds.dm Lines: 35? Total Colons: 1 -..code\game\dna.dm Lines: 231? Total Colons: 1 -..code\game\say.dm Lines: 45?, 49? Total Colons: 2 -..code\game\sound.dm Lines: 72? Total Colons: 1 -..code\game\gamemodes\antag_spawner.dm Lines: 103, 104 Total Colons: 3 -..code\game\gamemodes\objective.dm Lines: 84?, 112?, 139?, 172?, 201?, 433, 806 Total Colons: 7 -..code\game\gamemodes\abduction\abduction_gear.dm Lines: 159? Total Colons: 1 -..code\game\gamemodes\abduction\machinery\experiment.dm Lines: 41?, 107? Total Colons: 2 -..code\game\gamemodes\blob\blob_finish.dm Lines: 47? Total Colons: 1 -..code\game\gamemodes\blob\blob_report.dm Lines: 64, 70, 76, 85 Total Colons: 4 -..code\game\gamemodes\changeling\evolution_menu.dm Lines: 59? Total Colons: 3 -..code\game\gamemodes\changeling\powers\adrenaline.dm Lines: 12? Total Colons: 1 -..code\game\gamemodes\changeling\powers\mutations.dm Lines: 83? Total Colons: 1 -..code\game\gamemodes\cult\cult.dm Lines: 44? Total Colons: 1 -..code\game\gamemodes\cult\runes.dm Lines: 705?, 706? Total Colons: 2 -..code\game\gamemodes\gang\dominator.dm Lines: 101?, 187? Total Colons: 2 -..code\game\gamemodes\gang\gang.dm Lines: 261?, 266? Total Colons: 2 -..code\game\gamemodes\gang\gang_datum.dm Lines: 43?, 53?, 121? Total Colons: 3 -..code\game\gamemodes\gang\gang_pen.dm Lines: 59? Total Colons: 1 -..code\game\gamemodes\gang\recaller.dm Lines: 48?, 51? Total Colons: 4 -..code\game\gamemodes\malfunction\malfunction.dm Lines: 63, 64, 65, 185, 188, 189, 192, 204, 205, 216, 218, 219, 221, 233, 234 Total Colons: 15 -..code\game\gamemodes\meteor\meteors.dm Lines: 177? Total Colons: 2 -..code\game\gamemodes\nuclear\nuclearbomb.dm Lines: 197?, 212?, 215?, 217?, 220?, 222?, 265?, 359, 359?, 360, 365, 383? Total Colons: 25 -..code\game\gamemodes\revolution\revolution.dm Lines: 265?, 266?, 286? Total Colons: 3 -..code\game\gamemodes\shadowling\shadowling.dm Lines: 304? Total Colons: 1 -..code\game\gamemodes\traitor\traitor.dm Lines: 335? Total Colons: 1 -..code\game\gamemodes\wizard\artefact.dm Lines: 148? Total Colons: 1 -..code\game\gamemodes\wizard\rightandwrong.dm Lines: 9?, 10?, 11? Total Colons: 3 -..code\game\gamemodes\wizard\soulstone.dm Lines: 123, 195 Total Colons: 2 -..code\game\gamemodes\wizard\spellbook.dm Lines: 93?, 512?, 533? Total Colons: 3 -..code\game\gamemodes\wizard\wizard.dm Lines: 183?, 258, 261, 264, 278? Total Colons: 5 -..code\game\machinery\airlock_control.dm Lines: 59?, 60? Total Colons: 2 -..code\game\machinery\ai_slipper.dm Lines: 39?, 67, 77?, 93? Total Colons: 5 -..code\game\machinery\alarm.dm Lines: 134?, 135?, 730?, 742?, 895?, 934?, 1056?, 1071?, 1127?, 1128? Total Colons: 16 -..code\game\machinery\announcement_system.dm Lines: 45?, 47?, 136?, 137? Total Colons: 4 -..code\game\machinery\atmo_control.dm Lines: 273?, 284?, 396? Total Colons: 3 -..code\game\machinery\autolathe.dm Lines: 139?, 178?, 187?, 295?, 322?, 336?, 345? Total Colons: 10 -..code\game\machinery\Beacon.dm Lines: 31? Total Colons: 1 -..code\game\machinery\buttons.dm Lines: 22?, 23? Total Colons: 4 -..code\game\machinery\cell_charger.dm Lines: 15?, 31?, 64? Total Colons: 4 -..code\game\machinery\cloning.dm Lines: 88?, 92? Total Colons: 2 -..code\game\machinery\constructable_frame.dm Lines: 48?, 90?, 94?, 99?, 102?, 475? Total Colons: 8 -..code\game\machinery\deployable.dm Lines: 92 Total Colons: 1 -..code\game\machinery\dna_scanner.dm Lines: 44?, 48?, 57? Total Colons: 3 -..code\game\machinery\droneDispenser.dm Lines: 190? Total Colons: 1 -..code\game\machinery\iv_drip.dm Lines: 192?, 200?, 210? Total Colons: 3 -..code\game\machinery\lightswitch.dm Lines: 41? Total Colons: 1 -..code\game\machinery\machinery.dm Lines: 372?, 375? Total Colons: 2 -..code\game\machinery\magnet.dm Lines: 53?, 275?, 279? Total Colons: 3 -..code\game\machinery\navbeacon.dm Lines: 63?, 84?, 92?, 122?, 130? Total Colons: 6 -..code\game\machinery\newscaster.dm Lines: 205?, 206?, 291?, 304?, 311?, 318?, 319?, 372, 391?, 409?, 420?, 423, 424?, 430?, 431?, 436, 460?, 465?, 486, 614?, 724?, 727?, 922 Total Colons: 27 -..code\game\machinery\overview.dm Lines: 98, 167?, 243, 292? Total Colons: 4 -..code\game\machinery\portable_turret.dm Lines: 162?, 164?, 169?, 170?, 171?, 172?, 173?, 183?, 285?, 862?, 864?, 869?, 870?, 871?, 872?, 873?, 877?, 889?, 891?, 896?, 897?, 898?, 899?, 900?, 910?, 968?, 1049?, 1085, 1097?, 1098? Total Colons: 32 -..code\game\machinery\recharger.dm Lines: 19? Total Colons: 1 -..code\game\machinery\rechargestation.dm Lines: 122?, 124? Total Colons: 2 -..code\game\machinery\recycler.dm Lines: 43?, 44?, 45?, 84? Total Colons: 4 -..code\game\machinery\requests_console.dm Lines: 201?, 202?, 212?, 213? Total Colons: 4 -..code\game\machinery\robot_fabricator.dm Lines: 21, 23, 24, 25, 28 Total Colons: 5 -..code\game\machinery\shieldgen.dm Lines: 247?, 261?, 263?, 441? Total Colons: 4 -..code\game\machinery\Sleeper.dm Lines: 142?, 156?, 162? Total Colons: 4 -..code\game\machinery\slotmachine.dm Lines: 219?, 265?, 271? Total Colons: 3 -..code\game\machinery\spaceheater.dm Lines: 33?, 35?, 37?, 69?, 89?, 107? Total Colons: 9 -..code\game\machinery\status_display.dm Lines: 167 Total Colons: 4 -..code\game\machinery\suit_storage_unit.dm Lines: 199?, 200?, 212?, 215?, 218?, 221?, 227?, 231?, 232?, 519? Total Colons: 12 -..code\game\machinery\syndicatebeacon.dm Lines: 151? Total Colons: 1 -..code\game\machinery\syndicatebomb.dm Lines: 22?, 53?, 77?, 323?, 326? Total Colons: 6 -..code\game\machinery\teleporter.dm Lines: 69?, 442? Total Colons: 3 -..code\game\machinery\turrets.dm Lines: 542?, 578, 590?, 591? Total Colons: 6 -..code\game\machinery\vending.dm Lines: 248?, 323? Total Colons: 2 -..code\game\machinery\atmoalter\canister.dm Lines: 248, 289?, 290?, 291?, 292?, 295?, 297? Total Colons: 7 -..code\game\machinery\atmoalter\pump.dm Lines: 109? Total Colons: 3 -..code\game\machinery\atmoalter\scrubber.dm Lines: 127?, 203? Total Colons: 3 -..code\game\machinery\bots\bots.dm Lines: 244?, 337?, 338?, 340?, 416?, 481? Total Colons: 6 -..code\game\machinery\bots\cleanbot.dm Lines: 84?, 85?, 87?, 88?, 109? Total Colons: 6 -..code\game\machinery\bots\ed209bot.dm Lines: 107?, 109?, 115?, 116?, 117?, 118?, 119?, 120?, 155?, 258?, 456? Total Colons: 12 -..code\game\machinery\bots\floorbot.dm Lines: 104?, 105?, 107?, 109?, 110?, 111?, 112?, 113?, 114?, 115?, 116?, 147?, 360? Total Colons: 13 -..code\game\machinery\bots\medbot.dm Lines: 147?, 148?, 154?, 171?, 173?, 174?, 175?, 176?, 177?, 231?, 320?, 532? Total Colons: 12 -..code\game\machinery\bots\mulebot.dm Lines: 99?, 147?, 187?, 209?, 210?, 211?, 225?, 226?, 227?, 228?, 249?, 282?, 346?, 354?, 363?, 535? Total Colons: 17 -..code\game\machinery\bots\secbot.dm Lines: 97?, 99?, 104?, 105?, 106?, 107?, 108?, 109?, 142?, 222? Total Colons: 11 -..code\game\machinery\camera\camera.dm Lines: 141?, 151?, 152? Total Colons: 3 -..code\game\machinery\camera\tracking.dm Lines: 19?, 83? Total Colons: 2 -..code\game\machinery\computer\arcade.dm Lines: 860?, 862?, 863?, 871? Total Colons: 6 -..code\game\machinery\computer\camera.dm Lines: 56? Total Colons: 1 -..code\game\machinery\computer\camera_advanced.dm Lines: 154? Total Colons: 1 -..code\game\machinery\computer\card.dm Lines: 148?, 164?, 209?, 364?, 372?, 390? Total Colons: 6 -..code\game\machinery\computer\cloning.dm Lines: 146? Total Colons: 1 -..code\game\machinery\computer\communications.dm Lines: 106, 148?, 272?, 428?, 429?, 430, 453?, 468?, 531?, 532?, 533, 554? Total Colons: 12 -..code\game\machinery\computer\crew.dm Lines: 153?, 158?, 169? Total Colons: 3 -..code\game\machinery\computer\dna_console.dm Lines: 94?, 139?, 141?, 143?, 181? Total Colons: 5 -..code\game\machinery\computer\medical.dm Lines: 40?, 46, 153? Total Colons: 4 -..code\game\machinery\computer\message.dm Lines: 73?, 76?, 131?, 150? Total Colons: 4 -..code\game\machinery\computer\Operating.dm Lines: 50? Total Colons: 1 -..code\game\machinery\computer\pod.dm Lines: 56? Total Colons: 2 -..code\game\machinery\computer\robot.dm Lines: 65?, 107?, 109?, 110?, 112?, 114? Total Colons: 6 -..code\game\machinery\computer\security.dm Lines: 49?, 62, 117, 130, 275, 285 Total Colons: 7 -..code\game\machinery\computer\shuttle.dm Lines: 24, 25, 28, 30, 33, 34, 47, 48, 60 Total Colons: 9 -..code\game\machinery\computer\station_alert.dm Lines: 73? Total Colons: 1 -..code\game\machinery\doors\airlock.dm Lines: 790?, 791?, 800?, 801?, 809?, 877, 888 Total Colons: 7 -..code\game\machinery\doors\airlock_electronics.dm Lines: 81 Total Colons: 1 -..code\game\machinery\doors\brigdoors.dm Lines: 123?, 158?, 247 Total Colons: 7 -..code\game\machinery\doors\firedoor.dm Lines: 49?, 69 Total Colons: 2 -..code\game\machinery\doors\windowdoor.dm Lines: 188?, 200, 276? Total Colons: 3 -..code\game\machinery\embedded_controller\access_controller.dm Lines: 295?, 297? Total Colons: 2 -..code\game\machinery\embedded_controller\airlock_controller.dm Lines: 258?, 259?, 260?, 261? Total Colons: 4 -..code\game\machinery\pipe\construction.dm Lines: 134?, 162? Total Colons: 2 -..code\game\machinery\telecomms\machine_interactions.dm Lines: 57?, 64?, 159?, 160?, 161?, 184?, 220? Total Colons: 7 -..code\game\mecha\mecha.dm Lines: 561?, 582?, 838?, 843?, 935?, 936?, 937?, 986?, 987? Total Colons: 11 -..code\game\mecha\mecha_control_console.dm Lines: 72? Total Colons: 1 -..code\game\mecha\mecha_topic.dm Lines: 33?, 34?, 36?, 40?, 90?, 164?, 168?, 190?, 197? Total Colons: 21 -..code\game\mecha\mecha_wreckage.dm Lines: 25?, 42? Total Colons: 2 -..code\game\mecha\mech_fabricator.dm Lines: 120?, 132?, 237? Total Colons: 6 -..code\game\mecha\combat\combat.dm Lines: 65?, 67? Total Colons: 3 -..code\game\mecha\combat\durand.dm Lines: 38?, 50? Total Colons: 2 -..code\game\mecha\combat\gygax.dm Lines: 69?, 74?, 105? Total Colons: 3 -..code\game\mecha\combat\honker.dm Lines: 32?, 33?, 35? Total Colons: 14 -..code\game\mecha\combat\marauder.dm Lines: 70?, 158?, 160? Total Colons: 5 -..code\game\mecha\combat\phazon.dm Lines: 39?, 97?, 98? Total Colons: 3 -..code\game\mecha\equipment\mecha_equipment.dm Lines: 57? Total Colons: 3 -..code\game\mecha\equipment\tools\medical_tools.dm Lines: 96, 96?, 129?, 249?, 333?, 366, 370?, 371? Total Colons: 20 -..code\game\mecha\equipment\tools\mining_tools.dm Lines: 40, 51 Total Colons: 2 -..code\game\mecha\equipment\tools\other_tools.dm Lines: 132?, 160?, 182?, 222?, 328?, 406, 406?, 446? Total Colons: 10 -..code\game\mecha\equipment\tools\work_tools.dm Lines: 329?, 350?, 351?, 368, 368? Total Colons: 7 -..code\game\mecha\equipment\weapons\weapons.dm Lines: 208? Total Colons: 1 -..code\game\mecha\working\ripley.dm Lines: 53?, 55? Total Colons: 2 -..code\game\objects\explosion.dm Lines: 11?, 12?, 68? Total Colons: 5 -..code\game\objects\items.dm Lines: 213? Total Colons: 1 -..code\game\objects\items\candle.dm Lines: 23? Total Colons: 1 -..code\game\objects\items\crayons.dm Lines: 117, 171?, 172?, 173?, 210? Total Colons: 5 -..code\game\objects\items\toys.dm Lines: 133?, 187?, 234?, 452?, 471? Total Colons: 6 -..code\game\objects\items\devices\aicard.dm Lines: 83?, 85?, 129?, 138? Total Colons: 4 -..code\game\objects\items\devices\flashlight.dm Lines: 60? Total Colons: 2 -..code\game\objects\items\devices\geiger_counter.dm Lines: 93? Total Colons: 1 -..code\game\objects\items\devices\paicard.dm Lines: 40?, 41? Total Colons: 2 -..code\game\objects\items\devices\scanners.dm Lines: 123?, 137?, 139?, 141?, 143?, 147?, 149, 164?, 212?, 396? Total Colons: 11 -..code\game\objects\items\devices\taperecorder.dm Lines: 28?, 97, 117, 142 Total Colons: 4 -..code\game\objects\items\devices\transfer_valve.dm Lines: 69?, 102 Total Colons: 6 -..code\game\objects\items\devices\PDA\cart.dm Lines: 241, 245, 275, 292?, 293?, 294, 348?, 424, 435, 473?, 499?, 533?, 546?, 557?, 585, 594, 601, 605, 606, 609, 610, 611, 612, 631, 642?, 649?, 702?, 703?, 705?, 706?, 707?, 708?, 709?, 711, 712, 713, 716, 717, 718 Total Colons: 44 -..code\game\objects\items\devices\PDA\PDA.dm Lines: 298?, 299?, 330?, 356?, 358?, 360?, 364?, 378?, 382?, 383?, 388, 390, 392, 618, 619, 631, 632, 692, 693, 918, 1010?, 1036, 1039, 1131?, 1143? Total Colons: 25 -..code\game\objects\items\devices\radio\electropack.dm Lines: 129? Total Colons: 1 -..code\game\objects\items\devices\radio\radio.dm Lines: 136?, 137, 137?, 138, 138?, 139, 140, 141, 143, 144, 146, 147?, 148, 148?, 149, 150, 151, 153, 154, 155 Total Colons: 22 -..code\game\objects\items\robot\robot_parts.dm Lines: 137, 143, 150, 258?, 259?, 261?, 262?, 263?, 264? Total Colons: 11 -..code\game\objects\items\robot\robot_upgrades.dm Lines: 250? Total Colons: 1 -..code\game\objects\items\stacks\sheets\glass.dm Lines: 303? Total Colons: 1 -..code\game\objects\items\weapons\AI_modules.dm Lines: 37?, 72?, 73?, 74? Total Colons: 4 -..code\game\objects\items\weapons\cards_ids.dm Lines: 115?, 118?, 148? Total Colons: 6 -..code\game\objects\items\weapons\cigs_lighters.dm Lines: 479?, 496? Total Colons: 2 -..code\game\objects\items\weapons\cosmetics.dm Lines: 36?, 54? Total Colons: 2 -..code\game\objects\items\weapons\defib.dm Lines: 470?, 485?, 487?, 489?, 491?, 508?, 527?, 530? Total Colons: 8 -..code\game\objects\items\weapons\explosives.dm Lines: 57? Total Colons: 1 -..code\game\objects\items\weapons\extinguisher.dm Lines: 45?, 46? Total Colons: 2 -..code\game\objects\items\weapons\flamethrower.dm Lines: 90?, 128? Total Colons: 2 -..code\game\objects\items\weapons\handcuffs.dm Lines: 208? Total Colons: 1 -..code\game\objects\items\weapons\RCD.dm Lines: 500, 505 Total Colons: 4 -..code\game\objects\items\weapons\singularityhammer.dm Lines: 42 Total Colons: 1 -..code\game\objects\items\weapons\stunbaton.dm Lines: 94? Total Colons: 1 -..code\game\objects\items\weapons\grenades\chem_grenade.dm Lines: 60? Total Colons: 1 -..code\game\objects\items\weapons\grenades\grenade.dm Lines: 49? Total Colons: 1 -..code\game\objects\items\weapons\implants\implantchair.dm Lines: 46?, 47?, 49? Total Colons: 5 -..code\game\objects\items\weapons\implants\implantpad.dm Lines: 56 Total Colons: 1 -..code\game\objects\items\weapons\storage\book.dm Lines: 180 Total Colons: 1 -..code\game\objects\items\weapons\storage\fancy.dm Lines: 39? Total Colons: 1 -..code\game\objects\items\weapons\storage\secure.dm Lines: 32?, 39?, 84? Total Colons: 3 -..code\game\objects\items\weapons\storage\storage.dm Lines: 177? Total Colons: 1 -..code\game\objects\items\weapons\tanks\jetpack.dm Lines: 26?, 44?, 151? Total Colons: 3 -..code\game\objects\items\weapons\tanks\tanks.dm Lines: 121?, 122? Total Colons: 2 -..code\game\objects\items\weapons\tanks\watertank.dm Lines: 177?, 178? Total Colons: 2 -..code\game\objects\structures\ai_core.dm Lines: 212?, 213? Total Colons: 2 -..code\game\objects\structures\displaycase.dm Lines: 119?, 128?, 130? Total Colons: 3 -..code\game\objects\structures\fireaxe.dm Lines: 129? Total Colons: 1 -..code\game\objects\structures\grille.dm Lines: 148?, 149? Total Colons: 2 -..code\game\objects\structures\musician.dm Lines: 50?, 130?, 132? Total Colons: 3 -..code\game\objects\structures\safe.dm Lines: 78?, 98?, 104?, 188? Total Colons: 4 -..code\game\objects\structures\tank_dispenser.dm Lines: 43?, 44? Total Colons: 2 -..code\game\objects\structures\watercloset.dm Lines: 51?, 54? Total Colons: 3 -..code\game\objects\structures\windoor_assembly.dm Lines: 50? Total Colons: 1 -..code\game\objects\structures\window.dm Lines: 197?, 199?, 201?, 206?, 207?, 211?, 215?, 218?, 222?, 223?, 425? Total Colons: 11 -..code\game\objects\structures\beds_chairs\bed.dm Lines: 129? Total Colons: 1 -..code\game\objects\structures\crates_lockers\closets.dm Lines: 66?, 234?, 241?, 243?, 392? Total Colons: 6 -..code\game\objects\structures\transit_tubes\station.dm Lines: 130? Total Colons: 1 -..code\game\objects\structures\transit_tubes\transit_tube_construction.dm Lines: 41?, 43? Total Colons: 2 -..code\game\turfs\turf.dm Lines: 137, 248?, 250? Total Colons: 4 -..code\game\turfs\space\space.dm Lines: 114?, 125? Total Colons: 2 -..code\game\verbs\ooc.dm Lines: 44?, 53?, 55?, 57?, 69? Total Colons: 6 -..code\LINDA\LINDA_turf_tile.dm Lines: 458?, 463? Total Colons: 2 -..code\modules\admin\admin.dm Lines: 30?, 62?, 63?, 64?, 65?, 66?, 67?, 122, 129, 141, 192?, 205?, 212?, 246, 262?, 277?, 288?, 292, 293?, 300?, 301?, 306, 334?, 352, 415?, 442?, 550?, 551?, 676?, 677?, 696? Total Colons: 35 -..code\modules\admin\admin_verbs.dm Lines: 441?, 442? Total Colons: 2 -..code\modules\admin\create_poll.dm Lines: 25?, 26?, 94?, 95? Total Colons: 4 -..code\modules\admin\newbanjob.dm Lines: 216? Total Colons: 2 -..code\modules\admin\player_panel.dm Lines: 111?, 113?, 119?, 123?, 129?, 155?, 160?, 166?, 181?, 186?, 195?, 207?, 219?, 228?, 240?, 249?, 258?, 269?, 284?, 297? Total Colons: 36 -..code\modules\admin\sql_notes.dm Lines: 153 Total Colons: 2 -..code\modules\admin\topic.dm Lines: 299?, 310?, 341?, 348?, 349?, 447?, 986?, 1559?, 1561?, 1589?, 1796?, 1797?, 1798?, 1800?, 1982?, 2093?, 2096?, 2101?, 2102? Total Colons: 21 -..code\modules\admin\DB ban\functions.dm Lines: 93, 94, 95, 127?, 131?, 304, 305, 306, 441? Total Colons: 20 -..code\modules\admin\verbs\adminjump.dm Lines: 91, 127 Total Colons: 2 -..code\modules\admin\verbs\deadsay.dm Lines: 24? Total Colons: 1 -..code\modules\admin\verbs\debug.dm Lines: 82?, 86?, 89?, 112?, 116?, 289, 306, 498, 501 Total Colons: 9 -..code\modules\admin\verbs\diagnostics.dm Lines: 15?, 81 Total Colons: 5 -..code\modules\admin\verbs\massmodvar.dm Lines: 132 Total Colons: 1 -..code\modules\admin\verbs\modifyvariables.dm Lines: 542 Total Colons: 1 -..code\modules\admin\verbs\one_click_antag.dm Lines: 333?, 478?, 481?, 484?, 487?, 490?, 493?, 496?, 517? Total Colons: 9 -..code\modules\admin\verbs\panicbunker.dm Lines: 10?, 11? Total Colons: 2 -..code\modules\admin\verbs\randomverbs.dm Lines: 38?, 114?, 116?, 117?, 189?, 212?, 409?, 448?, 721?, 722?, 799, 804, 810, 816, 822, 828, 834, 840, 846, 852, 858, 864, 870, 876, 882, 888, 894, 900 Total Colons: 28 -..code\modules\assembly\bomb.dm Lines: 44 Total Colons: 1 -..code\modules\assembly\doorcontrol.dm Lines: 62? Total Colons: 1 -..code\modules\assembly\health.dm Lines: 77? Total Colons: 1 -..code\modules\assembly\infrared.dm Lines: 24?, 110? Total Colons: 3 -..code\modules\assembly\mousetrap.dm Lines: 30?, 127? Total Colons: 2 -..code\modules\assembly\proximity.dm Lines: 26?, 109?, 110? Total Colons: 3 -..code\modules\assembly\signaler.dm Lines: 142? Total Colons: 1 -..code\modules\assembly\timer.dm Lines: 75? Total Colons: 1 -..code\modules\assembly\voice.dm Lines: 32? Total Colons: 1 -..code\modules\awaymissions\maploader\reader.dm Lines: 262? Total Colons: 1 -..code\modules\awaymissions\maploader\swapmaps.dm Lines: 152, 153, 154, 161?, 162?, 163?, 343?, 356?, 362?, 385? Total Colons: 19 -..code\modules\client\client procs.dm Lines: 36, 36?, 177? Total Colons: 3 -..code\modules\client\preferences.dm Lines: 129?, 130?, 151?, 161?, 166?, 186?, 335?, 336?, 337?, 338?, 339?, 340?, 341?, 342?, 343?, 349?, 350?, 353?, 356?, 397?, 523? Total Colons: 21 -..code\modules\client\preferences_toggles.dm Lines: 7?, 16?, 25?, 34?, 43?, 54?, 64?, 74?, 83?, 92?, 113?, 122?, 172?, 226?, 235?, 259? Total Colons: 16 -..code\modules\clothing\clothing.dm Lines: 357? Total Colons: 1 -..code\modules\clothing\glasses\engine_goggles.dm Lines: 83?, 108? Total Colons: 2 -..code\modules\clothing\head\helmet.dm Lines: 240? Total Colons: 1 -..code\modules\clothing\head\soft_caps.dm Lines: 45? Total Colons: 1 -..code\modules\clothing\masks\gasmask.dm Lines: 66? Total Colons: 1 -..code\modules\clothing\masks\miscellaneous.dm Lines: 56? Total Colons: 1 -..code\modules\clothing\shoes\bananashoes.dm Lines: 59?, 65? Total Colons: 3 -..code\modules\clothing\shoes\magboots.dm Lines: 32?, 41? Total Colons: 2 -..code\modules\clothing\spacesuits\chronosuit.dm Lines: 146, 151, 152, 153, 158, 172, 175, 176, 177 Total Colons: 9 -..code\modules\crafting\table.dm Lines: 15, 59, 113, 126, 143, 167 Total Colons: 6 -..code\modules\detectivework\detective_work.dm Lines: 16? Total Colons: 1 -..code\modules\events\event.dm Lines: 37 Total Colons: 2 -..code\modules\events\shuttle_loan.dm Lines: 195, 196 Total Colons: 2 -..code\modules\flufftext\Hallucination.dm Lines: 47?, 49?, 51? Total Colons: 3 -..code\modules\food&drinks\food\customizables.dm Lines: 37? Total Colons: 1 -..code\modules\food&drinks\kitchen machinery\gibber.dm Lines: 165? Total Colons: 1 -..code\modules\food&drinks\kitchen machinery\monkeyrecycler.dm Lines: 72? Total Colons: 1 -..code\modules\food&drinks\kitchen machinery\processor.dm Lines: 198? Total Colons: 1 -..code\modules\games\cards.dm Lines: 177?, 211?, 225? Total Colons: 3 -..code\modules\holiday\easter.dm Lines: 77? Total Colons: 1 -..code\modules\html_interface\html_interface.dm Lines: 292? Total Colons: 1 -..code\modules\hydroponics\grown.dm Lines: 704 Total Colons: 1 -..code\modules\hydroponics\growninedible.dm Lines: 71, 194? Total Colons: 2 -..code\modules\hydroponics\hydroponics.dm Lines: 642?, 836? Total Colons: 2 -..code\modules\hydroponics\seeds.dm Lines: 1377?, 1378? Total Colons: 2 -..code\modules\library\lib_items.dm Lines: 186? Total Colons: 1 -..code\modules\library\lib_machines.dm Lines: 519 Total Colons: 1 -..code\modules\lighting\lighting_system.dm Lines: 254 Total Colons: 1 -..code\modules\mob\inventory.dm Lines: 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 170 Total Colons: 22 -..code\modules\mob\login.dm Lines: 6? Total Colons: 1 -..code\modules\mob\mob.dm Lines: 329?, 599?, 690, 756? Total Colons: 5 -..code\modules\mob\mob_helpers.dm Lines: 485? Total Colons: 2 -..code\modules\mob\transform_procs.dm Lines: 295 Total Colons: 1 -..code\modules\mob\dead\observer\observer.dm Lines: 285? Total Colons: 1 -..code\modules\mob\living\living.dm Lines: 181?, 359?, 402 Total Colons: 3 -..code\modules\mob\living\say.dm Lines: 116? Total Colons: 1 -..code\modules\mob\living\carbon\carbon.dm Lines: 114, 286?, 288?, 291?, 310?, 311?, 322?, 323?, 566? Total Colons: 12 -..code\modules\mob\living\carbon\life.dm Lines: 468? Total Colons: 1 -..code\modules\mob\living\carbon\alien\humanoid\emote.dm Lines: 60? Total Colons: 1 -..code\modules\mob\living\carbon\alien\humanoid\humanoid.dm Lines: 93? Total Colons: 2 -..code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm Lines: 43?, 46? Total Colons: 2 -..code\modules\mob\living\carbon\alien\larva\emote.dm Lines: 79? Total Colons: 1 -..code\modules\mob\living\carbon\brain\MMI.dm Lines: 131?, 132? Total Colons: 2 -..code\modules\mob\living\carbon\human\examine.dm Lines: 48?, 55?, 62?, 69?, 76?, 83?, 90?, 97?, 115?, 122?, 129?, 136? Total Colons: 12 -..code\modules\mob\living\carbon\human\human.dm Lines: 87?, 96?, 192?, 194?, 196?, 200?, 205?, 210?, 215?, 219?, 221?, 223?, 231?, 236?, 241?, 248?, 250?, 252?, 253?, 254?, 324?, 325?, 341?, 563?, 734? Total Colons: 26 -..code\modules\mob\living\carbon\human\human_attackalien.dm Lines: 10? Total Colons: 1 -..code\modules\mob\living\carbon\human\inventory.dm Lines: 223?, 234?, 238?, 246?, 250?, 254? Total Colons: 6 -..code\modules\mob\living\carbon\human\species.dm Lines: 115?, 117?, 126?, 329?, 673? Total Colons: 5 -..code\modules\mob\living\carbon\human\update_icons.dm Lines: 112?, 186?, 479? Total Colons: 4 -..code\modules\mob\living\carbon\human\whisper.dm Lines: 43? Total Colons: 1 -..code\modules\mob\living\carbon\monkey\emote.dm Lines: 60? Total Colons: 1 -..code\modules\mob\living\silicon\silicon.dm Lines: 129, 324? Total Colons: 2 -..code\modules\mob\living\silicon\ai\ai.dm Lines: 255?, 280?, 281?, 341?, 530?, 532?, 585?, 593? Total Colons: 9 -..code\modules\mob\living\silicon\ai\life.dm Lines: 73, 75, 78, 80, 96, 97, 121, 145, 150, 166 Total Colons: 10 -..code\modules\mob\living\silicon\ai\say.dm Lines: 15? Total Colons: 2 -..code\modules\mob\living\silicon\ai\freelook\eye.dm Lines: 106? Total Colons: 1 -..code\modules\mob\living\silicon\pai\pai.dm Lines: 161, 181 Total Colons: 2 -..code\modules\mob\living\silicon\pai\software.dm Lines: 220?, 277?, 279?, 281?, 317?, 410?, 415?, 422?, 434, 434?, 435, 436, 436?, 437, 437?, 438, 438?, 439, 439?, 440, 442, 443, 444, 445, 446, 550, 557? Total Colons: 29 -..code\modules\mob\living\silicon\robot\examine.dm Lines: 29?, 31? Total Colons: 2 -..code\modules\mob\living\silicon\robot\inventory.dm Lines: 54, 62, 70 Total Colons: 3 -..code\modules\mob\living\silicon\robot\laws.dm Lines: 47? Total Colons: 1 -..code\modules\mob\living\silicon\robot\life.dm Lines: 173, 175, 177 Total Colons: 3 -..code\modules\mob\living\silicon\robot\robot.dm Lines: 259?, 393?, 492?, 545?, 806?, 1034? Total Colons: 8 -..code\modules\mob\living\simple_animal\parrot.dm Lines: 412?, 414? Total Colons: 2 -..code\modules\mob\living\simple_animal\worm.dm Lines: 74? Total Colons: 1 -..code\modules\mob\living\simple_animal\friendly\drone\interaction.dm Lines: 103? Total Colons: 2 -..code\modules\mob\living\simple_animal\friendly\drone\verbs.dm Lines: 25? Total Colons: 1 -..code\modules\mob\living\simple_animal\friendly\drone\_drone.dm Lines: 123?, 130?, 137?, 144? Total Colons: 4 -..code\modules\mob\living\simple_animal\hostile\hostile.dm Lines: 255, 256 Total Colons: 4 -..code\modules\mob\living\simple_animal\morph\morph.dm Lines: 183? Total Colons: 1 -..code\modules\mob\living\simple_animal\slime\death.dm Lines: 15? Total Colons: 1 -..code\modules\mob\living\simple_animal\slime\life.dm Lines: 190? Total Colons: 1 -..code\modules\mob\living\simple_animal\slime\powers.dm Lines: 75? Total Colons: 1 -..code\modules\mob\living\simple_animal\slime\slime.dm Lines: 79?, 80?, 90? Total Colons: 3 -..code\modules\mob\new_player\new_player.dm Lines: 27, 29, 44?, 69?, 73? Total Colons: 5 -..code\modules\mob\new_player\poll.dm Lines: 12?, 29?, 478? Total Colons: 3 -..code\modules\nano\JSON Reader.dm Lines: 71 Total Colons: 2 -..code\modules\nano\nanoui.dm Lines: 304? Total Colons: 1 -..code\modules\ninja\admin_ninja_verbs.dm Lines: 30, 32 Total Colons: 2 -..code\modules\ninja\ninja_event.dm Lines: 141? Total Colons: 1 -..code\modules\ninja\suit\gloves.dm Lines: 80?, 87? Total Colons: 2 -..code\modules\ninja\suit\mask.dm Lines: 116?, 129?, 132?, 139? Total Colons: 4 -..code\modules\ninja\suit\ninjaDrainAct.dm Lines: 128?, 159? Total Colons: 2 -..code\modules\ninja\suit\suit.dm Lines: 75?, 79?, 116?, 172? Total Colons: 4 -..code\modules\ninja\suit\suit_attackby.dm Lines: 10?, 12?, 19? Total Colons: 3 -..code\modules\ninja\suit\suit_initialisation.dm Lines: 84 Total Colons: 1 -..code\modules\ninja\suit\n_suit_verbs\energy_net_nets.dm Lines: 64, 65, 112?, 131 Total Colons: 4 -..code\modules\ninja\suit\n_suit_verbs\ninja_stars.dm Lines: 12? Total Colons: 1 -..code\modules\paperwork\filingcabinet.dm Lines: 57? Total Colons: 1 -..code\modules\paperwork\folders.dm Lines: 43? Total Colons: 1 -..code\modules\paperwork\paper.dm Lines: 86? Total Colons: 1 -..code\modules\paperwork\paperbin.dm Lines: 97? Total Colons: 1 -..code\modules\paperwork\photocopier.dm Lines: 123?, 264?, 268? Total Colons: 5 -..code\modules\paperwork\photography.dm Lines: 66?, 67?, 79?, 183, 184, 189, 190, 217, 217?, 219, 219? Total Colons: 14 -..code\modules\power\apc.dm Lines: 128?, 129?, 133, 148, 199?, 201?, 202?, 262?, 454?, 469?, 474, 647, 647?, 664?, 671?, 715?, 838, 839, 840, 1184, 1221? Total Colons: 25 -..code\modules\power\cable.dm Lines: 108?, 293?, 564? Total Colons: 3 -..code\modules\power\generator.dm Lines: 117? Total Colons: 2 -..code\modules\power\gravitygenerator.dm Lines: 230?, 250?, 258?, 264?, 279?, 280?, 287? Total Colons: 7 -..code\modules\power\lighting.dm Lines: 261?, 440? Total Colons: 2 -..code\modules\power\port_gen.dm Lines: 89?, 273? Total Colons: 2 -..code\modules\power\smes.dm Lines: 57, 419? Total Colons: 4 -..code\modules\power\solar.dm Lines: 388?, 391? Total Colons: 2 -..code\modules\power\turbine.dm Lines: 308?, 365?, 367?, 369? Total Colons: 5 -..code\modules\power\antimatter\control.dm Lines: 267? Total Colons: 1 -..code\modules\power\antimatter\shielding.dm Lines: 119 Total Colons: 1 -..code\modules\power\singularity\collector.dm Lines: 44?, 45?, 46?, 98? Total Colons: 6 -..code\modules\power\singularity\emitter.dm Lines: 252? Total Colons: 1 -..code\modules\power\singularity\singularity.dm Lines: 117?, 236? Total Colons: 2 -..code\modules\power\singularity\particle_accelerator\particle.dm Lines: 42 Total Colons: 1 -..code\modules\power\singularity\particle_accelerator\particle_accelerator.dm Lines: 364 Total Colons: 1 -..code\modules\power\singularity\particle_accelerator\particle_control.dm Lines: 215?, 216?, 217? Total Colons: 6 -..code\modules\procedural mapping\mapGenerator.dm Lines: 153? Total Colons: 1 -..code\modules\projectiles\ammunition.dm Lines: 29?, 30?, 155? Total Colons: 3 -..code\modules\projectiles\gun.dm Lines: 108?, 110?, 310? Total Colons: 3 -..code\modules\projectiles\ammunition\magazines.dm Lines: 173? Total Colons: 1 -..code\modules\projectiles\guns\magic\wand.dm Lines: 25? Total Colons: 1 -..code\modules\projectiles\guns\projectile\automatic.dm Lines: 28?, 109?, 127?, 160?, 165?, 250? Total Colons: 11 -..code\modules\projectiles\guns\projectile\launchers.dm Lines: 49? Total Colons: 1 -..code\modules\projectiles\guns\projectile\pistol.dm Lines: 15?, 36? Total Colons: 3 -..code\modules\projectiles\guns\projectile\shotgun.dm Lines: 30?, 63?, 114?, 282? Total Colons: 4 -..code\modules\projectiles\guns\projectile\toy.dm Lines: 33? Total Colons: 1 -..code\modules\reagents\Chemistry-Machinery.dm Lines: 85?, 89, 90, 97, 330?, 350?, 367?, 368?, 512?, 551?, 665?, 705?, 708?, 788, 867?, 910?, 1248?, 1286?, 1508?, 1510?, 1511?, 1512? Total Colons: 24 -..code\modules\reagents\Chemistry-Recipes.dm Lines: 46? Total Colons: 1 -..code\modules\reagents\reagent_containers.dm Lines: 64? Total Colons: 1 -..code\modules\reagents\Chemistry-Reagents\Consumable-Reagents\Food-Reagents.dm Lines: 331 Total Colons: 2 -..code\modules\reagents\reagent_containers\spray.dm Lines: 97?, 98?, 99?, 177? Total Colons: 4 -..code\modules\recycling\disposal-construction.dm Lines: 86?, 91? Total Colons: 2 -..code\modules\recycling\disposal-structures.dm Lines: 240? Total Colons: 1 -..code\modules\recycling\disposal-unit.dm Lines: 82? Total Colons: 1 -..code\modules\recycling\sortingmachinery.dm Lines: 217? Total Colons: 1 -..code\modules\research\experimentor.dm Lines: 253? Total Colons: 1 -..code\modules\research\message_server.dm Lines: 130? Total Colons: 2 -..code\modules\shuttle\shuttle.dm Lines: 266?, 270?, 515?, 522?, 547?, 564? Total Colons: 8 -..code\modules\surgery\organs\augments_internal.dm Lines: 33?, 76?, 77?, 94? Total Colons: 4 -..code\modules\telesci\telesci_computer.dm Lines: 46?, 122?, 269? Total Colons: 4 -..code\modules\tooltip\tooltip.dm Lines: 90? Total Colons: 1 -..code\modules\vehicles\VehicleBase.dm Lines: 101?, 103?, 105?, 107? Total Colons: 4 -..code\modules\vehicles\VehicleClickInteractions.dm Lines: 128?, 157?, 186?, 214?, 252?, 254?, 257?, 259?, 262?, 264?, 267?, 269?, 272?, 274? Total Colons: 14 -..code\modules\vehicles\VehicleDefense.dm Lines: 31? Total Colons: 1 -..code\orphaned procs\dbcore.dm Lines: 79? Total Colons: 5 -..code\orphaned procs\statistics.dm Lines: 63, 64, 98, 99 Total Colons: 4 -..code\_onclick\other_mobs.dm Lines: 89 Total Colons: 1 -..code\_onclick\hud\action.dm Lines: 184? Total Colons: 1 -..code\_onclick\hud\alien.dm Lines: 90? Total Colons: 1 -..code\_onclick\hud\alien_larva.dm Lines: 16? Total Colons: 1 -..code\_onclick\hud\human.dm Lines: 59? Total Colons: 1 -..code\_onclick\hud\monkey.dm Lines: 17? Total Colons: 1 -..code\__DATASTRUCTURES\priority_queue.dm Lines: 33? Total Colons: 1 -..code\__DATASTRUCTURES\stacks.dm Lines: 29? Total Colons: 1 -..code\__HELPERS\game.dm Lines: 216? Total Colons: 1 -..code\__HELPERS\icons.dm Lines: 216?, 233?, 386?, 389?, 392?, 425?, 439?, 456?, 526?, 557?, 559?, 601?, 607?, 635?, 636?, 637?, 638?, 715, 752, 757, 762, 763, 764, 765, 774, 786, 787, 809?, 828?, 839? Total Colons: 38 -..code\__HELPERS\icon_smoothing.dm Lines: 176?, 178? Total Colons: 2 -..code\__HELPERS\lists.dm Lines: 201?, 206?, 214? Total Colons: 3 -..code\__HELPERS\maths.dm Lines: 13?, 18?, 35?, 39? Total Colons: 4 -..code\__HELPERS\mobs.dm Lines: 137?, 139?, 140? Total Colons: 11 -..code\__HELPERS\names.dm Lines: 63?, 174? Total Colons: 3 -..code\__HELPERS\sanitize_values.dm Lines: 34? Total Colons: 1 -..code\__HELPERS\text.dm Lines: 157?, 350? Total Colons: 2 -..code\__HELPERS\type2type.dm Lines: 68?, 143?, 381? Total Colons: 5 -..code\__HELPERS\unsorted.dm Lines: 41?, 573, 904, 991? Total Colons: 4 -..code\__HELPERS\sorts\__main.dm Lines: 2?, 57?, 391, 491, 585? Total Colons: 5 -433/1564 files have colons in them \ No newline at end of file From c2d335b7da7bdc1a956b124174ec800f8cac81bb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 17:50:28 -0500 Subject: [PATCH 129/164] [s] Fixes MG turret firing while the user is stunned/cuffed/unconscious --- code/game/objects/structures/manned_turret.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index 323927af77..7448aa128f 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -85,7 +85,7 @@ calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(controller, C.mouseParams) /obj/machinery/manned_turret/proc/direction_track(mob/user, atom/targeted) - if(user.stat != CONSCIOUS) + if(user.incapacitated()) return setDir(get_dir(src,targeted)) user.setDir(dir) @@ -125,7 +125,7 @@ /obj/machinery/manned_turret/proc/checkfire(atom/targeted_atom, mob/user) target = targeted_atom - if(target == user || target == get_turf(src)) + if(target == user || user.incapacitated() || target == get_turf(src)) return if(world.time < cooldown) if(!warned && world.time > (cooldown - cooldown_duration + rate_of_fire*number_of_shots)) // To capture the window where one is done firing @@ -143,6 +143,8 @@ addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper, user), i*rate_of_fire) /obj/machinery/manned_turret/proc/fire_helper(mob/user) + if(user.incapacitated()) + return update_positioning() //REFRESH MOUSE TRACKING!! var/turf/targets_from = get_turf(src) if(QDELETED(target)) From afbe4be50c6fe7c6301f017a87944593ef8f0f30 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 17:51:33 -0500 Subject: [PATCH 130/164] Moves most of world.dm --- code/__DEFINES/server_tools.dm | 5 +- code/_compile_options.dm | 2 - code/game/world.dm | 292 +++++++++++++++++++++++++++++++ code/world.dm | 3 + code/world.dm.rej | 309 ++++++++++++++++++++++++++++++++- tgstation.dme | 1 + 6 files changed, 600 insertions(+), 12 deletions(-) create mode 100644 code/game/world.dm diff --git a/code/__DEFINES/server_tools.dm b/code/__DEFINES/server_tools.dm index 4624c5914f..a4afa58a87 100644 --- a/code/__DEFINES/server_tools.dm +++ b/code/__DEFINES/server_tools.dm @@ -4,6 +4,9 @@ #define IRC_STATUS_THROTTLE 5 +#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round + //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored + //keep these in sync with TGS3 #define SERVICE_WORLD_PARAM "server_service" #define SERVICE_PR_TEST_JSON "..\\..\\prtestjob.json" @@ -17,7 +20,7 @@ #define SERVICE_CMD_NAME_CHECK "namecheck" #define SERVICE_CMD_ADMIN_WHO "adminwho" -//#define SERVICE_CMD_PARAM_KEY //defined in __compile_options.dm +#define SERVICE_CMD_PARAM_KEY "serviceCommsKey" #define SERVICE_CMD_PARAM_COMMAND "command" #define SERVICE_CMD_PARAM_MESSAGE "message" #define SERVICE_CMD_PARAM_TARGET "target" diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 964c956eca..a669f1b4f5 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -69,8 +69,6 @@ #error You need version 511 or higher #endif - #define SERVICE_CMD_PARAM_KEY "serviceCommsKey" - //Update this whenever the db schema changes //make sure you add an update to the schema_version stable in the db changelog #define DB_MAJOR_VERSION 3 diff --git a/code/game/world.dm b/code/game/world.dm new file mode 100644 index 0000000000..f5b45a46ca --- /dev/null +++ b/code/game/world.dm @@ -0,0 +1,292 @@ +/world/New() + log_world("World loaded at [time_stamp()]") + + SetupExternalRSC() + + GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl + + make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) + + config = new + + CheckSchemaVersion() + SetRoundID() + + SetupLogs() + + if(!RunningService()) //tgs2 support + GLOB.revdata.DownloadPRDetails() + + load_motd() + load_admins() + LoadVerbs(/datum/verbs/menu) + if(config.usewhitelist) + load_whitelist() + LoadBans() + + GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 + + Master.Initialize(10, FALSE) + + if(config.irc_announce_new_game) + IRCBroadcast("New round starting on [SSmapping.config.map_name]!") + +/world/proc/SetupExternalRSC() +#if (PRELOAD_RSC == 0) + external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n") + var/i=1 + while(i<=external_rsc_urls.len) + if(external_rsc_urls[i]) + i++ + else + external_rsc_urls.Cut(i,i+1) +#endif + +/world/proc/CheckSchemaVersion() + if(config.sql_enabled) + if(SSdbcore.Connect()) + log_world("Database connection established.") + var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1") + query_db_version.Execute() + if(query_db_version.NextRow()) + var/db_major = text2num(query_db_version.item[1]) + var/db_minor = text2num(query_db_version.item[2]) + if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION) + message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") + log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") + else + message_admins("Could not get schema version from database") + else + log_world("Your server failed to establish a connection with the database.") + +/world/proc/SetRoundID() + if(config.sql_enabled) + if(SSdbcore.Connect()) + var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')") + query_round_start.Execute() + var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()") + query_round_last_id.Execute() + if(query_round_last_id.NextRow()) + GLOB.round_id = query_round_last_id.item[1] + +/world/proc/SetupLogs() + GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" + if(GLOB.round_id) + GLOB.log_directory += "[GLOB.round_id]" + else + GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]" + GLOB.world_game_log = file("[GLOB.log_directory]/game.log") + GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log") + GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log") + GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html") + WRITE_FILE(GLOB.world_game_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------") + WRITE_FILE(GLOB.world_attack_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------") + WRITE_FILE(GLOB.world_runtime_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------") + GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently + if(fexists(GLOB.config_error_log)) + fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") + fdel(GLOB.config_error_log) + + if(GLOB.round_id) + log_game("Round ID: [GLOB.round_id]") + +/world/Topic(T, addr, master, key) + var/list/input = params2list(T) + + var/pinging = ("ping" in input) + var/playing = ("players" in input) + + if(!pinging && !playing && config && config.log_world_topic) + WRITE_FILE(GLOB.world_game_log, "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]") + + if(input[SERVICE_CMD_PARAM_KEY]) + return ServiceCommand(input) + var/key_valid = (global.comms_allowed && input["key"] == global.comms_key) + + if(pinging) + var/x = 1 + for (var/client/C in GLOB.clients) + x++ + return x + + else if(playing) + var/n = 0 + for(var/mob/M in GLOB.player_list) + if(M.client) + n++ + return n + + else if("ircstatus" in input) //tgs2 support + var/static/last_irc_status = 0 + if(world.time - last_irc_status < 50) + return + var/list/adm = get_admin_counts() + var/list/allmins = adm["total"] + var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). " + status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode.name]." + send2irc("Status", status) + last_irc_status = world.time + + else if("status" in input) + var/list/s = list() + s["version"] = GLOB.game_version + s["mode"] = GLOB.master_mode + s["respawn"] = config ? GLOB.abandon_allowed : 0 + s["enter"] = GLOB.enter_allowed + s["vote"] = config.allow_vote_mode + s["ai"] = config.allow_ai + s["host"] = host ? host : null + s["active_players"] = get_active_player_count() + s["players"] = GLOB.clients.len + s["revision"] = GLOB.revdata.commit + s["revision_date"] = GLOB.revdata.date + + var/list/adm = get_admin_counts() + var/list/presentmins = adm["present"] + var/list/afkmins = adm["afk"] + s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho + s["gamestate"] = SSticker.current_state + + s["map_name"] = SSmapping.config.map_name + + if(key_valid && SSticker.HasRoundStarted()) + s["real_mode"] = SSticker.mode.name + // Key-authed callers may know the truth behind the "secret" + + s["security_level"] = get_security_level() + s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 + // Amount of world's ticks in seconds, useful for calculating round duration + + if(SSshuttle && SSshuttle.emergency) + s["shuttle_mode"] = SSshuttle.emergency.mode + // Shuttle status, see /__DEFINES/stat.dm + s["shuttle_timer"] = SSshuttle.emergency.timeLeft() + // Shuttle timer, in seconds + + return list2params(s) + + else if("announce" in input) + if(!key_valid) + return "Bad Key" + else + AnnouncePR(input["announce"], json_decode(input["payload"])) + + else if("crossmessage" in input) + if(!key_valid) + return + else + if(input["crossmessage"] == "Ahelp") + relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]") + if(input["crossmessage"] == "Comms_Console") + minor_announce(input["message"], "Incoming message from [input["message_sender"]]") + for(var/obj/machinery/computer/communications/CM in GLOB.machines) + CM.overrideCooldown() + if(input["crossmessage"] == "News_Report") + minor_announce(input["message"], "Breaking Update From [input["message_sender"]]") + + else if("adminmsg" in input) //tgs2 support + if(!key_valid) + return "Bad Key" + else + return IrcPm(input["adminmsg"],input["msg"],input["sender"]) + + else if("namecheck" in input) //tgs2 support + if(!key_valid) + return "Bad Key" + else + log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]") + message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]") + return keywords_lookup(input["namecheck"],1) + else if("adminwho" in input) //tgs2 support + if(!key_valid) + return "Bad Key" + else + return ircadminwho() + else if("server_hop" in input) + show_server_hop_transfer_screen(input["server_hop"]) + +/world/proc/AnnouncePR(announcement, list/payload) + var/static/list/PRcounts = list() //PR id -> number of times announced this round + var/id = "[payload["pull_request"]["id"]]" + if(!PRcounts[id]) + PRcounts[id] = 1 + else + ++PRcounts[id] + if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) + return + + var/final_composed = "PR: [announcement]" + for(var/client/C in GLOB.clients) + C.AnnouncePR(final_composed) + +/world/Reboot(reason = 0, fast_track = FALSE) + ServiceReboot() //handles alternative actions if necessary + if (reason || fast_track) //special reboot, do none of the normal stuff + if (usr) + log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools") + message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools") + to_chat(world, "Rebooting World immediately due to host request") + else + to_chat(world, "Rebooting world...") + Master.Shutdown() //run SS shutdowns + log_world("World rebooted at [time_stamp()]") + ..() + +/world/proc/load_motd() + GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo() + +/world/proc/update_status() + var/s = "" + + if (config && config.server_name) + s += "[config.server_name] — " + + s += "[station_name()]"; + s += " (" + s += "" //Change this to wherever you want the hub to link to. + s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version. + s += "" + s += ")" + + var/list/features = list() + + if(GLOB.master_mode) + features += GLOB.master_mode + + if (!GLOB.enter_allowed) + features += "closed" + + features += GLOB.abandon_allowed ? "respawn" : "no respawn" + + if (config && config.allow_vote_mode) + features += "vote" + + if (config && config.allow_ai) + features += "AI allowed" + + var/n = 0 + for (var/mob/M in GLOB.player_list) + if (M.client) + n++ + + if (n > 1) + features += "~[n] players" + else if (n > 0) + features += "~[n] player" + + if (!host && config && config.hostedby) + features += "hosted by [config.hostedby]" + + if (features) + s += ": [jointext(features, ", ")]" + + status = s + +/world/proc/update_hub_visibility(new_visibility) + if(new_visibility == GLOB.hub_visibility) + return + GLOB.hub_visibility = new_visibility + if(GLOB.hub_visibility) + hub_password = "kMZy3U5jJHSiBQjr" + else + hub_password = "SORRYNOPASSWORD" diff --git a/code/world.dm b/code/world.dm index a0c5ae43f8..7e17e579b1 100644 --- a/code/world.dm +++ b/code/world.dm @@ -1,3 +1,6 @@ +//This file is just for the necessary /world definition +//Try looking in game/world.dm + /world mob = /mob/dead/new_player turf = /turf/open/space/basic diff --git a/code/world.dm.rej b/code/world.dm.rej index cde7698a21..e82c17e503 100644 --- a/code/world.dm.rej +++ b/code/world.dm.rej @@ -1,10 +1,301 @@ diff a/code/world.dm b/code/world.dm (rejected hunks) -@@ -59,7 +59,7 @@ - if(config.sql_enabled) - if(SSdbcore.Connect()) - log_world("Database connection established.") -- var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_version")] ORDER BY date DESC LIMIT 1") -+ var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1") - query_db_version.Execute() - if(query_db_version.NextRow()) - var/db_major = query_db_version.item[1] +@@ -10,299 +13,3 @@ + #ifdef GC_FAILURE_HARD_LOOKUP + loop_checks = FALSE + #endif +- +-/world/New() +- log_world("World loaded at [time_stamp()]") +- +- SetupExternalRSC() +- +- GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl +- +- make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) +- +- config = new +- +- CheckSchemaVersion() +- SetRoundID() +- +- SetupLogs() +- +- if(!RunningService()) //tgs2 support +- GLOB.revdata.DownloadPRDetails() +- +- load_motd() +- load_admins() +- LoadVerbs(/datum/verbs/menu) +- if(config.usewhitelist) +- load_whitelist() +- LoadBans() +- +- GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 +- +- Master.Initialize(10, FALSE) +- +- if(config.irc_announce_new_game) +- IRCBroadcast("New round starting on [SSmapping.config.map_name]!") +- +-/world/proc/SetupExternalRSC() +-#if (PRELOAD_RSC == 0) +- external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n") +- var/i=1 +- while(i<=external_rsc_urls.len) +- if(external_rsc_urls[i]) +- i++ +- else +- external_rsc_urls.Cut(i,i+1) +-#endif +- +-/world/proc/CheckSchemaVersion() +- if(config.sql_enabled) +- if(SSdbcore.Connect()) +- log_world("Database connection established.") +- var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1") +- query_db_version.Execute() +- if(query_db_version.NextRow()) +- var/db_major = text2num(query_db_version.item[1]) +- var/db_minor = text2num(query_db_version.item[2]) +- if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION) +- message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") +- log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") +- else +- message_admins("Could not get schema version from database") +- else +- log_world("Your server failed to establish a connection with the database.") +- +-/world/proc/SetRoundID() +- if(config.sql_enabled) +- if(SSdbcore.Connect()) +- var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')") +- query_round_start.Execute() +- var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()") +- query_round_last_id.Execute() +- if(query_round_last_id.NextRow()) +- GLOB.round_id = query_round_last_id.item[1] +- +-/world/proc/SetupLogs() +- GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" +- if(GLOB.round_id) +- GLOB.log_directory += "[GLOB.round_id]" +- else +- GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]" +- GLOB.world_game_log = file("[GLOB.log_directory]/game.log") +- GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log") +- GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log") +- GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html") +- GLOB.world_game_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" +- GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" +- GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" +- GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently +- if(fexists(GLOB.config_error_log)) +- fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") +- fdel(GLOB.config_error_log) +- +- if(GLOB.round_id) +- log_game("Round ID: [GLOB.round_id]") +- +-/world/Topic(T, addr, master, key) +- var/list/input = params2list(T) +- +- var/pinging = ("ping" in input) +- var/playing = ("players" in input) +- +- if(!pinging && !playing && config && config.log_world_topic) +- GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]" +- +- if(input[SERVICE_CMD_PARAM_KEY]) +- return ServiceCommand(input) +- var/key_valid = (global.comms_allowed && input["key"] == global.comms_key) +- +- if(pinging) +- var/x = 1 +- for (var/client/C in GLOB.clients) +- x++ +- return x +- +- else if(playing) +- var/n = 0 +- for(var/mob/M in GLOB.player_list) +- if(M.client) +- n++ +- return n +- +- else if("ircstatus" in input) //tgs2 support +- var/static/last_irc_status = 0 +- if(world.time - last_irc_status < 50) +- return +- var/list/adm = get_admin_counts() +- var/list/allmins = adm["total"] +- var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). " +- status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode.name]." +- send2irc("Status", status) +- last_irc_status = world.time +- +- else if("status" in input) +- var/list/s = list() +- s["version"] = GLOB.game_version +- s["mode"] = GLOB.master_mode +- s["respawn"] = config ? GLOB.abandon_allowed : 0 +- s["enter"] = GLOB.enter_allowed +- s["vote"] = config.allow_vote_mode +- s["ai"] = config.allow_ai +- s["host"] = host ? host : null +- s["active_players"] = get_active_player_count() +- s["players"] = GLOB.clients.len +- s["revision"] = GLOB.revdata.commit +- s["revision_date"] = GLOB.revdata.date +- +- var/list/adm = get_admin_counts() +- var/list/presentmins = adm["present"] +- var/list/afkmins = adm["afk"] +- s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho +- s["gamestate"] = SSticker.current_state +- +- s["map_name"] = SSmapping.config.map_name +- +- if(key_valid && SSticker.HasRoundStarted()) +- s["real_mode"] = SSticker.mode.name +- // Key-authed callers may know the truth behind the "secret" +- +- s["security_level"] = get_security_level() +- s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 +- // Amount of world's ticks in seconds, useful for calculating round duration +- +- if(SSshuttle && SSshuttle.emergency) +- s["shuttle_mode"] = SSshuttle.emergency.mode +- // Shuttle status, see /__DEFINES/stat.dm +- s["shuttle_timer"] = SSshuttle.emergency.timeLeft() +- // Shuttle timer, in seconds +- +- return list2params(s) +- +- else if("announce" in input) +- if(!key_valid) +- return "Bad Key" +- else +- AnnouncePR(input["announce"], json_decode(input["payload"])) +- +- else if("crossmessage" in input) +- if(!key_valid) +- return +- else +- if(input["crossmessage"] == "Ahelp") +- relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]") +- if(input["crossmessage"] == "Comms_Console") +- minor_announce(input["message"], "Incoming message from [input["message_sender"]]") +- for(var/obj/machinery/computer/communications/CM in GLOB.machines) +- CM.overrideCooldown() +- if(input["crossmessage"] == "News_Report") +- minor_announce(input["message"], "Breaking Update From [input["message_sender"]]") +- +- else if("adminmsg" in input) //tgs2 support +- if(!key_valid) +- return "Bad Key" +- else +- return IrcPm(input["adminmsg"],input["msg"],input["sender"]) +- +- else if("namecheck" in input) //tgs2 support +- if(!key_valid) +- return "Bad Key" +- else +- log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]") +- message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]") +- return keywords_lookup(input["namecheck"],1) +- else if("adminwho" in input) //tgs2 support +- if(!key_valid) +- return "Bad Key" +- else +- return ircadminwho() +- else if("server_hop" in input) +- show_server_hop_transfer_screen(input["server_hop"]) +- +-#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round +- //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored +- +-/world/proc/AnnouncePR(announcement, list/payload) +- var/static/list/PRcounts = list() //PR id -> number of times announced this round +- var/id = "[payload["pull_request"]["id"]]" +- if(!PRcounts[id]) +- PRcounts[id] = 1 +- else +- ++PRcounts[id] +- if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) +- return +- +- var/final_composed = "PR: [announcement]" +- for(var/client/C in GLOB.clients) +- C.AnnouncePR(final_composed) +- +-/world/Reboot(reason = 0, fast_track = FALSE) +- ServiceReboot() //handles alternative actions if necessary +- if (reason || fast_track) //special reboot, do none of the normal stuff +- if (usr) +- log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools") +- message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools") +- to_chat(world, "Rebooting World immediately due to host request") +- else +- to_chat(world, "Rebooting world...") +- Master.Shutdown() //run SS shutdowns +- log_world("World rebooted at [time_stamp()]") +- ..() +- +-/world/proc/load_motd() +- GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo() +- +-/world/proc/update_status() +- var/s = "" +- +- if (config && config.server_name) +- s += "[config.server_name] — " +- +- s += "[station_name()]"; +- s += " (" +- s += "" //Change this to wherever you want the hub to link to. +- s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version. +- s += "" +- s += ")" +- +- var/list/features = list() +- +- if(GLOB.master_mode) +- features += GLOB.master_mode +- +- if (!GLOB.enter_allowed) +- features += "closed" +- +- features += GLOB.abandon_allowed ? "respawn" : "no respawn" +- +- if (config && config.allow_vote_mode) +- features += "vote" +- +- if (config && config.allow_ai) +- features += "AI allowed" +- +- var/n = 0 +- for (var/mob/M in GLOB.player_list) +- if (M.client) +- n++ +- +- if (n > 1) +- features += "~[n] players" +- else if (n > 0) +- features += "~[n] player" +- +- if (!host && config && config.hostedby) +- features += "hosted by [config.hostedby]" +- +- if (features) +- s += ": [jointext(features, ", ")]" +- +- status = s +- +-/world/proc/update_hub_visibility(new_visibility) +- if(new_visibility == GLOB.hub_visibility) +- return +- GLOB.hub_visibility = new_visibility +- if(GLOB.hub_visibility) +- hub_password = "kMZy3U5jJHSiBQjr" +- else +- hub_password = "SORRYNOPASSWORD" diff --git a/tgstation.dme b/tgstation.dme index 23ffe1fef1..1475d2335c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -375,6 +375,7 @@ #include "code\game\shuttle_engines.dm" #include "code\game\skincmd.dm" #include "code\game\sound.dm" +#include "code\game\world.dm" #include "code\game\area\ai_monitored.dm" #include "code\game\area\areas.dm" #include "code\game\area\Space_Station_13_areas.dm" From e5b7eefffe4f785ccb12ec96fe34325f0de0d008 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 17:53:39 -0500 Subject: [PATCH 131/164] Nerfs L6 SAW Hollow Point Bullets from -10 armour penetration to -60 armour penetration. --- code/modules/projectiles/projectile/bullets.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 54e0ed7e12..f7aedb00fc 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -356,7 +356,7 @@ /obj/item/projectile/bullet/saw/hollow damage = 60 - armour_penetration = -10 + armour_penetration = -60 /obj/item/projectile/bullet/saw/ap damage = 40 From 9176bbc1298791095a68fe26f324df3ba626bfd2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 17:59:48 -0500 Subject: [PATCH 132/164] Removes meth explosion syringes --- code/modules/reagents/chemistry/recipes/pyrotechnics.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index dc361467a7..dcafef247b 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -140,7 +140,7 @@ name = "Meth explosion" id = "methboom1" results = list("methboom1" = 1) - required_temp = 380 //slightly above the meth mix time. + required_temp = 420 //high enough to not blow up in the meth syringes required_reagents = list("methamphetamine" = 1) strengthdiv = 6 modifier = 1 @@ -154,7 +154,7 @@ /datum/chemical_reaction/reagent_explosion/methsplosion/methboom2 required_reagents = list("diethylamine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) //diethylamine is often left over from mixing the ephedrine. - required_temp = 300 //room temperature, chilling it even a little will prevent the explosion + required_temp = 420 results = list("methboom1" = 4) // this is ugly. Sorry goof. /datum/chemical_reaction/sorium From 4bd5e318c2d87a608c544ba154255c031443f1a4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 18:00:54 -0500 Subject: [PATCH 133/164] Blobs can now sense loving cuddles! --- code/game/gamemodes/blob/theblob.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 9bce7319f8..f6cdd64bb6 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -24,6 +24,7 @@ M.changeNext_move(CLICK_CD_MELEE) var/a = pick("gently stroke", "nuzzle", "affectionatly pet", "cuddle") M.visible_message("[M] [a]s [src]!", "You [a] [src]!") + to_chat(overmind, "[M] [a]s you!") playsound(src, 'sound/effects/blobattack.ogg', 50, 1) //SQUISH SQUISH From 27d466bda4e9bec2bb8a2b3baecedcf653afe32f Mon Sep 17 00:00:00 2001 From: Haresay <15344918+sirelgate@users.noreply.github.com> Date: Wed, 16 Aug 2017 17:25:55 -0600 Subject: [PATCH 134/164] handsidefix --- icons/mob/human_parts_greyscale.dmi | Bin 44523 -> 44541 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index 225a61e143b85612f8f56d55d20e3067344ce213..a06f490fa754582313a8aa464ebfae100989215d 100644 GIT binary patch delta 2165 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 Date: Wed, 16 Aug 2017 19:40:40 -0500 Subject: [PATCH 135/164] Update world.dm --- code/world.dm | 296 +------------------------------------------------- 1 file changed, 1 insertion(+), 295 deletions(-) diff --git a/code/world.dm b/code/world.dm index 7e17e579b1..955d19c6c4 100644 --- a/code/world.dm +++ b/code/world.dm @@ -1,3 +1,4 @@ + //This file is just for the necessary /world definition //Try looking in game/world.dm @@ -13,298 +14,3 @@ #ifdef GC_FAILURE_HARD_LOOKUP loop_checks = FALSE #endif - -/world/New() - log_world("World loaded at [time_stamp()]") - - SetupExternalRSC() - - GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl - - make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) - - config = new - - CheckSchemaVersion() - SetRoundID() - - SetupLogs() - - if(!RunningService()) //tgs2 support - GLOB.revdata.DownloadPRDetails() - - load_motd() - load_admins() - LoadVerbs(/datum/verbs/menu) - if(config.usewhitelist) - load_whitelist() - LoadBans() - - GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 - - Master.Initialize(10, FALSE) - - if(config.irc_announce_new_game) - IRCBroadcast("New round starting on [SSmapping.config.map_name]!") - -/world/proc/SetupExternalRSC() -#if (PRELOAD_RSC == 0) - external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n") - var/i=1 - while(i<=external_rsc_urls.len) - if(external_rsc_urls[i]) - i++ - else - external_rsc_urls.Cut(i,i+1) -#endif - -/world/proc/CheckSchemaVersion() - if(config.sql_enabled) - if(SSdbcore.Connect()) - var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1") - query_db_version.Execute() - if(query_db_version.NextRow()) - var/db_major = text2num(query_db_version.item[1]) - var/db_minor = text2num(query_db_version.item[2]) - if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION) - message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") - log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") - else - message_admins("Could not get schema version from database") - else - log_world("Your server failed to establish a connection with the database.") - -/world/proc/SetRoundID() - if(config.sql_enabled) - if(SSdbcore.Connect()) - var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')") - query_round_start.Execute() - var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()") - query_round_last_id.Execute() - if(query_round_last_id.NextRow()) - GLOB.round_id = query_round_last_id.item[1] - -/world/proc/SetupLogs() - GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" - if(GLOB.round_id) - GLOB.log_directory += "[GLOB.round_id]" - else - GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]" - GLOB.world_game_log = file("[GLOB.log_directory]/game.log") - GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log") - GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log") - GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html") - GLOB.world_game_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" - GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" - GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" - GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently - if(fexists(GLOB.config_error_log)) - fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") - fdel(GLOB.config_error_log) - - if(GLOB.round_id) - log_game("Round ID: [GLOB.round_id]") - -/world/Topic(T, addr, master, key) - var/list/input = params2list(T) - - var/pinging = ("ping" in input) - var/playing = ("players" in input) - - if(!pinging && !playing && config && config.log_world_topic) - GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]" - - if(input[SERVICE_CMD_PARAM_KEY]) - return ServiceCommand(input) - var/key_valid = (global.comms_allowed && input["key"] == global.comms_key) - - if(pinging) - var/x = 1 - for (var/client/C in GLOB.clients) - x++ - return x - - else if(playing) - var/n = 0 - for(var/mob/M in GLOB.player_list) - if(M.client) - n++ - return n - - else if("ircstatus" in input) //tgs2 support - var/static/last_irc_status = 0 - if(world.time - last_irc_status < 50) - return - var/list/adm = get_admin_counts() - var/list/allmins = adm["total"] - var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). " - status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode.name]." - send2irc("Status", status) - last_irc_status = world.time - - else if("status" in input) - var/list/s = list() - s["version"] = GLOB.game_version - s["mode"] = GLOB.master_mode - s["respawn"] = config ? GLOB.abandon_allowed : 0 - s["enter"] = GLOB.enter_allowed - s["vote"] = config.allow_vote_mode - s["ai"] = config.allow_ai - s["host"] = host ? host : null - s["active_players"] = get_active_player_count() - s["players"] = GLOB.clients.len - s["revision"] = GLOB.revdata.commit - s["revision_date"] = GLOB.revdata.date - - var/list/adm = get_admin_counts() - var/list/presentmins = adm["present"] - var/list/afkmins = adm["afk"] - s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho - s["gamestate"] = SSticker.current_state - - s["map_name"] = SSmapping.config.map_name - - if(key_valid && SSticker.HasRoundStarted()) - s["real_mode"] = SSticker.mode.name - // Key-authed callers may know the truth behind the "secret" - - s["security_level"] = get_security_level() - s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 - // Amount of world's ticks in seconds, useful for calculating round duration - - if(SSshuttle && SSshuttle.emergency) - s["shuttle_mode"] = SSshuttle.emergency.mode - // Shuttle status, see /__DEFINES/stat.dm - s["shuttle_timer"] = SSshuttle.emergency.timeLeft() - // Shuttle timer, in seconds - - return list2params(s) - - else if("announce" in input) - if(!key_valid) - return "Bad Key" - else - AnnouncePR(input["announce"], json_decode(input["payload"])) - - else if("crossmessage" in input) - if(!key_valid) - return - else - if(input["crossmessage"] == "Ahelp") - relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]") - if(input["crossmessage"] == "Comms_Console") - minor_announce(input["message"], "Incoming message from [input["message_sender"]]") - for(var/obj/machinery/computer/communications/CM in GLOB.machines) - CM.overrideCooldown() - if(input["crossmessage"] == "News_Report") - minor_announce(input["message"], "Breaking Update From [input["message_sender"]]") - - else if("adminmsg" in input) //tgs2 support - if(!key_valid) - return "Bad Key" - else - return IrcPm(input["adminmsg"],input["msg"],input["sender"]) - - else if("namecheck" in input) //tgs2 support - if(!key_valid) - return "Bad Key" - else - log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]") - message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]") - return keywords_lookup(input["namecheck"],1) - else if("adminwho" in input) //tgs2 support - if(!key_valid) - return "Bad Key" - else - return ircadminwho() - else if("server_hop" in input) - show_server_hop_transfer_screen(input["server_hop"]) - -#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round - //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored - -/world/proc/AnnouncePR(announcement, list/payload) - var/static/list/PRcounts = list() //PR id -> number of times announced this round - var/id = "[payload["pull_request"]["id"]]" - if(!PRcounts[id]) - PRcounts[id] = 1 - else - ++PRcounts[id] - if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) - return - - var/final_composed = "PR: [announcement]" - for(var/client/C in GLOB.clients) - C.AnnouncePR(final_composed) - -/world/Reboot(reason = 0, fast_track = FALSE) - ServiceReboot() //handles alternative actions if necessary - if (reason || fast_track) //special reboot, do none of the normal stuff - if (usr) - log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools") - message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools") - to_chat(world, "Rebooting World immediately due to host request") - else - to_chat(world, "Rebooting world...") - Master.Shutdown() //run SS shutdowns - log_world("World rebooted at [time_stamp()]") - ..() - -/world/proc/load_motd() - GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo() - -/world/proc/update_status() - var/s = "" - - if (config && config.server_name) - s += "[config.server_name] — " - - s += "[station_name()]"; - s += " (" - s += "" //Change this to wherever you want the hub to link to. - s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version. - s += "" - s += ")" - - var/list/features = list() - - if(GLOB.master_mode) - features += GLOB.master_mode - - if (!GLOB.enter_allowed) - features += "closed" - - features += GLOB.abandon_allowed ? "respawn" : "no respawn" - - if (config && config.allow_vote_mode) - features += "vote" - - if (config && config.allow_ai) - features += "AI allowed" - - var/n = 0 - for (var/mob/M in GLOB.player_list) - if (M.client) - n++ - - if (n > 1) - features += "~[n] players" - else if (n > 0) - features += "~[n] player" - - if (!host && config && config.hostedby) - features += "hosted by [config.hostedby]" - - if (features) - s += ": [jointext(features, ", ")]" - - status = s - -/world/proc/update_hub_visibility(new_visibility) - if(new_visibility == GLOB.hub_visibility) - return - GLOB.hub_visibility = new_visibility - if(GLOB.hub_visibility) - hub_password = "kMZy3U5jJHSiBQjr" - else - hub_password = "SORRYNOPASSWORD" From 68830dac71c32afbe5ece2ff0d8ff04b3cb33ace Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 20:02:24 -0500 Subject: [PATCH 136/164] Changes smes, cells, cell charger, terminals and apcs icons --- code/game/machinery/cell_charger.dm | 23 ++++++++++------------- code/modules/power/apc.dm | 4 ++-- icons/obj/power.dmi | Bin 36328 -> 36770 bytes 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 1e72707e86..2fe15a99d8 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -2,7 +2,7 @@ name = "cell charger" desc = "It charges power cells." icon = 'icons/obj/power.dmi' - icon_state = "ccharger0" + icon_state = "ccharger" anchored = TRUE use_power = IDLE_POWER_USE idle_power_usage = 5 @@ -12,19 +12,16 @@ var/chargelevel = -1 /obj/machinery/cell_charger/proc/updateicon() - icon_state = "ccharger[charging ? 1 : 0]" + cut_overlays() - if(charging && !(stat & (BROKEN|NOPOWER))) - var/newlevel = round(charging.percent() * 4 / 100) - - if(chargelevel != newlevel) - chargelevel = newlevel - - cut_overlays() - add_overlay("ccharger-o[newlevel]") - - else - cut_overlays() + if(charging) + add_overlay(image(charging.icon, charging.icon_state)) + add_overlay("ccharger-on") + if(!(stat & (BROKEN|NOPOWER))) + var/newlevel = round(charging.percent() * 4 / 100) + if(chargelevel != newlevel) + chargelevel = newlevel + add_overlay("ccharger-o[newlevel]") /obj/machinery/cell_charger/examine(mob/user) ..() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 6b5203ce84..d01516e312 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -120,8 +120,8 @@ if(auto_name) name = "\improper [get_area(src)] APC" - pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -25) - pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 23 : -24) : 0 + pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 26 : -27) + pixel_y = (src.tdir & 3)? (src.tdir == 1 ? 25 : -25) : 0 if (building) area = get_area(src) opened = 1 diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 6b2ae5535153f3404d30a653b05a81f6027872f7..e1604715ac5f9cbbe4a7f99346ce50df630942af 100644 GIT binary patch literal 36770 zcmb@u1yoeu*FSuR9HgbYR76@p8io)ML`u3ry1SX7kwyhk8bPFy?vzlFE&*vJ1|)}O zcrX5b-zVPZ`LFeV*LoLgX70V`p19}kv-f9z_CCB+f2K%yi}n@(0EADJ1>}Db6JO#X$|N&vc&2;IF5hZFHn0xQ)fXn^vLNpRZnT%XB*CYF+WtE8w#MMdzA@R zL)L2C62cAQ&LQTKzqw#(5ua|w7R7taj~nv2zgm0sa_)M>i*beb&c{|Sq^-TdJY)W^ z*4G`O;8~{I5V4k?dKWb8!F$`M!VqjB!O=9LH|mYLVXt!#-&$$;f-8UGuy>wzdeiZt zM`p3^nb|tY3h>oD%HBAN+A1)idJ+-+(j~N?7a3yK9_zVj@J3#EOh7!y&Zc}4}XbvKmB9d zJvcQI8CyYX@;cI;C-&W;R3(MDYw}afr_GTUFx|0!mhtLksTWiJT~?{yUEDH%a8`;p zggZoNjTb`a8Tzl}>%-f)|H!x=dgA#{G>+g>)Ti-2n;%!)iqn1;G^DIpt&I$>d{V#W z9-3IhZ@l^R!x2$WkDyWLX{;CCM%WX`NjQ1R0=?M4(NWq45s6lJ5HQr8=4qmvFddxs zrF|@0aQ6snIC{EllO_5Bhq{nWDG|^ZdhBPR=+h&qMN)%j8UWUt+yvdOihy$&eAIPkLV*F&hS5% zNiX|GP+}ym&NA(tAc=3XKjd(Y6K6_MlZG)aY(Y_zaS!$^B*aCC;z;KQkBs&uyKXc) z{hI*OP_*(4(;IhFcmMg~oK^sZr=I=y3k&r`JsbRjnG!X;ARa#1MsI#T#m8KMb6b(f zngakc@I+qbxo^gHW{@xW&3RWy5+>}X z3Q;&caMOeZsAdOvlf1}6z^4p{ zxG&IpMJft#b92jNDP>CqSsZtJR0S`#1)cHI(vH-BVB4Utb3DUfUo?pRzaTO}1bKheL_U0z86*~EKkrJKhP5#8)IQq}~ZRKHpw@aOz| z+~Ziv#|9LebY>k0NYgh4slb`rSF!CE&w`>X0-Q8oq0Y(BB)&Vs;WMYM+eaZe-qk1k zqs05O53iQPUJM&tI3yafChoR5^jIk=q^!{(wjOoST3FeVX}6bkARpZ4)2${1E;#^! zIVSB}X1gT;{GR9P)k8ge73FiWo8#N#i>(2|4fb zjEkt18X+O}>QxM;!5Zq7&fY+erzBS8zc4YhE zka*MY&;)S)Umdap*&r(dSbdM$X~+Lm-n-N4x*XPYM8(^dZ4F6#s+)o95`hk{P+8&^ z#a;5oq#NcQ*Pc?kuw!8cS0O8xn#4ZV^;Uz|-WlScdprkqo*@3G@(Uon|AnlHfNv8y z&Hi_(k32RBgO6B-Oc$VL|9IRvk`u;c1sAyIGG{pT!j!-29ismqRKq__JZUIE1b7$~ z;le_u4U18;3j%k*zM@Z~SpPq3n}3@8uL_IwE~rp+-RNCT{6tb(Vny4wcs;LnELL<9 z+P4^+(B7Sr)hX-0=gCGEF6~uIj&|7;JH*nKc{8Y5D%{^)pTA}^ zqZ!=uxm2}c3J+R?>P6X}UQ=8`Tmj-FHnTU;nt-lpQ0>;S@M54q@$1b8=Tb~d{QBcN zVI<2Vxh~jT6NI0ln(?oQU?PgliL0mOD|fy;yd0MOiSTb|cFnpzk8;C0;Q9UEuBZR% z=oZBwt9K97b-QgrgSN?a28x%RQ!&@OL@?$B49~zu%E-__-K^Z24mi~U zK0CujR)_0!pRi)3yb^>6oaS{3p3T3RvsgC!@_OH9?gy-)%MYRmKt(ViVRnBSIqG}5 zI-}XaDgx{|t1ka4v5>SJlob9|rzb+a|Kjq8w;S_(JNlj&2CRdI1bJ5G$AmE6gbKt- z!$<*@qq3)vjZtAT$zG;cR}r9y$Y$O9^hN~7pU}ENDMV|G)IU!8!xFruyvvW?wDD=y zJ+mPMX&4QU=F%I_aK_bPvuCg|uLD7d2TmOIpldQlVLsatH9T?y%g8^IOSOaFrUTJQ zK*h1~U=tbx=;gS0-Rej%hMqH$x}j4ofo0?rAA1<+#$T#{z_ z^@Dj(dxd!=u{=%@2qL)qdt7^sL@WXICU^Dy(D$UmuM#$HJp)JslZ^q;e6MN#exW1Ti*CTn9+Bh4&~ux+)2r)H>t~HaETyWy4sBelRD%6UW!lK;{g&>eaXPvY2>8w%pbpvmwD35$lJb8hae3 zwb3oXB5br3u`AE@M^x&o%5JW~Ne|AK<7``aVzf|HhXI>9b=smG@xM^rG^4)8Zr6F$CWKO)swa>(HAkK?z3>686xY@+_r6p7kQC4q_DZh(GOiYLE zocrj##+X5WAuDJ)VsmWwG|QZ*l^w}jnciDyH8X=& zP6_h2xkWNtX%}b^8NX9uMA@RY`xGLZ?iz-g39jXb{4EWqD`k&do$STh$l!qW^KS!3 zzZ*1(5f~Nq&ylrfg-^ba*$cO^bTf%hI0wo_N_&6$_3P_iA5m?K1P!`hsUaOgdMwww zVA4M`hffm_z+&mb=qYaYFI@M(Y1;ogX!vDM8F7OmW$s9k|6jw%|3i1A*nWid`+nN5 zeVd27@2>%AFy8V^(@yRu4aDswN$=l(%NFyBDQ{PG?F-nSe?{SW<&-x)K;I7Pe(>U& z(0p(AG;}SWZ8QUL2lDc%riXZYR~rTbDhB>|xUm)$6shSP1J9`^AbWB5q!6d+wNHCKsE+3fL)$+kQ;NWaRoHXJka7XF;$%%#oh&;R%l z$M||`N~a0UA1c1U3F`INbDQUV(I&jOC*E^#RUAGYa3qwTR}KQ%dB|)8wL6fuY#P@W zcFeu@XAR#XlGn@vdo^*nE?VO3}!1AYXwlL7y~ zS1WBuS*3E94L4(NvKF zoF=sDZ`Ksc`>=X%-z#%2%qY?DxT(z~D4?bSg2@52MyAui?fg<1`Nj-Q;`%-(HET`c z@%@Lw7f9QGn`*NOVQaO5lgs?ql7E>36=LcwZt2g|^9=afnZW;ISz2Z|sojOxobND< zQe*%e29iH#L+y2w$U2ff5*;0<2F3S>HIbR!VMxCJ43M+WDD%(EHhua2y)0m^2@H<# ze93GI7`Kk>)mN4wl%(DEEy(~%#=(N)ojF|}m)XG)5fzS4xr$*7E-7SYUbHa58XvBS zpXrYT1bIG^PmJVtCe(k!s}v*bAlQ+82LGQGm|yYL8+?Ji7aK8-YHukHdHZKvSyAbm z-Y=}Q6r81o2U61Qw}sY$vqe}S4l}jA&)p>rKOB++5!glAdn4agm0B&}#za)U37wK^ z?PIsN1DhSF!%x*5nJqjym5;+x3i#p8@{wHdznGK%ytjjE^_~Jw4ud3A?A{@VpP)=U z$@*QM-c??*-DIGmzN5!2qNT>hWOeZ^I4892%aJSkWi8tc?`7jHu~vy~<$*VnhOLsD zpb4?Tt`8T!$S8Fzsj?}lXJ-J-&y8gNzb?6|==SCcmLR=hp%pA&zp+mg z<~YdDSN48q>R|`ap!;&`gO%73t8xS_Die3z*g758Lsx(Itw~|LCqkI~W0iiMMiRic z)tmPTY0xvd-m7#EFGtySdN>Kwx#*d!momxX;JPfVe;t<%|M0EJZ>(6#vZbW3FTDRU z8%-Jm1Fx6Wp8msHjD7z@_Lsk4J^mkj#s9(3EW-qMag<1~a(lkMX1DU_Z1&lGcG!W( z+Nq?6yHq#lyoyBjoi3ieK+^SLB$V8~2426)>g$cC+aykMCE(!Tn5lE319I~7u_h-c zA7zuukSIJ6`CIWdN@B)|Sd>S%Avv}u0T8$x3*g7>2*)Gy1=gT9R0^I&j(g%2wP`>F^O4I2Ha#rc~Ax+6CWJM8&JX*M` zPOQF9Q&rZr&BCkXsQ}4P{eye!;^tjgS&y?Pj(b+j`1y-N7{vW7qLB_qOX&p8%UNGw32L8*pd~@~KzV}cOzF5|Ktt8;4HFe(01fA4{sn z0Tk@xBH9y*Z~?i<*EDen3F%46$t)$jI?rzEPBcnFR(D^zup?;T`xnbZ1h-X{{iUqe z`N1bPp`|cuf9u;~jU_Xq0#0i27ZD8ROb7`t2OzX+YATJ>$XGu^CWIj#DN6F$6GLxn zMcA-9oG=SP#+;!WC<@8j$9=JGuzt+U>A(p%l)rQT{c_?|8a1I+9uqSRq^;*$TU#G| z{rWY~-Tfgk@IfKI>yyTZO20$v${j~08IpZ9sx)k7YBTG~(gYy7HyfqQLak``f_2Ik zb?JfZgGy>7^1)uMx}UjLvx$_)ysb^|KQ7eAY4XD~a z`#05cKu+&5{k@kF4g{P)?9zNNGGB zC%@g;A&&I5S=v4?C+D~}`iD*SV>dT`Q3w|4y6s0m@4oSFH3`P|{r0!**29j1^;Qj> z+(Ky4Bm(r|y8q5oNcgui%p@Au){?vatt!SsLXBN?Pi7=R2`7x5+ys6>h|u;{%8S0kBC;8FR?7YA?@o3f4TYKr+KR>d^ecH%oI%zxttq_7l$ZC0b9Y{@v#15}?XoK@IN13ofv zvctsgF^@bt9fy4Oz<42fO^eECPw6!+DWlizS@)k;0%dbUKqHoXBlq)XjpN|i8arD@ z$1inGb1#VN=i+U$gC4QQ%d=Go7y4h-){)7#u*L$>TICWE2R1kt-6;|(RDBwZ>=&== zI?Q4?fG6Nspa@O;N*hX8e^$Hro*y*Z_=TkOC|=S^sv<`Ix|zcr*efEw3;H*ojxQ-h z;U)3X0>3rcw=+DX&Xg8D--H+ef;Fb-?D(AtF6r)@5g-m)-^LMV)XfDtqL1ND8^>e@^aWbF&5(y zKJzslJoAt8sl)%Lal?`Pmr ztb1X$1ZsEV8_Dk;BHF9}850s>F=Kl7Rly@Aex2TIRTO4;2E0#InihR2N8@GZEPY#c zvMlPZN-6+Ml^fG(OInYnubw`tcuOETdY42C5E6>0a;=-J_>Mre6>Q=-^Z}C0Fpz-&_tVi0?&6o4M{h)vnAs9*}iBMTqS%j;?%4IN&5w!)7A zBQeGXU1P$go^t*0bPS5GOa-3rwCs3j&Bh@SPy~e}%seKS=_SjXNO&3b4!6*!(jD1d zU4FtbV>^RkQ^HBnU7-U9K+gsmLZU&EXqfep?<+}+IlOM>&7E^HhgD*%Sz}OJK6x_y z;lt|3Pg2*f+0_oTK0Y0tZwHl~k>9VB`<$HJpziBB-cV6i{!*oD;%C)gMMFaa71FM3 zZOzQ)x5NQhFeEH%IZhsS;O=8SB!{Cd%c=x zh|#m5(Mydg^~wg4q*C4Ym?$peBPc1*NgZv68>=CJmN~qnp`?W~ClMtTNRuP6Di7nV z#9$6R9q-?7j6r0~;qdp58;`>ndb3#w&P(J$wDQl-=H}v(5;=S|`ONaCt9OqD;2*#e&!T5u3gJt^Gci(t4HBlZr<_6KUYBvDlkdUtir_5doUr zEYQ**6(=#&wi)k@T$kXIXew@NxV@yMCYjP;>NthGz_E?gzJjBmu<|}`eC+gytgLpC z`@FrPrYyIUI8CvKdzFB3O=Et((2x*+om0$GAv8f?i`Ebr(C92_E_ z?`~0Xt`7Txwm5vDwRx=lqqJ)eh4hwlqW<&e&l}2H4wQ{0-ETS@%$8m}-W8Vdw2~#l zi1V3&-QN_v&*^bb>J$T$@UAeNpU&E7MgsopLEyf{C5^uhL5+Xh%L!%yw(kT!ch2_p zh7O6b1<+hEZea7h%3{%5TlQ1|jtea`R#sLP3#LuOb!2y-T_kur0M^f!!&x4b*HiA}tvBSb(^Dk3A%d-Ih_%d$Xl(L z&f7&%Ht0=s@vIU9_>@>vZ+Ai4a(0%ovIPf$?PyY^B>7(1g_LSbBWZXNIM-Hx zo(f>ZV(T~G*SJ3@II;gwGPSno17@Hqmrf2VG;iSb2ob`U7r17?3F$v*RRGa&#L>`8 zogoY}XaX#xfY$mIG(kD&AQI#ve_#yUOV!H5NI(Q`8McJS;DIccEHPgFZDtvg<8B??7vW7MHy94@ zp9pBv7eUw!6UH1T^Y0jFQaBx!k|(za-7bm{Fu`3|Nnxh`wwQf%(&0uwybyJsxphWp z$Dr0O9RNlrDpT_ESjj0UdW?L|4u0`Z---6M1mQ@Upxvue6T43ZyV-ufY3L<uEUZi z;q$~m(D@N50|aPT&kES}70RiF$1_tWd+7ZXc-ZujT z;Zv6VkDa;t54sg5wk|HX!1jEj!0hPl$0?`}mC|~>1#iFg z;PuZdaxRa3N=vrE zF&$uuCI|0vX<>n@{gCnk9Zq`u?-cA0Ycfqg&}Fi*>7kNaq3fJ6uT zl>L(nFi26-Y|yA?u9b6L37V^gCA2;y`E_d}pz!!{>0Gb*~y(vN{A9^

)McFNqFa0bGcxfF9`ZV}V5x(L^{KG-;6Z~pg)bdtQ&b%=2HTW~T+@~;C1@>evk z2_u4?;!wGl^?R?{G-~|O{u!Y<*_Zl+Dr|u9(s`e(^tKp~eGwjIEMmOq434MyKn(DT z!IhDh&2PPKcUequP)PW)Snp7Q3r0~c@aQ0Ezpf7}YVGiB3XyZFy3Xw>q(J7lD;}%! z=);@F9WGUF39v6orWmotLn^Z?i4eOE*ZAoKh;h`;y{VnW8oSq9V{Hn^2Ads&ACGF& zvGhf8a;ARIWxSHwRCJ#Qxg{%=3k8F|=U=}gvdW4zxoxblm^CWkrKoN(K$Q4`Q_wq+ za@@74?dO-OE70qbRaRCW+{)1hut-5UCu{Xb#ppATgFWw&BJ?t_H~Y9hJ4-ifnR5NT zhb8J~5ih0J2sQX9NTB8i{kNNz?igH5%3f(I#M9nw`v?VO(p2Q+fCuC6@9B!| z(sa2{aH*?fA(*$rSb-t%6JGWoXOXOcyiqQFr^}J#P516^*iPfy3ZXCyP%VxA8WAT< zvIbS%*+wRgQZ+bmO|Y(OhHEu@^WMD~LB&u$vhyoZx_`1a!dvM;eFy4hW8!}E2Wn(lu_dHqjvPwAo?g)srn{ctlWMSYSSfZ_KB?NSuJes5+ zu0|BZ1UQw_PoLz*O&jJQn+z!-OTP!&1s4iFU$MIS-MTWkIychJ%H?gT&zYL21LN)D z`qEiTA_)~9>l-}T$o&vw3979Qx5hw01-{!sd+395<$xpPO!~&08bGLh=(l75=Crsc2X_{1^?U+Qh#*l zK5iuBRL^>YhEc8LdXf)-<>Dd=V~DBnz{O7c!V%2@n1P<%O5I)VU;N|il3nX{OA7%` zqxH>K&!&CO*O^>4t}NF@5{StMYacW5WdAz1PYy9kRAX_-3YN(G5&Syo_%g(tT0#W3 zqwiBig`!4si(`;vQc6lhXP8GNyuBqsJsB9F2MPknkpQgbyt(4?Hc*-W*ca}SjjfUW zn$*Y{j_)}3Pj@cDr6(8X$O^hYliE!l>Kk7}nul=JoL?xgEF2X`F1W5+Mz+nKZA|Xo zx*vcJ!(Cqrad6i#z2+1Y7XI-0GpT6nN%!<4YVc^L~s-o*6vt+{&8mPnj$e7NDxA~EiBaCG)3$AkVc79ioO%0qe8`iv59 zNyLjCv|@yzvN_`)&7Y`Ru$u2tU1P6IO^isgwAINwO_Z}w4IK_#ZtFLs>Z_dzom zierY_9B02L*)?rSh4baJ317f)Ws{BlTPcCl!PD6yCgN5&XOV|#qLCVdvda2t02*cM z>^v0|=;0v%`rFCiD;^sY1!~yHZ)nM6*Z-Oyq+i@ez$hTkrkFr5%e#YJU6t>`Xgs=? zE#db{?a7m5rvX$8Ya0)DX4sa4QQBf!lp<3QIh1h$2T*$U>^Fo($o1r>k0qF16uio- zzTURf(UW&;lSV{dGO9x1HMQyv9bF8`2C!AzwQ6ltJAa@%y*+DD;(- zIk_DcKoWQ6y+%_k=Sqt)(OA)k>nrhzUKC(a{~p%6mza3;Wby0ya(@V#Vk<8sqV?VW zK!5)TSF_XHBYCl)#G}k7PoBKo4$8dvWRC^YFE1^9iaJeZQ!G{hG&O@cIo~EHn`dIG zI~+za#kc)bNe3;DxV|axcp+i@yHt0cO9TXS?@RPEw`+#%BXV4Oee=tV@Ql_qOq z-~(yho`YWlqx17zQWg;=AFO{V`LZL$2_L0^bQwM-4#7y!JlH9?#_yKMz0)yMzlC6q z4wrpMHS7K7G@pHwEOl=w%)@nyobLs6Z*ADPqo370OS;1vE4p$Aln8kp9ZH>wtgxU9 zg!50poOX#1T0+_XHz}rz`TO_przq<&_Q5_R!^VopUVOY%e&M>=qSTW2UYexg#&=<1 z;nhFQyOaZo^rE-H;ZyUO0XJ`Qr^IjcRQS>PrB_{%*ms_aX@{WL8zVqamU3M4u?w;# z{Qafioj;yIh2zaJs~(bGN@~Mk(7xIRA0JcOs1mOyJCQ0If`z)IqYL`vv0nTeP4hPZ z43)e8fvT83U7V?m)U&CL%#L%fX(?F|1Lz!CY?Gs2hF@Ic%~e%LY#^%EnZBK3{;f13 zzf)JQ(2qLJqa|PW43cHUYq&;h`|i|=7XSMA%s2v7d&5*q=P7r27UJ*Um<<}ZOQP$ zJy~*Iy}Iqj!u(<6uX+04(jX1~l_+@|T0h6#M&#ww>nbk+zM!wKtBP1aHal_ClX#3h zh#g5LuUiQ6RV$lOnhzd4*r+d(`9g{SZRvdlmiOM8AQ;Y9BN+n2zGa5>?==_G_$_@A z^bn!@*f0{j-uXrkzqcxA)80b~opPfma98=RJi$vRr;z4pZli_~b>mnnUP{yI^L|oj zB$$P%#4M7q8b!>M5Q2%j(h-6QAY{UDmcavleUHpdVp>6^7Vce4Vu=nW5m%tudnYet z5!!7_6I?Xfesw%YILRTIDvG%V#gYTvoIBLu4PBMy-6Nx;kQ+tPTW;KJQ9c}9D>dqM zpNHpnK`y$k?$M}k3C-2S#6%LRwyq9`VF2`~eEI!P{&0I>W&FVct@`6=rc! zi&~7FHZ)5{2Qv1{{40uj5J=u=l;Z0=wTVxgiwfHFe{0}>brxmQjf$FFVnT;qzl%~i z_~F}%$vv7a#F^;g7%24nT;(kf1+wk(U|=7V_u|xM@W{$)eK_0Yo8L^Cny1t3?CeOh zj|+epUVlyFQqbvQYYWxawYL7a9pvCpqL)3qE@xtr_2~(98n)Twcjyr-b#^CEKB~PC zc(ov=n2%=Y2p*5GG`p;r)StZ-=y&KCfyFlptQ zWN+f>>FEhnRgK>OCP05}BuA!LGRXSU!`=PMK^*utP6NAKv^KGTP&Uw$guKH{%FfJIY_xf-+wC|7~hj>UM$X9~N zFpt*>E)v9y-(hwwnl6W8^YDe)zU>p3sUW?CZqqr+T>L;07fMsZ60S4KMu>y1-i5uN zc1^cCFDBAv-N?=?XXRNVBOWoW#8mW;WNCsn+0#) z%^dJFv*{M#y7k8FKB#?g{J-ZOm7K~B*OH+1B3dl%Hj8uI9n;UwJ9mf+crz?1Z%Iza zupDk2tsf37G++z@7>K^{t!X@oa3{!>ky_D{bM3(LLh>;rlYuE80=%V*sg}>Qy+&{b z&uY3|jj2Wy~(jpDdD7P)ZD{o{IWZF=o{uLyqIKjYV+xqN13=En9m!R&%_ zccbTH14F}}z&7%!0bMz#Y#qsPSifn-NGu+8JBwWS4#=yE?9^C1|F^EpLiT~VxA=0A zz{N41Lc{0Ls0D5MMIDkK{bspT4171(3^=6*D>b0cEe7pP6Q}|x@P<*3KO&>-+f&g? zouV`CrVEjSq5WOUvb+ZNmr*ZwcpntMO)0C0Dh@u{;fe(_f8$?RYu>ll?k8nQav+Zr(@e0bg` z-d#bR(Cb3GBNd-E`s2q-Hgt{RaF%3`6Zqr_V9sCyUEj&p4>HMsWAZt8el?koJU?c5 zJZAsEfE%7uZ0_0TLcxhpN{+<4%>K_l^ToWsJ5CBL?mH5Ti(mu;Q zCXYdMq+t2sGAcVOD*=Lu!wgPOiSBS`TM(??IV7WKG$W9Co$mAyzVzNGZ~>{yKbF{X zRZwsPl8HMQ0aWxI_CcJ>Clw)mY}D-_xFBb*=)8=S;QC(L1O8~hbuQeWo{PJL2JfMG zxsC5`In=h#wJ&y537fpKQ+#-jS@S9e|IzaC^#wt|F_>^3N(N9frG3l8)m+WaWH4DQ zMe;rttNhcS%;pP%EA2kODERD`2(q;L%W5e#*8R!r^Qwx`)lx>0i|^IklZm({4d?c4 z)zxH@SG(^pM-~U4lEGJ`Y@Y!ad_5DZ#dc<_Hf=c<&EnJ5wWHKiNzn7dBYrCye7QdGpn zX~DieQ!I9QVV1@>J4fYq!E1ZXeuJpZu}r3&uqNZKTV4vdZP}1{ZI+0$=;M@M%VaTh zm%~v)p@$!I7kAJR@^m=x`W+iN}}f4cGsm!08kmo*!KK-#Dyr=$%k$zXm>ts!$ZsisgsG>=XQz96o?oadUi8eRY7Ar&-C$G zI5=MJZf}1n(kf(ib^+st?ZH?6Kt~v{6qI>}6j&QVFs6;-Vno6_L$Noe%IHAtEd_ME z;n1Sr1#I(yV}LsHVwZTW>D|6%EF4I>qArLHHG4s7JxoN;Nsako`-J$x1vS?;T@iX~ z(nFpt=dB9w_vA_Qr`NhwZWzud!PIhmXxR%xmKu0oa1bmPP8dEs0i8a@t;I{ELdFto z21qy#o53&QiAP9#Ddaz9XSUw@@uRB^A@Fb{sqN^Hx15Qo2PJ%mF8t^CUd@qVUH#Gu zlBbt=_sXnDikW&5Od%-w{j=a``^Wez?Bx7&aG|7$xaB!Y&q?_myilQfacdo`=NkkI z;jUWfqUDUO2xxStN!@xiBHpX!&Al`gYwL_dtK7{|HKmdt)r!CB5!* zXR_fpZxw)W8q^IIYEY=Km-0}{OU2LIgq^Pb5@8?4;2=zjtbv%vhiME4M^2lhhZSjk zaA47-xa%b9pq-Ark5bLTB?^6&>K<6sqrK#u5dFCwq#@sI?{lR9-7}_XFo)c(6(OuY34WU0IstuV3`;GdtaHp zCU`af^gS9?%$+bjR*1=e`XD9-AydYbw=w!a?p)j(>j+$MX7ddea_8mR?O$T=zdC9GU3faC?`{egyKNWFpr(;2Z{~5lAUjjr=-Y*V zdCA6Zkyp@niWxHBqJ1L)E9bc1u6A~IQa3q=54uujXUCRSn=c2ce0!i3=)rbabhQ#{iunTyQbUPSY`q0 zq6+%@`Xg=nI|KW-9(*}z%+lRE?b+(%Otc~eINItusqJB=)C82i(raqj%L@V7BL(fd zZRvblKZd`YfS^4p`FQ(Iz6trXJ zcB5rs{S{*Ac^vnTa;?Qb$BED50oz(r;<1eLEXgfQvGMV7)#0nCv1^bVfIzEBN~drU z`>UAGB#}WSPW77bA5~Vx=VLoMY)%zNL8Tdxk0+TwU;rBl|t zP*WqgFH`{3Y=Uf~kFJ+jt)pf6TJOCs=KIkOfz_i!V2(|T;I_W8F?T}fGc~oo*wz?z zgC=Eq+#4dp06*_Os(`Z}FRUXDNd=d>{o_Xoh+lF*k;d0Z*Dq6n_m@g!#Y0Gb2h)v9 zC%sRApgnBZI@VPsVxF9Aj8i#tJ>PO^=fjYaZ2h5r0a+?<#+Y6Norw42K+3t_uIWHE z{i(4}nXKE@cJz^CR^rtvb2ww=lwgDFPDKUogM>vyG8-xGNlbQNkGbZ`1eB za8sdEiQ{uj31H^(>goQflCrX_rsnMgCh40i>E&d+=Oz`?wdUQCIU1*9QJxo5WrnI= z^7-ffjMhk%VM}n0%~V<8*E#-Rb+*|p8=D-{m0}&8evOgzFv!2^6hNFT!kNHuj?}Bz z*U3g1^v@Tz$pIg-K958<37^-JCjoqhrj`tddX~Y()QYaCx1Pvm-T)f$d~>+=$tgQLZK{1Qf)R3o8&nKm1EbA z_=7JIu5tE-g=)A!sYxcAA+}lt8q_^$&mR~Q4sSeHV!}Y;R%(;{66-y>Ch}&&zPdC% zz7lr7YQDN4YMkU2xd<0E4cw2|#^v4VQ8KM|U(bfO6-9P92UScXS40wQBu$Dy zgX?$rTi-cw$0S-w|Kzh}-|5iMP#TZKi@MY-a>N^5Q%S}er=yM04h$zk0WDx*eaCq1 ztK$`k3M9%T#!DR;wO321@ND-A{Gog+t8I$S>#Z_cTp?>aq}kyp)S-T^Q`H4GXK&QLff#XFTt%c)Jw<)}i;Baiv;5mJ}%*5M@Q0kvM$?X?y@zUPD(nJhm z;h4DLg7T{0(~GSR4=Zp00$M@f>KxVmE(mv({VG5a6=hy8WqIRI0V4xU_BI0}54zEc zmjh$or~=>bCb5e=prJiW;nc-|a-DFhLP|}zQ93%HrTLuKV)VboS5aNXZf!xcRo+ns9gW z0-jnEV_Rxl)s@$uvFHjo=u?vW$P&yGLtrB|W_7_0$O`%Ir^D$D*vaz*MdmJK!~loQ zt?_pW43v5I4eNX%Kp0NJ*KbTB%yIs0E4PRMS8G!il;=?zpVI>m+xNL1m4>D-#~?uH z;WDt7dEHnd4p^724NyV-R-iWbX$&ClKjP~ z9ZL?tvWt_ZUpaxTwv_sDo5v=EVhE$ssIY3CqG%t#P`c>(%%C-GB}o}bOnuLsnZ4D* zGKl2J{m2(N?kFCyBkTQU(kKZmNxmvse?Udib@PFs|QfM5(pU zB$BQZQxcZGDlLT(pEq~vazC)P&>J66j`2 zj~pfnZV&q|M^No;+BEO|oNjjYZoji9spTm-^yh8(ZrehHn)F-*m5DElIjSH$|)x^(F^cFt;XY+0x$C*kQFUpSQzQkB!z(UQmN%dAbHpp1vfH;8a*RNlBCUt&^1+=3}Hv(q}m-m3S;Nt=3IIe4ZBcb^WR0+94x90a~KC0CA>A82|_ zZ#BzV_?FtYdp?DUl(wM#N8sz->Xm$#KBl{}K|zuqjjrih>dSc6_}|8V>p9m&KNyld zec6u7^aQ%#9F&LD0zEiP*e7zBmKNE!Z{PSlem^z#YC9TJ0pl7n1_tk~Z!IleqlJC5 zd;)2i9kCEBm$_|39k{uQl$Tr*gPUi?$X(n@T(3VylQzeEbEo*{r9-agzv-A{+B@#9 z0arHy~+P0 zpnJr%X89$WRIkO?4J1NuFw8j$siC0}vN>M3N(?^@V^ED3_f!PlC{f9Rna`wDvM(t> zM$=e-5sA7b`61T*^TEC%0C?=SDC!a$8MK)fsxR0wf|JxG3a-n;v$M1QucUczrLsxv z-V9+xlW%eXc2`0|LJ7N9nC3W;+gRqrT%JVGNY7uZiAx)w9~lLjZ(#e(e7b1#Ss;6^ z#=1#1lnZ9V^=Lw19qJ$q6yE+0Kg#js>OaN3VS`slC?DDQoq{{88)q!!mch7Aax4Rt z-RVzo0Q&bc0l?PQwnO^*ObrORaNdacnf)O*SH}9(n1>2vYK5x_uwGMU3*3(H zf7~%GeS`$?{~>}OZ$Uw>6d>{6&3#E#@J}v)f_Wd8Vck5vu zDI(PWZq^Tv|DW70iLxyLxQ{9#GCal!WX_9Krt%F4=Q=CT40o`4ME z4IAoq0rJuPc&;LUdHBlY8^V|GB2enxvM%jqWMpKLmzA~kw}tw;x){`1pcJ@w_2v70 zWxum;NnuP>TxoP`HS+ERo3C&FQ2?pWC)Clq{o$`)lTmAs&K$56K|#U(3_vH*-~}@y z2e0YZ^>wvgQMst4^wtZ(0VP6OafNt~NTSXOTxVSJzN9uVl>(dzJPgAr9S0^u6c4F} zzzZQEy3lXG*40u`zK4hG4yj~FyIG1UsJMpd$xi@G?1`QknVl`3bs)A{nmo3fBqP+m z*&m!ygui8rvKSv5t8|#=`60keEqn~sewJT^C#2deDEG_Qq`l_3cJ|*r$&b2wA>ec6 z*40r0e6}OZ@AiiV2j%tkX+SVls1JtUo+NeJ)K3YqU7Pl}Nf=^|Z);#JUbg|j$n~&x z)lL-A&TB~r(mEq8vZRke9>qLm(mp(u?sqHQ%Nzy%KG35sg{$gK|3P(uzZ+hcKVm*y z9gb_Ok*eK{P;kSvJ@hwjz0v?T^664)riwuchyg3nyN$aow_lvfx($u6tT>bzHIi~o zn>K3lb$KIgJgUC`6^)txzx=`6zc`fqzK7lIW}O(G$SKu{^oLe4xne23KMDQFbLs`f znE6kg6ILZ33}LM9>|35SeV$%D9@7U9KMQzcE~=^(S;Pb0oYIoSnWD~hdmg_2`1I|L z&9MK=m%-3g7n_T(H#_?(Nv8~_-LdrSJMND$wh#R30>cc<;{wXyhH49(?8gwGb5E{H zazmoUL|24;>DUSRB9b`i#J#{bE7&M?^;qIcWWIjEu156pv@Tv}-&50W$iG5Z{|{wv z0T$Kw{R1Kcd zX@-u;yV372-uJ!#d!P4taOND(nG<`jz1C-a*4k^IJsgQn^IdZwxBb4MArs()0#7^= zkS4T8i#2eiqYz4v;0@TTg?o1rFNUn}%UB*G?YF?x zb;$rBoZ%tuEDvF_b8G592;YVvkN`1V91opX<5VRfe7l*dTTt3!^8(D)&De52W2mIRMiAueT4fO}p>g$CxZ-%!f zt3C2feI+$Kf54bdiqq7FROsg__bwuT2Kw-PR)U8nR`MLiWY(wagjQo&w-t$H&v7Fo zBOg>}TN<;K{|Zw|H08OA7padqP=EgX`QD>P{;|>)OIcfAVvMifx^<+tw^tIpVZL(p zc}NT-_dcM=&`OvIr~E`Qb?&;vxrPuFn3(^QG|=KYTeHQWjF{(0o^q)erH71jIZw7M zio>f(x-#Fs2bn~ZK!t)EbZ0F25%EiZ#Da__)xV*{*Dw zR&jsI7ow(n3i=H427YQ4h&C0N0d*Ph64N~0E`gdw;`)+!YPf#^7H~fliJ)gkNTiDp zau4h#Dy+iT=`VBSS#FsRZHng3QcR_0wLnm)DU)DjP{PnMhX(<)!BdIHBUDGrO!}h;BV#^feo;+Hcz_h&gbTb)~E>&jVkaJ-Y@B#Uj)1B+ApXU@w^A5|9=T7^} zGPmZ=^)3`e1NOWst^k%yPRhD0QlL1(lGlF991qx}<_z?+8 z40rFsZRVNokvwW(YVn{F-29?9YDI5Q|nBeWFua&26<1I_YFUM zGi8b5p8nzM9pTt9FZnRchhX>h4CLizvb$)~O)c-lhRarfn% z0xvzI*HK?5H(bJlbK&lbUoyL4C#RWEALrWJ?-%u>!(e)*2b+$w@p6po0fpfQy+mOH z2!b&kz3A=K5fk<-oo*7zcyTW}Ez{EHJLzH6FW1M!C{dpzB2$YwA+3Fp*BM%olz;gJ z{rh#@@aL1imlUdq8$T`f>DMXBeyvHrJR3kxpoSJ+Csxm!9tUmR%zSnHR1LqhIa7(< zM3#P-+Hp@3o|X@}Cp(FR?S@&Eee-#sANSdznI!0Hx9T)gBE8E(amk0QEGL?&*z)q} zQBRAz!PW`ZJH^+%2C5=(dtOJT+Qq-w4^z0_>7^njFgKsm?xo5pPNCDp?Ji}%Z2R?U z^7Ui-x-BodnTG0o=DNK(ItC>&?5ki2pfI!0H!)4g_2EaOpICoxd*r` z#TOK(qKF{t#_8^7nIJv8KFd_`2Sk^A41;X?7v}3a>{#qHZ9qqOb_iBMT4dj4ev5V} zgX4`$R*flLGSG~qqb7H%ReME<5iiEh#D7%1)qkw)$r)>WXgb92xqgixfZpdNk#Ot$p#DOFAbQ_l?7l=Xdc{odBPtc=nO-c>R~;U1K^-_MpX zq@T0`Z|r>q;B5=Ki0y=&Tw1hC^6=I?{wQ@=V-2UBNDx10^c(i5$>R`2K=Jk6Qx@|~ zkf`4NU^(?fo4lNhI%>7Os(zXJhtDe+4}I&bH5^mG6zeBPI_mm0Yur!Apk(bnD9BGE zddub0hQ*oGY3axtc4QDGXSEYdjxlz>H7-5}XtuJYtn9-8=t~p`XkWr|#Z%VdnRFf~|VPNf%!0)Gg++v*LCZ zJ>u38wSW`18ukMgJW#3Q2;?1q(v*^1@p?J$Y16yRrRwD$l{Z@I=h^*fn$tGu{1Pv= zyu5k)HmKvnUS(__kzZP%tTcz_hee~T`xGuw#kb=AL8Tx}tq4hKB!B&?eussNdFXa{ zwJAd9k zQ0S8oMBk+XLf)2*JN03v>H;c;yrdgx#l?|BHh!2VNr%O!0%dP3(ce&2^v73HcF>Cy z{I!K3X`^DqixOZ)>T8YvbGBlZC`EKkE|VPYRo$ENYeFnSa_Wb8{hzzp*Gs^m0t} zXtuoz{uX)!=Zqw;4wm9^pkC76PN@NUZCM}#S8&by5O9Kjrxwl}0jh0Xu0cL!IJK9ccL-Sp zY0~4RUj^>#i|PrQtr;;<4 zf(+9dU}5)J-NZSM2~_T=szLt&h_}83qy*fXgBxt0`Ks(t`5WLvn^}{mS-G2Z$E1n9 z4+aF1(|({5a6GiNQmdr~aH^JtzpvUr@iL_5Csx8zSmpA@ytC`Z_)+`eNK0#LHi4g! zAn7yG+woZ{L%Mwm;?p(D=;g5q#Gz2R{HU2ABb}GC4Uw@_$%}3>m*4W$(L(^l%%}#r zvI+iMFk!g;0H zN~B9ADbk8{8QdYYGtNjsyCQEZopDh&T(Ej6KTo6%;rUa*^h^X0?iwkgs=({1nOSmu zO1S*@Aw4NbYDkYj(eh9rVv$AhrMUAD@~w2mPV*WrS8~0vJl(#yhB{+;Z#ME7PU#>$ zu(;`Xtsd$mo!uhOisE8@kQ<9o^^#QQ;zcy}7-^L3Fu=9GorFiB})MCmjCXU?VY|(;K_JJv^cMP_dT^OdPc<~eGJOpw` z98F}=K7o-W9Wjqr+S*WU$jV5;o+j}FDM{_q--8kCk2=P@Sfk5ES5KJ5SE%s zQ-IS^WuiXv4Lbz-E}WByjV%3~g>uss`|)wX-dH!dui`lrNyYPksH*f?b;+KTc|xzN zEpi}S`tls}GIn9V{}J)7hH-%|`K_wNr?0U7%O~y0WUV}b{$;j=C(=E? z@~=K6cBJ2avlJ=MtVsmj7fALxu%9V8+;Ryg8|cD>mKDJ~6LwCcSFAO7i|Q=WTw9v& z;prg>d#~dVGnRDb&$`ujJbbR1NEcXOe2tP!*L(wd#t&FtdYIvrL)zNdc1lTw{PSn& zXnmO%MmUuWCv=w$D$OoCPY&7Q)R6MRYbH3CIkb;1mZ*CXsYl`)p2`V+49}_IxU6lt zBvH1-uej^^hma|mo(}ARs>yx3FvRaQQfHGD`ISj-83iG^YIMxf+RJ-fskT-O7A!$o#ebtS1 zIeTEQ+Mkrs0;??xIj>^I_8^irwHR~C{i{oh3tgP=&!ryn8mx06Zc-_;M%x7mO$}w? zKuk>*HD?%~0Fp11NF1MWGMM!`6HJyK%4}*Q8CSm;eqef93nqO8#=l%EV)3GG+N|yU zat4CqAv)tQ#ZL2f0}>;j9`8gOhS;K-Tsk;$l&oQdx_qFJ4j*O7+1Jt`=k({kS;B9- z=8-^y?O5;Rz)V_5EK*j(ui_I&*fXH!!}=gaGEnt1kS_-icni%geGmRO!tc zStycksieiWy@R^7HsRN3P^iF=`WMs&M*oS|GR##po#Y>5vtAj;@Dle#X&v*PeR$pR z?n9jQ&TAT?KsT9l3$L%P7+x@^L$Pn)Ene9CYu59H)XkbKXQ9+=WQQZ za!WOR`(|Aa>Gy)@a$m2u)?KyRHljRT!$HP;)rWaL(SwiTV|&;wcB4Hw-M70fF+By9 z(wQ~0{rywEL>wQi2s6!;lI{y!Pg+UOP+H$}4TQ4w!bu;;c^@t_#!!CRgkzqa_qN==iZB$-*4Ac7 zp1K~05!Q<_BZH20S^VkrY3z`*mM5)TKjg)GgnFNps0-sg7G zj@G%n^y1v&0WdcZ29)p_Vye#g$i_?Ue9mZmmuM!hNA)=p@Cl5*k9S_>-1uf?l`2xd zk4wN@+aXH2CapZS;sbQL^U@wnnO5WyWm>hz3h5h+;aDtbuZDDO$1AByR~NasDzOF3 zVJ(Xn72{a^OW7kzeU)bL?rx!8?J*C;J+Ad`>ARs|RQjF*_50t#a&vtt$Z zm>feV!IEXK(US4`PzHi>JWcvZTthcJ9h;*AcSQKB#WHJvY3l7q<)cIQ(OtEfMDm&& zAJ7kv8gZpXWbw=z&ZE`G(otJAc70d*5sOjWBZV8J$=ZwWdsJI$fs08_MvC|5z|yxs zVd$7EQkgZy3XjaLqhp6eHB#&q3B96+YIjGVN;o%?z@VS*cHXI3P;ZU%F0d3a%%LwtZ^)8+)46Q(d`JO zeKx6QSX*~0I2Ii&ffzP@OeRPdyj+_~nd&|J^8rL2+7=|OZ+B+lydKcebW-l4zOo1n zlHEpyKdlEV=GW+A$sA%ibTT{0MCT)C$@1_M1!0fiIm*2(3zg|^zH#>AGjdvwl`?_e zGS0oa(2m>P&nM`{O&*b_xV+tOQKYySiO?HN+6|6-8?n=q_IPi@>Hcy+cK9|%gFJ1J zgwZgJ5Q`?yZt-1ft`Dq9#N7lA#U(l@!h_8kJ~%k2#ScBu@mM0U`ek)ny8Ur~h(EH( z>p9&)a|0o7?-Lz%-q#fF_@0ESi%Og~-L>l(!0gFGpm~Tj9f^T_(BiEdhSxqG;>5py zh-WwEz+@KSfW80piV=S3WrE4ww11e&|4mAL1iv+Jd%GTOjG?J37aRZBfj5R)ha3rPQMYoSQ%XyNdNPM5`)HwnahycFRFrb zkKYe0Inq%Wm7Yj>aa=B#Uf<*WBb9Sv&ov{jZ1cRh-6bH{cjxy9kF%XsN%L*eZL?Rg z7Uq{?tF}nyXGcc*-pfBdCmx^8%Jk@AQ4;&FE1}1}3Hd*5W(V=2rF{X(7TY>omT%4%nS4)weNgo98e$VakQAfQo;y1yf+`?7+LImeYJ;%(Gb#;*PA0C- zNA1ssH1l-bV`_6gIPh*jaw*K{!Bh~!cusNZ&CS^@Q7^n6AV4?mkdFARt+^cu!*gVk z2t5k)X}Ndiwa&g#7*L92ZSK_9&Jn-c2!ZEMQ=?D<_# zrH6XA{4Qy_X5vL0Tv;-BtH!qV+EW_pMu~i?M}F`(-eRbD#1YEhoFf!;9l5is+IFaM zJgl6^cFr8navf$s@!0bPi^dD~Bl(M=L$Y2>ag(mhjQq$4kF6WpSiR9ity4&dz@||v zh$70#QPQ{KVq__qS~sbF5(!ajbZ;dFr#<>>PzbsiS(6 zp>81yFUa&+X<&6ed*&1>Fv&DN@tSp7LBRtD&r<|Pi9dn^e)by41rc(Z-nRJ2!FRqf2)3L<#?>?Xqyw`{;A=#9c+4f7A3z={&1dkfTjA zpCHNukv!i}il#3pC|F-_U|}@(_F4B}`15v^81lF)7wc7c!+diCX>Ux+B&rW?xWWk= zqj4aWod1%G1GYWHCH44(`SGyYhx z2Er6IJa#`5%X#?}%o}$;4e}~2$-@E7~ut1sjOya1QC#0HcNA&}pk~f#W z>uzJiZ8~6+o9CmiWzEVchL^`Vo<3@%o@ykQq zmtEa>54X#XB&@XYigeJ)tp+%ccPPV5mFc(R!@TvKxVM+LTRV-qf^wr}S=IWJl32za zsI&+Nf}8Dg0ifE$K^t~Tz;TH-2?v)j4iZ@*-{{X642udcfm=;!i&V70i*=<6sv@ft1M{aVzKrYjtAbn$H zP7rW9d#BP$_Gf#$lz9hNJZz-iO+xMxD{GcRoolwS2hALkKJN1G?xEpAzK?5k5PL)N zS9@*-=i_-8Yh1LcOs~}0YWA>&SMm!x?%?zIfZcqxecYrJ|BWu;_uE+4#6!&#h?fXc z?zBR_+_nm-cL*n5-*C_zMt?R80NvnjbO$<0Jm*kUPdv5Ai#haL7hUFe` zPF`F`{I2QMSW_tt_Z61l-z_%860Lp#k6Z?OWKW;+t}#bNSFIUxeH z+f>3ltEliUCrsOf!UZdk)E#;ic}NS^iiF(?W+l_p9|Xre)2B4PftH@FnBQ?}3%jW0YUX z(DhZnnII!!6);NSBcw{PzI*ZOESYRVCRQu;6VX=22XAL|uMeYjPtdM@oLp?XqzFJNHd40O(RfHaCfA?CItKLb%3r>~q`k`kdkI*R--d(c*rGoyh5x^uR zB?T%gXhgR8?HAo_Ylk$f-?r`W2S6L_leRy-QxnC6MFZWT(K@8^W#V%++}cjVJ>0Z zH4LG}Sz9F{&|I>o?6-mYLb=87!G%{oICdmQ_1E#1?i-CaE&1N8+r0m@H|$&G`aszA z3(hBz&E(b>+Ooti2HKlF!x#qvqfQm3%(-M)zHZ7taIODj$6Kjk}*i6c%I&!55n-S_r!e<80}pRvM3O zRBXaF%fS0tHn2>5in_c4+7 zLjCvZ-W~9b9cgkZrM5B<*N*;!0kE42(JR$E9%D3;jZxIW@l&hHK9B4ma73=<5B*DU!6NVR<0Vy zOhrx6HQx4SitH*c(fJ8VIk1YJuXyt2*{4^_j(n4In}5&;)(esHq53KU{)!_02!2qA z9NTJ7gDD64{A-UB>Yk!YCDirNeU0jGu!RCrz$rs{u3P}EPVOaU^ zSEFMM^xlb`k3DzpamKrlkkVJqB@X8G%Il$Cg{Mwn%da{4045?bl-jo_E3A+b+N3)kI9Vdej#P7n(@02X6b`^p% zUcp2tpzkpKlKJbfM`v|1XrTV3n=wf0FEiz1%KgOM*!Zh3Qev~y;N-;IU%dEWxLj=qR-J7vaGUs<%Aiq2X@77K*AHi-_{~9)HX!fPaY?T~N6M0OT9k zGaYX1e~QdpXV!!OPNu)^bMNml20u0s;{bIMPqAJX(#!cdKcU;2IM>d(*`>Jsj7RF< zND_r4R%Jtva(Lq6#A)Jlv8K5~pD0^UY?%ji?3ctFrZlYCztjEH*!@FTc5XZwNDku4~Pl-K;5F0J!1r)G(# z$Kcc^#NayiNP+s9DzHjNp_{=l?UN_$5mA?YyzC;8W%gIce#fwM%v9O)GIaUX(jGg8 zYUI4fiU?u`ALT=+aYPVb-f05cxu^J;QznS_)HhgBFt*l33sERIe04g|_O#%Y>J6TZ zaMM2CT+=#?wq{)Xvt+RNN1KZ3BzBhm%q&ss(t5<6f)9aWy}g?J{?sgr>|KR|9UKe= z)a@K-K((tYw)PQ2|s89mfD@e7;$tmo9?~H9nR! zj`)&`ERTUxH(i7^wBiru=QegxRSFagZH$`R=g##gBpmTK9S*>BtP(M_wHqBbC|a=^ zsK`j~L)?!0E2`xLN<91zG?fhLljfoTGwXuAWb3>9sAoAhzy%3kNz5y%tYAWNTkb}L8g)& z0eEL$saRJ`8@7=JYHC{P%RXY8mwEAA_Bmg*=XC>qCBOE@t|6Y|ZDl8$`ngF!etAjL(Nb$(YCg`oSvggT z(SLTe1u0e#N0`+M5m*>G7{O8({sUq8DQN1k=fQOi5haXM1Y4bCgF+5~hF>WavjHfq zCLyw4Q+XVUkb(Jc@j$(OeIxTgN|JjlhXeZOj?CM~z3DIRb|Mg)cO$pM4WmylVy~76 zv`C!j)*<)9?tU0R%?=y@lhL|wG(mn?JpLj~AB0b&D3tGb>t9JfDvI>w83QLG5 zQ@U2W3MW2xs?NpE*&c4EnpILPKoCHgIoP)bbpD;ID@9<3;NmDL-0gB7yIR7Y zK3L^(TZFB{G@k9`!Yg74vn)qo(07AUhH__o((C0%f(OwpBas;wKC8p+tsscWBCN3Q zkxVFUs(N8==v{Bb#D&@4;`5Dqx8nnam%6*@?8+!Oy1ldz<%EcXEtdPRIH>6Ckf0TU zX>yV%k2mina21`jtNX;)?R0kOJGL>rCFB}N*liBs_LcY<>~m(V{xL1Zt;mB7rnu#) z)|t(w!XM6lX0rvy7q(amF&g5xuXV2RJUi*mf1xs)GyXvA7E~|Dh3#09zbFn@v}yRn zyfSj)%3-U&LEP2Ge?xwz_VSrDL*1*QB0JsaKkSI%_|jn8!wuK1;;U{5sP*RZ26AAX z+hqd2$Jk_mdR4fB&}hwl0fRnq(avAS+|Nt%=5sNY=5K@Scz0!UtFAh@mOtDT2%XCw=k}Ee2&9W;waJw?<_C+eY#qdVFSxRV6YDx8pP=TV9oHW)8 zzIeoKwqs*g-*a~FcXAL`%Xd;qW51uBF1EiQ{>rd6W=yksSE1SIcM^X1B2x%YV7s1# zS$kZi8pu(p9~t_cWp^Loy3I%!7x041qk*4wJQhbmEUt~xf0i9*8dA}of1cKm$ce>^ z40cHwKY#vZiWGne=Yxv4z2-}SC$>o!nUn)%UgnX!!>7(y&I;xlXgF?yQ^Bc^DXS6b&f=0og|;~_Fkh9?7+9JJCWLQ znKILq>!GLKTOR*wK=@?N3@~)%N%MTLroj}SWptq^a{08L7B49I`A+7yY~P+|UK4zi zLCt>d6uz>dM|KvDVvmOmO`6spN}?Y@=LGp6rU?r+S02 ziIEm1G^8fx=3T38{;<^@XV%t8~M$$gV4+hH}#O|5e1Doi_AAYwa zd%1K+`A8L39NV}LYaBT9bbQ)KR_Z|Tksb2%H7%_lYB@a)mo^4dLKiA>V>!F?%K74w zekW2Fm3eM_&!($)2{nv<6I{tNvZ2bad1JY9=-41fSdyL6Q~}Csox?DAL491vw93`u z(U73E^`2@~;S`G>_A@Ty*8WO@#KO^-!HdM9a;lbfuim>mZL>J?P471FiZ2>Fjh>t2FHT|GGR#A!?KHC2>{;{G8MLFwC&6d7sLvj|3;j0qR5d$qA6a+=8nQ{Fo{K@L27 zHMBIp`&Ek(${ctv-tG5LQ3Fxxcx24j(qj4t`U#LEz|3G=T#(btu8vr8t2Rjm=XS(9 z`_r9-6M7c)0*7>{-VeCl>>oCa6A{i1;bYfjy<`5L2MkbpM?gwCK*80KlJj>DvF{uD z%jf>C7eaIW@3C{o{)LKf(1#ipUr2J%6ZD9dfVV1a{fe||{1-@t2a#0jD;Z1%vOI4) z@4h<3yo~eK)FKxyjCMac^*^CtFmiqTbtsPMN2I0_tAYRkcDj`KKM=Nhsqmx2PEcb3 zsJV?gUnD>|__pxBaPW}>;!1bBP6>Q%2M~|{d;mmzdw=eY4uzzm0wCN0>8d4^mhUfp zyuqrnO7RpjU}0NuwYwXo{ITs2!Diml`wD}hWvLRxO^PXSC-tDrsT<9-+ z{DW%22RrJxOBio>kxY(8Urn`B?kxWQK;g=n80`a&(R_@s>GLFh&sOy)o2UxwA#vN? z&G}s=0!{&*5D92o1-RP&oH5|2ImJKj;YFrnQaddn==DjYs9X|II0ap8&$j^R`6W*F5K5m=B&BbU%e5h{PqN&!gD4CT?-_2i;%ya9eZeKH z02B*Q^~G5tkha-fg===GuM6mGrf)?H@ocFoOW4N2W{P$I7wB#a7A^ww^j!VMvFGxHh|2 zDgeC;9?9UNqMOox%%z3cV*c^=ZHn2H_aQVV{o1V51odwg8u&{^q4K7tEWq&otknHw zXTSnTUM-QLRZl*b`a~7P9+9q7Y$4u3^yp^;0+w^1g1!uGM|aWzR=ZL9_3Ko2p@qpJ zXLxQ`;x!v@@7aBL~g>?fl@Gu@_f@l~=~fjVK`Rtj z;vUx@A=iG+Ki@&-c}W8XmmMW-?78tggN4`1N`H5nsVe~*`pXdG<&7u(|An80YTteB z88Xn%6+78=(jp_rl85<5s5zWB4kA|Q{+lFDEjB{MR)`xpkFO{e@AS=ls~ixpqZhvGPlZZ!tZUF6_P8=yt-Pz z9CBTzI^1ES-MfQb$n|_3nTfiR0{g5y8U6&eTwcAn7QQE>tkh{i($+(XXCo(^knabO z05e=m;WPLMxm|?M z+t^B5DO<4GOUbEfH$!f7A*yIA)9ZR*pzB_Eq5}D@f{mgRS2qZ(^PeTvud>0B#LLZL ze8G-h>=7Ruw^+*K1iF>2@-|EyH;sDCrF&z@zbZ4S`l)wyx^8y1a?;*%KPHXb^;|pIL8rS-3kU#^1!z0E9K6cgP^yb5V{s}62|G?WTL-6 zveOn@J0}ExYT0!$U0nn7W+bFtqvpmZxg%aE)J!xAyQlYSBMp?;e7MTzFn%yhc;2KT zWmlIgB`ePp(_#LRLty78AP0YvCnv8f;yO-S;}a7Kvk{|uFGs}qdmtbgElwy@7yY@w^`02o7gf+7#E0=@|b&=JwWpsND$45{{Q6~5 zTUK`EjIg2On0+8`2s<-hmFrR?^)2#&M2(N2IDd}v=AnOx-fOc6bgD~o_?8jfbaS5% zBex~twq=xr!!CXWm$g|YTNaD_1ZN6JD*pDw zi|0chekMLGQMau|=b0%02AsNA;$cC6Iwl{@X$1Lp8*X&4@ZGsZtX`w!da>SYzX=$5 zQB>RPYfgaH0Wpq{dCr#c47Rewa*piL?MC$j*FrGAvP3;2w@kU;Cb9M#(AB^(a~h<{ zv+QEhYMbN*gt~?B6iD~#JU`-&;d}=iZ;xJ@DT#Pziobr>-#Efg{Th=yXD8o(&oTNF zK^Wu}q6gsu##6r#Eg!0ZrvQ96jTR4}W9IERy|oF(uP9ts_X-$mZBQ{rPy=pzXISER z_r!lWYkxus!j_w&4HBFe3;-w*?y2zEn z>e45&vgb!$MrTd~eWP;SEozMPRVwY*a8yU|P?u+D4kJ=%K`%V{izs($;9hp{6I3EV_yOh|S>2m(I(GaH16|u`BpLdcWCL2_2*6 zWNy;k?4q>WZMaP@@n5PR*UnQyT$@j7p0U_e+_iTV4(G&@Mz-3tNo{oxXr|5_)&)Ix zX$KSCv8u`Ew5*vgEX)oX`r-Tc8_``|C%QBpn8Z(Luh7YI5$Kxl{05OA5awXtV)^U_ z_E4EHY;w+C2rtYUfb)d7I5&-rh9^+Wyvo*hr+Tu!lY11^ft3Lv{sB zJACCO`!|oP#I(hZ?PL($QqAK)yf5RhbzhU*!A=y_@%f*LYB3(FgZS-z*$VO@Ys%RLpZR|-I#zhz~ z1lpvj^>zvnX(@{h`PKFF*-{bYt1ZVg&5O>x>Zsa27`jLBG34+T=%RQvr4)*g7N^ss@ng@bJA1N*u ztya0+j)?x+G*VbxwFuh7WV*_F7LDL?oDn*A8fPXj&F(-W!+{|pE? zebkr{q>#i{r;N1L5gQc$HKQkyEPy++Z8yvtoQ?B=a)o&Xj`4eVi`mll4?aH;&?F-uS8R)mIV)*Y3L^4ArQfpVj z6=P0%9AK+P{@5vyDS+e+Q!p0v^r9Z-CBC)MdA~9B-W!jW-(>$7z4mO(fA7B8n~GY; zj*pngwG@**sx>c?oe{09*Md}OGye0UYPjhtC8_P0&#pq3?@0vSEu!5%j!uqf!)Xa( zE^~Ww6k9hMznRA3q0=+{3-Jg&72?=CQV_U#V`A?1@K%)aDJ?yM7i}|bBlc$(XCA-X zb91f6A}gok%Wz}K;~ZG+51mQCKQj<{O$8B%nB}tgE&_W$4S&K2HXKw~W2jZr5wRb) z-B?rKINIVyUxa?iKf6BG?F-y>ML~MuLO{dI+`4h?Ve2A`Ou}_|J?aFtI%$aVm0ZXY zQ!=u)^H%&2oj9T{3}rZWAsBt-M+4S5xp<)X`SuWNnF6W4_*?Dz#pC?zv6Di`Mdztc z=hsQ4SX;ld5}eq%AHE|8XN(U5?h-%E!((wu1&*&>?GqB`_hbZLS{&$oMX=nh;CV|Q z^J3YN(xIFrnK(fUp*JV-u;FGj##**C{~&2%mkvlTM8;_wRlm~#EbhqJCVS@tqF(HY z{wkf{8mj9!9UWSVsog@&;;q*LWg?_G8pvdObTtU&V0$5&lZnRU#hfD z$1PB+bn1FA#qdXVSMt$2jbW7g1IQ^K>N^udXO`%wAZ2;F+N7ArV1U)F?ad221FEh2 zHo@JO+{6iY9&L6$h{_mx5%7+jBLoBdf+r$nZm&c@nTrUgblrF~M0olu)EiJrXV&Lp z$7lC)QLpfwt?`|?$KAFt%fWLoV-o(FxkGp{SrCJ@xA-?SfAs%`=Ef7W(FEWuCtWx! zLZBtdm5$APWMstry7#8@!uP}202AU5Lv_Ydn&%fS)u-DtF{Yp-Zfe!a8HF>z#q~|9 z_$RDe_FCxFpGa>R6D)dp2fa)CVd2e5Miq{~QQk8T|1e*H(6JX$lv)4MKMa2uvj4DP z|7faerm*Pi!pk_fr z%HoCQaZgbT`B4ftmK@}B)g;)o1R(4@yUOL4wM1&PzjrvL-mxT#^5O_b^uP_)%VY%SGEt>e*j)@+G&CQhVg%$=D@AmryDcc!y1T8-pPHjuqEOd+DEOj)_$*5 zg8W>C*4M|$@xAl{ePih_Tnr12#F`Rvo5Ne7B~(NI^Po`On8KdB4BvroOSfT`y5k#$ z=jg6N&VdB8x8q?B?yNFGom|4t$Z zY^R_sr>YQM{j$rE_c0JRfuv7rY`oFK_kL9gD${WhnZe9ZKq57S4+Q1Y3LYoky>n*7 z*<#rzs&whEfRYXno=yC z?iM;GjPL6$T8NWjA|GUPyL!wUJ6n2$6G%H?dCTOiEQZ6X^dd=~r$@UUQT$@!@k9N9 z3#<#NfN}U^<`L!8&v1z;l+e9$Vo4g-(Jkze4b$PJKlN*1ODU+|_x(HI*BvNs7SWU@8dI*17WvDdVwASya@Y@};=R!p;K} zogA_DCOYu~4Pe-mL!De)Jn+StBu^PN2AhI~4J&cl&*w6DXCsheiE z*CAk>F!xZ5H{8btQzZ zu;0XDQqV88FGI@-SM)1pgxdo@n!X6S9SE4@){gkrqZ0iC7(=7tq0+jdJ)~0s*NCmy zuvf#y%$hN(+R^UIwxjXh`(L8TL0RmsK=_@xERpAOkzZ5+9xyZ_3#o_HmOIT$f{IEq z#eVoX{Jbmw!#q!tc1yL*lRjMF&nrxRef+CS1JR?;+aH#gCKIbUVk#jf+C_z*x_Wx5 z2{Iq}B$$7=9;2*l0L@I z?qQQwFHn2DnchMXHrz}ebW8p^nVYHdZX&{gIfl*qN*aZ&pY2)&s_>^< z0ekns>Rt6H5AHmL%8AKkZB+lJK(#vu5gcz&!K=CvMfvo}n@lS+ zk2)~fLNdMqf(VE2&z^V1{F>L^|7;uy4gWOpQv@b~6Fi-hr0F>sucxfAviaZgpgIr5 zE$Hx?*K!vrL0l;!m?j)%+rzYWzD`6~Sn%@mV~0k~S%ocXD#-YV@S$xN&pWgeW_C4E zi2a}lpFg=*oKM#G`%d7dMXuBQD-7k=rbGqKroKka|F8er{@i|Ob+0ogXo>7yJjUSv z2P;sgsQizytpBUOK|ets2+X+O7g6H^S6*L|Y#{xkKUa&G>UxO*hGWNa6wHO#*%&|O zhfO|oQm*@fu7$w#{X(s=t~iinXr&*oWY8X$cI`%!bQF+TECr2F;!)QF8w}^S z6OioIgxh!GT`sU3z?=0?{}=N_bt#;B`Uv6{G+3nkl-R>J9lp@@4rp_=6Fc)PZ&aE3zry?{QbKCLMXnD#q~R z%YC;c|Gxcg_`QH=yfTm`n7BHfnoBzymH0`{3) z)1JAMRRFtC&tI*2X?DORz!}u`Y7qwI)?bL+>MwAR0i2qIwn*}3G&7!2{dk%oIyyQq zu56O5kV}38I9YL;?cLaR>W7PmQ@NKSXxE&iTIgz25I!FI+Ht&t7}&wO8EF^W4w9qBPZ&iSE$d0RVvLnTmoI0APTJkR?1E z@MCmrd>#Da*zc8|hk~X18#h}Q4_jv^0PxA^NE>uo;V11JT;nP}tE-ECv7L#T_PXdb z$sRXLS6x(C6i=69YVG3FkURMcmm_LniL%K4J`usQ=Wc(3WKh0-<|Km}9Su=m5Ilwz zyG1`gBD|96YAgu!`{>^6J|KeD=e;-Q_F8tBzvue0PgvN?p+iByKhDlNe6c_;%3Lxr zLwF!b^WDo9mg2SyY`jX+*X9D%uJQi$*q9v8ct6!$!Aeg^q4x#$N(_}NvpeEgcn)MS z@cnlu{8uv$3d*xWAvmwchCg~?+_5Xn72x5_c5}wzkb|W73z}V<&GM*+9KCa_HM?%E zz<(sWI2Eds@6b{l(T7j zZf(=n;Z0Qb?5S8z8&eJ^~JSR1C7x_DuWlGXGgvpclbU4bekJ@^Fn;Q}KT0L+;Rk>1ox3u<|$XoH& zu2<_nec;&9g>)*1?V_-`@$SXWOo6@(+>r&8weYD%hbYTw9IeD>u(RrSH zA%cwCkkvSh^_l-f98y;n>?jU9rC^ZrBaCN}!c|UW3dN+^YLE`GnebcbWGK;Oyr-kQ zSi8HRl$9Of-!h<-sW>|8l`PPk|4`bE@?@ zSMOB!)ztY^DXXZnq#--xxBrr}r15Y6eVX+C!(_@d)pnwNL=u1R&B+gD-Z}ta0iG$y zz4FQU`z6qaVtpLlLeOq=R{*9GEr*SyiB)|{&aG&tMA5DBA%{c{Pp|j`R!16^9k#Z> zMP%s1dl#xy%SjK(Qj~3qg|pz{TKPiUV`(bIFx7UmP%M=k+tAA!0sp~)zJb5DzkjU; zHtWx3=0ExGAM`mq-kjT<u9>^}D~GRSn4?x@R&nCFls#gZdc zIAz6!fhAZN@WcS{9BWy&8*+P&hbvDEfah|eq;A0N`S0LF%zthn4rKstD|KO618%Db z#oV?$$G<(Q=%>^*YNh8wFZdsP5@%-~)%byRrxAW1{L((KM$44%C`aR;O3B`T613iV zSnD(|PJrO3ii&dQ zy02b|n#gQ-yv?Kdtr;Ul@hk=4pFZ6s>4n(X+Tz#MNe3bo_Lv9%AOo+?)@2-RWETep zVD3{DtJ)r3XX}uqsfstL83|fwnKmdUAiDYv?fD@{RY`i#W7_u>rfBW~+Mx76QCO?) z@|u?Uy6i8qh-4FBxDb@SFx@>Rag|)4hc#c-!CG3%P?7-iz66^Qn#G>V(sw0_61?{)@oN{$129`cg?(iRPFa&guA4xb3v`U@NJ&lJc8bNOmJ}3Pmm<#sy_RpAM zlLU1yCLSH`Op3@)k--qVlQEg;>FE_dM=LHxY=K|izJ0rO{IEd%i`}2gH7~E@3#2_d z{D=haz>q1-L*jfZcVbu2vGZ^dZSTlb~zk>MyAs-uh&gNK(B|82t1*n55Rl#tl?}%hg`(o1L-m0L*o@Gip{P^R#5`m)-JBEqQP{ zwfr}k&CeyNyDcXJ5~6xu55DQ5DaxA8=l~WT9wLC>Zj7@Rk-xU#);LK}RXtsa6PTg_ z{q+JFDy~xi^xb=m3zv5`&1|HG1(Ly}{Ld7GFaU*3Rt;ocS%)*n%)^A2xk~1K)lHl5 zL%(1LVEB(@(XM|J@Yq2dB2U?s2jHYlTL(b09DZK1lCeLpku#mac+0~#!f|868V5{e z^Th$>sV&A;)xJhvv{3luF~=&id%N}>`1+9#A@k|bQxa^Wxs{HXT&i%lAE>jvSP0(_|&xE}`3XpMfa|^D7?#lAC`a$M6%uukilVd+sKlT0Cwv zVI3?%OsfV;Y{w%h{weK|^xL(OUbeYwbp+{f!gUuXYaGD;KZC{p9Be!PT&mr#n45K zaf`5CnK9&lnle@iHX)ZS*;mfEvnoO^@M_3GeZanPgUtHoZG<$oh# zy~}`N0qX6U;z?ySGJCre8Ecd>;lx7=FHG|P)pLVR+=o_uEayH%wFrC$50}2qQo5j} zS{PrP%McQZ0f6SKR}>yl5G1EKMvYICO`a>Mva0rvz4(Cz`%_~gBX}M5@akdURX15V zvDF2^CiZ@j(Q*TN4Nnh8@cIi>XByX>Sqx)>l@0~PLIDhL%r!ikj&e)@m^6h-Ed-qO z!_H@B3@Qitco9t|aL1ok!MZKYl;xTtSxo!9r(!@hL$Fc&YC}viY5$=NfhXq9^8Rn% z<}2pkWZht2{P*vjQZY%^@t#k09L;w;i?q7P46BC}hBxRFXAmsoxeV^D+!nUIV8$DT zu!Oij^OZP0>F;kfb?cza9|Bi;x@KplW7&HJyodK~F{}<1-`O7j;;L0_YmL0WI#^Q~ z?-F)$9S70S7OZk z;Bo*%&UK%T(o(IrA?ziVREnB{D@r3|^R4*6DZP``b^f~kTeyn-Cq=Tc*t#SS1#cG& z*iffwyY;`WXxdLx|HmyA`&hTnn!k??Cv?0IQ}Lq?C4WGji!awXiL0gzgs_{XkZbN9 z)jbr8=UWq9`0)e~tV-dA&5*Q}ab)oSlKD)!hQfXJ?}As^U9W$IfOFlo@wF{rWkU|7 z)t6ch{iFXx?z8HUA>ZskeC=<1pEp%qLXh7V(4r9_C%ftKPiB@3ezBMbF7IE3Eci`( zc{Nh1!!~PkjTzwXl?SWeNn~S(8MS~Bof>0)4q5xmh1FGoyDW~Dv)Jw!RcG5$(oF1- z+lwk!l!bev{sEFo7VY~VlM%CC{ed9lw;)?n|#;SIEUQaqU$NVQyr$0PaJcKB-b@v+s{m`@)a^GY70 zM&doS+P)EX*>9}Bp%7%e3pY~kI(!9xLg{=yZryfKMMytu`u(TIfeJ*PUN}~xx4hye zg&X61n~_V_hWtk*(`?xUhwSaubj>e_c9%wjOyCPUHlA2LBcODrE2SQ?<}aCVkl8Qu zf-P0k@FJWLdiw8=-rnTp1SUIQ-^bU>a$f-aw#15B>c?ki@|_DN-BanfJh;zqLHK`l z0slvs`;TFu`TCDlVTrtmVEe!JIRE2uY%I0Q>e97#Y|iJtG+_(?xyp+8MataIx~roG zg74qIUvG~VY@=qeCcn13_v(Q79+j6S7PQXDFb_@dcC1T|s3q%GS8f!8tN{utcPCr< zI+E)q-CKJ1-CfykZ?AaMHI%DNQjZpfS92Ws*l|goFRGm{;=DK6xX5Q(TCkS#Ks(CX zT`xN-I0ktd-4HkZ7UPWC#XEEpmwe{xxqS58&dv^g>b?|II3p{>r zLhP{TbsbG;Rs}Xha0xYOCHeGRhFD+?;BRZ8(7^d?*gfA5g0LRG;B{9#Bf->Ut+Oc; zi!xkQp$$DY0uS`&S%bJ?6^GKI^1s3Z30VKKE5pSV+728E=l+56Wq}~jozlVu{W7Ad zvp&J!2YIs)vur2e$MSxDGlLJOGE3C%(tiQ7CXqL@gjX!CyaWdL>H*%acXMb_*8h}u za+=m+!rQ}h*?ab1-^)tPHI1d+LixR>zW;!7Q$kNn`8vZWXH&3taA=wvMDe}C(c`gx zqFV+;{2z|2i`P<*2wX){SDrm;pI`B^IxOM;=#|e7!myxvrgZ=L-YhlvwoezE13UKm zmJH4L_f(bJ-yc!;@)-VEEe(?oT`CRxf8VCF(0W85#wuT)c;al0vv}v7t*-cQs?|Zl z7F8@5t=x12iPd2~;^R8jR7yPm=tYFxO}gdZ6v>l5!O}!Bps6!+&-9@y2F;^~X6_aiC*Mh-uddoONw^;muvM{sSPi*a~bO#9kMcS$L} zLH6udvq_+TUM2*S3up>Y2NA(Hm5G1Ez$BWZBC)}69H0Mv{1&k~Kss|F`0+pC-;_e` zzh8;D0O3VajfBRIN2Z!$&Y0l!7l3^`a(@X6KoW@vqDGD%NtxwUH;%E>xCya4-D4bP z%mBCyc;;uW?R3HRC4M75tx0W)>kg|YH@nA3#-|QEwaX|$W~Avxef}&DuxbH)L%i+t z^@gKX;hp-bazs*ee|?HFfTB_G0_ce9dfU(R4T-986=o~HV{}d-H}j;EeNyGkGdBNO zSnvt&H;S>L?AG|&9{h4~A~@lmygKxMy#X`{wFd37pT&oaBgz_o1gGtfsw%7W=&fUY zOu<>IdnnCUc2|fR@HLeWz-6J?2~mZY922u_xx&r_gv1VgQtbZmOZ_KCk`VnjXEYKyHoq&uRBd=D%5SK^8PVE6BYAB|FS+K<q+1se+Qw=T1snhL6JY+Ojf2o-ja_UCDP zFyMWAT@1W#Wf?i(=g?wcBCS^-DbL(9BqrzpS-xOlJXrBmopa%z{k2qg`BGn5b`&xc zGxJ;I?L}_H|K@{Tc_vzyPFP=5TA@pVg9g1XulEnFFnohI@gqeM?*rB+c37nGzlaQv z+|)FVHs;KKvln^)H`IqsDGnHYWOsbmE_nN<)&K18vsE}g+d!lt?$Ut7!P@Sw@>R31 z{3zZnZ?eVouBMCMJw_c5dyIDScj8 zp?;N?yN}30TddG{ck&D1K8L-s39i+(^>O_lT?RKoLSfxkT2nf@OEs^ONi)i9cv5U} zeqZV+t_O4_Fb`I4CC@b5WMImX9z8RX0NAjHZBr)4C~$0^eM!^{rp30bzxTfWFaLwS zLxOl?ud#{Vcr34GU*8mP8TK+lNmYrrP@7H;C0!g>c5n0N1u2QUJ~4j6O3D zuYvZV?5CCp#a{gGzPYe^jM~MEhBveLW}T+jSDc65cV9d=qOLxc$Edh(hvh}+&XTi@RX)~H=52Y0elCbZRtXABhovhGRZ&{{?J2@clv^vd9veNFzHl+?<>!Ey5E&mT!3mO<<; zyK;PcjpHo5rZNyqu3dWGi~?o``_%eV9D{`pI`J^fj3GZM$|iUGcx=ioADLUDcC<>6^bv0uKXxt1^6lG0T3Xur9%4rE4}5%l1-X66}h(ZPPueQAX zbJuu%veY7z{&St~eVAa(2Lkv9l*c&7Kv&l$XfZS;!Oarq16?IbagSmh^`T#PLCmkk7#fltR` zTPWl23ZlFhd<#TZ*z=>w4?5bTtnaK(e2H?g?tLYQO6Jg@YD14uub$01N6hYZwnve( zql|g$x7bXO(N)rd2zPB!X^}7jQI3*5EHe8@V!%IgV|^Tg?YWhy%hkNOK7J_<|K3t* zuEAM&%BUOF*r-}D%HVG;mD|6Q(&v^wqVp>y5NO1U1*Q}WGi3Z}1yF?9#kvT({6LJ4 zUR4=@Z6<)OZcQVO{7MeCda`iyy5tGUV6w;cbwGRr0D=Za5P7vqFcTd;z2zc@#@E=+ zPNlyKO@?O=IXU4o)%I;8L-MvRAZ_@fMCR@dMf_?KW`Lj9ySg}{D@iCD->f=mMf4+V z7UEwRnya%qn9v~OfF;$16z!FV2}LiN-mqERSyIb%lDpry&oJtlr&2xjRAzM$^@w9BQ3;bXO7EUd#^$ia@Pl4 zPkgQV@>|f@)B&*synxqVQSG^jX)$uE(qvX4l&Vw9jn^$7cmMwVdTs3N!m_fivG3Xt zfL_>vKVMz&R9iG&rrD9c1{1c#ax`gj^|;3IDy6L5YtibkO64wD?r z13P48@ngp}5T8DnD=RSj_JbkHt`mwz-GE&1^Wh6`uK|V4zJu(|a~aPa3ckJ8vVdp3 zcC^sWz1l^lavr_;j*bpiXwlU{3-kFR6k2GJnw@WIXc)7xVf92rWOc^gv@@LOP5Z%L z%DqTzIhqb?h$hX86rBbgZqpN*MgQ(qHdq`+qz)F#tjM33$2(*^9@WrPsGBR-@p=W< z2T!)Gg9Ao++ZP|#3S%r;CK3HH0JPZ6ui{5hJp3G--y)+ z)kWVYXhfGgt7vKTxzBO#$`U7Hm&N1Eu!{4A147%r{F~Tsfe&C*nkiL(ote6b|KW?U|RlxO!K58YmjV6MQQet z!v_REtHUN@gN1~W#2^rJXy&`@zZbMTt9&;%v>{K8qv|n4P=}WH?Fg0NerJETf0ULI z>nNNV={0zjd~4MfJOd3q**v-JuK#>}5#06l_38GW1#^x#9+S=G>3022x|DxS_Q}hg zH{a+-3u-YB3zR{+98>E)0wMp_0kJdw^UC^FW;yi%bu$Ta10F4LlO+h55o`Fu)Glxl zt@G=3p(0SsfSm=>K4Q?zdosiLSJ6p;Vv*=KHpt`O^o&{F;W9MnJ@-n~04cH+O>cwEek{pa}7P8|?LS;YZnDuzpG0~t}<(oY8op~L}$FvM?q z!2!DrQCBvLzzv&56mqvdez5NpT@sq>Eb=R(411^IJGMh*&{^(p|2cb+7mlhcWuI7??DlGu-72K@IaxW;`L&tt@zzZgCW*$?!j!oi(8oIVV?FK;_BI7 z(>grP1f7YT=Ab7im)0(o=aSlguUdo9HlC_YH)pdi!HF<4BQkq|c}(R4_8+H7i^(-1 z5Kys%*T+fSTxOa{*sR`6L>hZ=eR)EJR#y!SA1mKwH41E~a54}YNx%+F>sqbQ`)!o> zWjT~8^X&uaca;mY!K)i5zn`>Wj3fagtY%g;nEk2H52dg9dVDd)_VLY1vI+gl?s46n zkhynifcKsl8tsZ2u77}II8obp{pLejZx`4cSJb0>PKr($M3bZGyG&wk_ez`2W+L0r zJ%_$^q4oiL6C8L&QM(d>Xn_RS(5QdZgCPEf&E89CC4++Q@BlJL$YHKK$R zF><~}RDAgR4%5DHT590|Q!xV5N3>Ac#n@n-bAcqfw^n)jMN%2pK2N$Xao^EGH#Cji z`_G5p6KB=e&vcl8>$vUxeYN(+7LQCv4i(Z+)|D9uo?g_TvCXyue7gIr42M&n_@nuT z2mDdJIpUs-6|14F${R|#qL<>3tMdcu%`aeBY;`^vU*7T_w7fpY_Qrq3?dY(o`OjjFD&?vb=WkfNzGUJSUPC<82+I~&syA%3N5-V9>bct-@_nw7(cQz zPdmbeVH4OX_74p7CZ_3f4WN`svB>aU=kfW?cz{|&B}BElIGmO@o_p=h{Dt6kGPb@1 z*GvAsCu0?lB~y*HtvN0}+w{pQk}A}4lrjRYJTQW5H7Y|XruuIWlxrN^o}^+@F+fhf zy{P%@gs@drt@ z@|2t$HVR5gMdMoVVCOUF20hOZB_rohr)c3Osy@APAC!s!c~u<1Wx;n7`@>6dk`X_q zz|)u00wCmB8Do%vR2r#3+x~n*n{+DAYx*C=O=>fDLq~0FY~X?C^VA+P!0Gm=GRUNQhM4$W0ewv#zdMd88 zw88CG)SH{WdoOT=L>G;^IuOYd^4xiK=~sZ9MY-*(YdCH`9ru=+L8k`u#B2F#x^#H5e`AzQq$ z$sTv#f@O8)2kPD);|2V5CE@*4{6(w$F~*Y54#lF-j5ye-^Y3?YLwVm=G6Pab9eHFP zGgom(*^|@kSQ+4L0ft}@w(-Z_Dk%npzRAV|K&42m zq~L`Cv0NQk#%Go2(!1yE`%_|ISR0!mdOT$zV;}fDoh%Hs+t6-OJK_e0)HbIV5B}xUYWs79-F%bc(UjD60~L#!^sDe zY#)zsIWb5HLOlSj03Nt-x&h2zo**1n5i_7(J?kD*S1GFe)(`CT=pb7-=Q4Ci)=kJoJ9p#X-`hy9(Jy5!5`&nU1wLd7 zqM@@$bnjQGI`ekCYs-YQ0DuBgo|#Anqiv3Wmb}mwl`vj(sy{&((n5yB2-8?BsCZV( zy143EMe_OGF;J!N)$*i)Gx8D0VbJoGSu(_>zIk5Z3JHo6eu!6>4U6y3mdn+=a7<$1 zz5>Q(8vD4mlY>ON_NFV9g{z(GJm((i6WTbwPO%dMU*^aUom;{@0_hGK)6K3BGI-tw zHkQ19ml?DTe&_p))#6}R%U%5G?v~Zk(i+>z!h_v}#sdngk5pu=qRtRtHZkWVZX5;+ zo|r>^v(1>O1aE}C#YXxfz2nh)aN6}?s(d;fCsoUZS-S)Ti-=z`%U&+dU<|{lg z?t!QpNfWWU5yObycp(~0>3rJRh|l4&(hki=R!m<_Jheycy1)Jvj#`qs zto~*~zn$EijCg||zj{$0;xNDNK4(&%zA4Wr${Uf;ju)OwvY@;0+BPAG@#^j+f?W3L zcmPu!ne2nP{a{W`O>d0Q!0#&pw3pfJkcoT%ga&&aZ8p3Renzl5dgn$mvHi(snTgqy zlmfHUWCo~^BiwMn$JAs)R-77tOxc;pUz*ne4t2_)?tw44b7@Sjx6 zS2uxF3IXa$E|eFg@CShnWsBQLb@a_%cy*8|^v1KTq`oJ_fug?hrRHXs1cziUsXcOp z%DM1F;Hl|e!0C=R?gt)pFlOb^5Rq7685;X@diwCxROH_eZHF~P3SK?t49{+8L67>S zK|Ni5ex)J@%d2}ZHb8v3&XqmfB6o@{+RHxj^x5Jc%(1U+Y*_5gROg^p%5X6bqmc|=g4=%p!Q}6Qlyb7{nD1K8C5^T8ebhU?HxYOqup@&snxo3QvF8H z=Em@uaVt-^>tuG7M@`wfX#yDg&UcB3h};hKr%#_adA<4+aBfcOmd!fT*5ou?CJizeOCeF%3^+%GG2qn`-XUy(Bi=uQ9=Wc@ ziRAqHMSDxjK8OQtotA5UHAuE!|nLcEXO%8I!G zAz7bs<5u1!{4>+CyTehmJ8Z#WO`neF#XSnGrso^H+2@x1^A4V?s;a(S+`Xe-s04gi zPkp4H<98iN#{P;OX!1wv=s1BS>Vz0jEsVZM+M1QB2JH_BA&AG8$4iB_TwTA<4;Gm< zhz{5!w*;gI>DrF4%WIr9n=0sKksl*`|+uPf~b<<69aX>dfbeiviA{X^FCtGK%h235zM;-4J(47j^8 zTy!e&jf_^hZjtg+OIr2cH2|d`{kPMDBb8ae0&8S+bhrfy?E{B$PN>o5nx4L?S$y`@ z7pvQV4;2jp`wC&nr?aZ?-;kY{jZpf#-u2C+&%Uo*FnBY9)pn@Bi}ioE%dV$6C?0XF zwtE8*9yIvGojY!?+|h)f;lh#&W%)Qvpc5bWC1DIt+;}mnYTe(+rI#H7GuztSr}VoR zyh$tP;Z}&Wo9vutbi?P%uA^G@O`j-Ww1-sxME6P}`r~zu-v5^gREQOPqr^)BL@+f{ zyhClS!n`|U_;xb8-u=t0MY89SLsC9`h$M&5hCRRlEyDj!zBzOoHh=++G6e-iWahh) z0h;J?3CLG*PgUV3dDeqpUo!5?A@dI228L|yQ&3Y!NL_2H`ud99INOnWVP%1749!#d zCwqCIpzc{FO9q&hZt&WBoZmd0t9$~8Vc2Qjfw8Q_in(tb@}^zucb-VliGScEiHBHNh)*pydMTtL4U%fwm-eWdHybF>vr8=kcca zC^NqqtnSglQxd6m(1F6bI@`#;SAA^29a8Y%h)%o@`? zev2nAAprqE7JdrMn2#Z7hbK7dNkBTU@yXcY#KZ$SXQAA|3=jy{r?RNI4_!46}TbxEtdiH(`E#Jcytrh6ho zlw1P&K&CZy0g4*dcabW`xy~iISn#d8*Amy|{`Edm&}!{CF0M?;7j|7=1X%nsS zgWcVUdv6fFO(vi@>FJSRoX-V{4Ps^aLXK$hmT-*M`zJMqr`ZvF0CBogDE2BecVI+k ztMZE3VD=6Ny!#;Y>sQBm@}3OSn!azs8)#H-8sBCDvkb9Z3mGmk0~|4FnxG+li3Pa) zxu3SwFS6L4$odon6JkJgGsFG4Copy@AubL8&z?O?-65Y(1G)d^Z{KiWi-nUD6BviJ z8`|319mi^^kMIpl!7}ig@NgUek00gh>l?3uxfKoMy>gXgd890AuXDJL*Md~li|5ae zUPU}oE{q6&Xm$N~*{daCM9cGLL<{W}X|gF+DY9{_L7}#^7JpTl}$tT^1+T#VH#WWh7tFe)-Q1mSp6_vr}!X++eVy&MK4}!uF zTSk-N?W$C1?qOJ4!u3 z#_56SqI;B7gB6yF79urh`2-jQhMyJubaOhtdVIs+{rws8bcc(O_O~;A8Airo$(_^%t!@aYse2P+gCsHXr0niVgf# z0^jOBT_6{uaE4lArOhxKFcS~3c;lS1NTt%EunDNLloOb87G8+VQ!Ib#l95CE=kqL% z76i+^3*7^~Z_(9Qiw~whDLXP_$rpCJSOo>i-{C+ai1C#~M^fvm)=3Ck;lb0uf^uM> zl+&+#8bR@ghZb5%hbE?P>x0U7Cr6k?`ROA_ddpbnRA4RZgRyARBV;$b>KmU`UX`6Ffg}BmEUWW7P3-W*@U;|I|&tVy(M5>0W3TZA2 zIKa0f+weQqk3Y9`9WO60ubZ&mB#$R3tv4)!$xr2*GS)UG+-*T?_54)B$VcEi9%!g+ z96q2|3knKy|79)PKMUPjvZ34v8Ed<$`}>2JNM;nteBwKe_d#U$Zw|{q|5BKk`3yr8 z$YNSv3)PR1*_Lu?z+Ro4n~PmpLwsCJj9I6x20yrW20@e8-g5Y03wHrMGBTdiJb^gB zIH%V;>QsBY=YqrvEiw)IqtkaY*(K@%*w~U~0C1nKSE(mybm-#ZA*9tjlna!ZftkCm zfiDuTuK=S!#Q5#fZC@?k!r~l9ul(Q}+RZQ#MfacZj3;25)S>*Ei;4*Fn-BURAj2X{ z4Nwu7#mjoDLyB)Z33y8^i%VLAscB@?XZ`kVR$UzpOy(SY*hZ4>*4$TN77p!*ro1>E z)nLp-<33>kGp-``sfUNNmDVJ{(oq+4T7RgpMLQk<2mJ&7+*}NIbO(3rA!NQO_l9u+ zgBi8FL%&V);PmV)Jn$yX<1!cvL(FJWl4F2`^9(*|R~;FBDkp(fszQXg$kjJ?4mIFA}Un zX}u{CqreG)K0IBMPdr6!A5nbw0x@7AA#MEOX4hf6&S5S$bOwWdu{ zoA6Cg(~fvIOn(K_#w5~y3PiOHLJl{@#pB&Qch4@rB%Kg$t3lB#NLR8s=+mE&DJen? zwH8Ya0$%j``o;diqW%vOyiRYB5BTBh&4rJTpZYxV-uS`J&hJos^0!yhXU~!!=!>&z zb8>JR5VHV(=YElc{ZV%|V}JjtS=?@As+eG3N=gab`WX0 zh%*k*_eoIso3hO#TqDr10+EdKdQ;kb;OYTWhH2yGp}yqmz#;vB%4xOIBdpb-cWFKG zaSDrdN9S#Rv+1trOJ!@?36a%v>q$-BC1S70hw3dsT(|T3XtfJdi$n{|rFOVk<$hbV zR$vY|Ls_Tpa>qHBPl8tk{7!A=hcR-Ig!#N}cLLXapMT_+LkKy|iK=;2pVB66rKP1c zZ1jD4cYN%|0JY?#ZE`AJqev3z3jj2Ucu3^ZJCbsjW%(yU zLJ$Clgz3>l*N!Pjo&q* ztcw|H6riFK2L)pu%^lDMJF!D@FKqEJbundO8lY|UOvSa9!4BA&uqLOg5bxoerkg;h zMfCQkyU5ozkLi_fMZLTM5wF|tM+1{yuA!;jBYj4t)0pJR-T_9yZ4NvB7YfWMgU=oE zyy@{o^ zAtfcdv5^5BGb$n>c5uJM=(iVbhs$lAP2h|Uuc~@-woEM4__{*M~DcoS%h96zXWq)4Gnyg`DKkkfZo@aG2W|dNXVJY zD#sL}i+k^CHp$1yV(b*$H}SBy+SI*YNJT|ObKWThb#uPR7nHigU2FJfqQnr=eZ>fr z8|i-MYuZpbMdSehYjI|P=g*6#Kx>Iob@kMg>FEXDD<`izu=GDi-8f6wlDj#JlWh)x z;}ozb7yuqlH)k*j+|YxW8zkR;YR86+VCU{dgdq?taR3k^XpZGQyFu=d!36HR zb*Ud9FhjHjzP(LQ2l*gqs2!HNaFy}G)BAgm?<&J1GI!yM28rJ3b6bt_L#ss8yJYMVS_6l#PPzjTTFUn=C zrX#%6)zvrh%?EdO>?)`|{QSgCo_)$`}gfFlFPBWlLr~__N&uv0s?{*WU1*EB=hTn z!xj=^?j`PpHYO<^X22;N8w}i3T0p>wE8`sUjW^9M0EEZ|!H+_ofd3=NdhT##mD zS9;>ryGs&QB@$S!t|Q^SUzJB)H;;rR&RX-Rr`o6G2=kOtA`LDB*V|=vSW8Slzq4K} zc`$_l?U)EQfTy&GX9ey&;79806nz6|95}T>1`l~Y$-MK1d_`qf^Bd(U3*oz%=je@e z>_AIBQQZ~{%~<|mXB(e9d2DFv$7ERR)Dh1pQU0cj z*j3`nDWx>E`Is`kd6)wJf$Pr-0RU#47{NGELWNgd$<5VG*0)j{(CAyc;P|?9!C_?} zGQ;*6Np}J?5}9Au1W-xGUWADbT;4htjIA|A8lh~(i8yQYqCz!WFMNYJW(9 zE>uYw`$4Lzb(^3##RviV8sb2u@GD;6rUh2=GApyC8-hd+ zne=d9UnQQN*@774u|6rgA=Blq^Xx@(7xC)WaIUDEg38mevBvKP!h8pQ02~In87?!G z$(Z+M3G#4KRUjd3K+smvWinT8uGA)jpe*Pi}E^4p8hX8;>sFIu_zDbO8(tvOZ#q=@XNb- zr0NG^fb=5?F03r@V16FL@6H?4Fl<1O_4B7z#vMJovHaUf3&3={;<14bwY9xH(#PHG zknl_}5GMB!g2!I3^VSt9Bt(?BJ&@d5v;SRbRPb}1vh;``U#8;KRG$)EIcdqyb>=^+ z4vv>h)N`bh*rFbsRn4C!`L>Eo(LE`ZuAeln9)F1G9e!wtTBd{ksQ~vK!XYf&+;z>z zNcLZ7@&m&?gQL!CSUI;~73D_=PzWb<6|)dTyqkyattYPYpj~w3`)D#Yj(sF0c`4j> znS=aj+W43_>GbY@`h;S*#?55vTu-|bsNRgS0Q1Iz0mNRrMRG+)_;aWU!}(4Z+7}R& zuA53S;C7T#A^bwviQvA#GDy5IJp*qg;++=;7LdTP_*(x^JT&4n|Fv>=|3t3|ip%+i z$5fC?=H;kvy2(e!ZCJ$AY8i52L*;#yi-LIjEEvinzE$NeOE zB|s%2QcfGtx)vMOWULQ;Y$X{mj&L4&y+F9icT2nMYHc0bOd=`=;=xU3Tn=IFLwX>S zAq~kcKSu4!p?e})&CD-uTZu&a&3W{e9i7j6$|d}=drK_bbj;yO@jD@a=fXw)5EOpQ zGYd01ms8w2qabk{Vmtb6`^QOsnu+|gXZRx{BTuveH0r#i^`voi6kufs2$zGA;s9SL zmHtx0;p2k!qEaXg95P0^R@hvbHr;7DWbGL~BC>dahrHxvrRLc>Ofbns5`T2QzVSpJ zRMZ50Q=Dv>yMG`0AG4)>4q0YqX4pzixAhW_&cS@S zTszAnhk@h67-~MRia+7<;9hMDY6;%C!-jceXr-n&1Q;3`g0gUC>Kvl6%O?C{?R zkP{2vG5Gm5%BK(10JeklN3;eEO5&afLG$3 zTmD9;SdUda_wB`c=sdXRDsn&W@jZIp56<@^r$V(rF1Q;E%Ryo8w=oeg5(2jt!9exk zZGIIXwYkWbDyQZ(vMDUhS4)e|)DK+4BUNy?P4$Q}@U-y>A>B6zgkBY#>TM7vvdfZI zU?afoz_{9A_^bBx#?jF+=SW8onZ2QDJzA&gi`*`N;Kj?Tsz%oZo^B1VVUdQ$-DYYT z)C~>OZ9X=cl>J!Nc=1B<>C<^!99t2FSU)@Q-Bc^!*pRc%uf5_?#H_0?wA7oecpnVxcA` zUzhP@DZ7pwfNzxCKT}dlR!)u|EQhqdJ6vyl`oq%BPPmt;@Gp%JFO4Lgh|CjeU)weh zTFCA0>>cgf))Et3RvJkOj`fj=x~)ZS5f;+=2z?w*n<$v5g>zz)5<)>;=4*y7?p#0% zH+VU`*(P}AUDY=$ciCT!jn95k>6$Fu>vyw|dT|B&`8t4~T^5vZI0nuaLGEG=OX*kH zkb&`kXcz&t#q#ek8<5;JG^BTPckiG!d|8s6EjOv=2XfV|A=o}k!MF-ix#dGLPi?of zDTX0u4>iSfqI9?)f)N?WkS8}`{%%WY3P~ZiwUd7_D&4Q?SUbtblfRqL3hFa%$8Vw{ zf!5Mef#v>vMTZW0xtSI3Uq(J)=J2hb(jRd9a`7e*g8_srN4)ii`}#5#=uHt2u^Lir zsw({=1d(nc5AQsE`bNXB9|$c@Df{Hg*Pe^{MsPrL%Gz5w3kqL!M0ne-d< zq_qL_4{G9YdGO#E1pGd?U!j1~>wwLx2XK#tSO-ZBubGQHOS-ODM|83T+<*ZJu|J3N zL;HX-=1}XevD!P^6O1$Y5@IWsN$+Rxk9Desyi!^@I9HmQ3;)7sSA_~bQaDQ#Jbmg; z746FYE9%t5jtIz}@P`|-B^MSR^22di+1NCKw5E*xu&kMD9iiu@sF>IlW8>q0d5BDT z#^k4D82a1<&|Z;QA$?f9+S>TfpS#ttncOApg>2?T0mWl>4G*5O-{frgfi2&)9wm2~ z3NqVe)&;_z|J<^j__*k3!?sHS*BPwvMT?0P^0)OGl40rd9 z7}T(MOeD;E>`n&3SPnJ=NDr~xJc|WN&f>@4B2I>ZRh3hqPQ)~tJPkh~(2fSHqfqT| zc*8D^eV!F(SqB*9&lCp2LB@ODyQk*~U}S%AG5isljG;oiNN=xbQF zoantfW@Z-HaYc^}^83?OYnkMGq&HJ9)^$7XlKt_&;rhtXc*IODWhAkBT2UxdEbYah z(>)_2c4Xjz0g1Wo+8|pp%&L6!H^?x-0}rq-&HoZ;1UIkr7D8P7=JR0k(H;?BIp3y( zekZTVXAnk|rG5{4GWoy1ijGEOJ-l4DA}LCD>L#_i``pFCOYacAKt~q`FtNVq?IBC& z)|2iN5lSmj%hfAi7iG7G-OIz0kY4lY!5wCtUL3T~(aO)uv9ES2uyixHv}y-X;U!|) zB^EPIIQQAuM6wrG?T*3wF@)2L`1Tle%L~9nCw8fPbia_0fIH#MI*vHjIA`v`XM^=% z!zvI%rwOcze3;?^K{8&;#I6@N);D|nfq92`#j)(GdTf5@eZS(Wjj z*tML0xYZ-v_}JYj_9l@n^Wdd+Bp6_TfGYyP%Wk|z@f714pqRrvQM2VqMx3qaKu*p< z%uJurNK5Py2bMk3ZIzv0Gn?YyUYXPhz!RQN26;xFu3cdLHF*!W!kemUc~amEsm^`X ze4UY{sR+QOW~0K%2hZ^IQOD?eWNzsAEJYH9g@*> zG122LXN1OR6!GLn{lL^z#$uwrfqIGHmQg+(brI|Id;xhKC*?axCYgM39E4?+DKf9P z`0CWuxtEDNJG^^zm37W3TZO3M0nSf*fAu=`I#=r+i7Kr1A+k|vl_esjbQYe+sg^Zb zdyENr!&aZC~vocE&SvO#-x9~gT;iMND55ednp#XclxzW~a;;{}g#6F=u}yc{!Gr@ZLq zY=Dz3({9>!xScLP|Bf!ojqZKw(xLDCp^tDf^-Rwp!}~8db05WHjTOs?;emd=Jv~kYyx{1_(5nw2zJL;^;k&OY zcy5Sxs8+*)9DP16iS86jsy9&Z(?O!r(gUXK79iga5%QT7e0H6j<X$j<4 zuuiPEK=5vd*)XQw`c$1j&L z6FIrxnEJ2_IYq!F1QPcBFth%@BKggY4Vj_X0n7HC8~V_Xr>L#dW(O5SM3@y771z9K zv$C_hO%HTQ{l1#<^1R7>Q>-s`x%{;G(76+rp51R2w8+3ZPB{G>q_UawEAV$BkdrsG z72;MGF3$s5P^1R#>;V%lhRItWc_3(LXbAFqb3*>n?2ivzecr3JJE0K)1L7|1;hNK& zERtdo(@`-off*UX9?FT(W5=hyUO%uZ4jkyQ{^bkw`!LYKcVFfKQ*)w&{1oZrq+p{Jn)gF+xj!u_71JGrZ zEeP!w^E&pE3u3TL&d9hXJLUDTRVIz|RK@{xP51C{%c2||=qKa-wXpu@?rNRlesq2m zchcgTAK^N}^q=*zEXnenV7Pu(s2I6!v(aq!P!HKh-~I?&BW ztN#1X1S1^=Wf|PlFHubH0igLpq>!}ZyJw0;i5b3X;9!F~APW5VM<{rFm@iaX6D*6n z5YXdpsOZfoF4FVc|8s`#=M=V{)j!1a^p5@t5_Kfsafec2f?FZ&*J(tlz8(Vka~GyVE=Hy+Pp` zvI$c7LtO43s6S71qfv(P0TNcYhFhWSUn-TP-_7}v^|lUquU0@AJHWGX=JV&z&9NIZ z<|bs9@48kX4d;FB-QOFpbrZKT2YS~HhwkB2xb_FK@)FR|5%iX!Q!_M-*}Z!@QRC2G z(GlUXF1GYN0U#y&8w$-sA2(p2skK!UQd=Rzd8m)GhzGOG(SL?l# z6Z0=HqA%aKGSnf8K`z~;^l}=@8=6As?``()6Xi7^%D@15FZIq)6#Dq| zp(Nz_BcmHzyZHC)h@akv=MD6}2k~fAVc0QomPA*Ns3j!`aO$_n@gL;4t*x!6#0S@8 zd*lny4kVC_7w0(DySQ@|ZGu6FuW#VzZ(4XwcYJylhN5VxE9~~8Dt^>y<)C%eX>A0p z`1b4=73WhhNJh>!W~urvy16R;7BaWaX>0XYb-N*j(H%FCPxydFf5B0B~Nod!cdm2+}6lmSTv#5x{X zWQB#3BaQytUCIYJy`dcBHdwcF13j`}+~fYS4iA-HlAFwHdc8&toNGw{*pJ}}M59bt zLaNaxzdQ3Q3ven#G-=66=J2H(BE^4ON}i?&$B(EQ8&XHNyX%K07jye|?0cp9ieKv< zyoQAnr^jM8Ca!2lQT4g2=G#DMO}KcV+8lLt^wLVawH03ZXgTWIR43g+^yLFLC?=$_P@4B% z=T!OrR>CsPun+#(lS`F|7czAldb&$=+{z&uiA1tx=`G00sCpH)zK83&JhJJRxJMhq zv08(Tn(EcZKRtJkey*mTb8uWz@b4b_lu9kY_DwfFL0f*Ivif$n_vx3_9q=BQNMrWC zRkeiH4O99^t@U(&xP_ygiNVURO4)7y4#>wC;(mP2l-=SR^@S(iHxi3MI_>y+Sa0DP z`;BrjOKq)F=I|&Q#dqZcP5&*5jBh^;@kLz!#y2wJ?9d6H9??&lY&_pqZ^SY&Dj~Sq z<{VF}z5xKl_A)y_Cv{#W*p`ZM_;gJK`kY4)SD{}ZInk;iRC-PlaI|42Qq6m9e3QA`o!!4P zkG0mZ$`*KSDRtU%W=X%N;#Y+yewOg8Q`&TWoca&)D}CaxLoLj~wtPMAo6z!0Wy$iW zka52F03IYNsDgXEv51znSRsslLl7sW@FHy&upfw?YQFGt<^|+7A`_WkH?6d!Le{&* ze}U05LwJJJFSXw!*C&PiDR>-6h^vlBL8~MCh?n)y%=1lpIoSEJ3K{R;7-vHpx;oqC z#+V&jp&r}@DnGAIXSI&^9(uD~uF~?EV25%hUmb!Hv#qS{HJcv51+y=*o;-OHv|5I)@;JGLj#hW2p$$(&#!$>)TW2#fm;{!3 zSIGtRN(fKR>(~Fx-&|ZI7YJpcZrX~M-&>V6Kt4dacdu%{-w_s}?EdCcf)yXy9rq>O zo?f>AF#3^5h0~o}jKO1N@p*PJ$l9~NO&Wme-X2RazpF^}o5&N#o$!m8?$scw!cMd1 zq;*oIc3IsO5oX&3%d_TE;z=JoJT-_mTa3MM_YTcBXh+87?+$}+?nTbW;?}AnQo2Lil+|2Q9T1RYA4*yn2+(m|e7d#JjTN)}YU7)77m}y=c&nHZKK ztvt9jo5k%%gP_xn>B2O!;NWx~QCRdLt_5&H_}D|`;J|_ZHiK^?rVhyfdOCn8^+#^h z&4ddLf=X?&b!=tHCWWDhH@<|z`}<9m=3$T^XX6uhAFTZ9X@K4vjom{b2(9kE6rPcIR|ziG zc@<~T$>>5t??H3^+qiD?Ums}%%)Koz4Yy{7AcIGwR%#CE_+hZ)r=0B=n-c4T>-pT z_^Q(Kk*Csl$yRf(+3}j{LNG5hZ-9FxVLo2Xg{Y*y-gKAh%crG*a>{&YCe#Nx#pF8R z*Q^($D@m&NDA~pmNwmcf4{9G@V?WmZM?P%p14w58tNMv==l27m>TLf!N=o3dAVhr_ zebDsYoVY0~tL3JdnaEQS7^Cr)^)a;`c%WnL+z<8bw+p#_ndt~Oybj(*`7HYowhXO5 zNHhk6LeF+yntezs2V;nop-ke;g#OzoGJE_~kfgoUx1isPCPd8bC4HfAJfKGl2QI1T zI8KB$F|W_NdmmUt`WPOO;#W9oI?V8ZZ33x7Yo_lU&&a`vxT@8Q`l0107wstfyH2A& zi}zO$6A&rsTfrGry&hEHb?lGmfLlU+M!8@S1;UVE)>G2};-7VXk)Hy;fB$BPY~@)i z^za@%O8uHYLa(cKKxONgq#m(h+NVV7WU4v`eojius77RJbknayaPm)2udBv zR~O>9Y@CBo>i@n)AO#{>AwmB`>W$GXJ31_2tEbO`P7Q2W9TJAX`@u{P|7k`!JQs?U z?u;EZ`1#f{DM3VWvn$s6eKMfu=QF{}>%~}8#zG&@Iyrgwb3II)&7XSviW}J2E5hi8 zGv5l?uc_VgeyIBVz%hY*hJW^$&qVB^?l7uJ-F`UfcD-wKG&?n1NZvi?k&<9U5%>K> zN7piL{QjZA@u^+A0bq$(F-y}HHrthd`1J_9V3_sj8&O%qb1~<>)*z%K+cC4VnaB}T zSp~X`VuShTg%OKCqt^TGlZ@miu}`ceRmQUS8ts)bX)H zq0P-_Fi3Z{R$BIZhrpYqrS8TT)#PY<6aPyzUm8a@X*(s;zj<|vzN>kIK2&KUYLA!u z(62l&3Zzhw?4seRkk*?w-G*f_R4W2ytR zmNv+ecTDAE)xk%t98El?WjNx9+{f)kpBB|9a3+_aUlLfl&ks;(cg8vq(t2*p$=O?& z4CEpXbUB;VH_Z07$aL%|>up{0+s5IqdLC6=d?-D z|A-5AxP9L`-Oph~VYh!OhhM9(lo`&>%X@!P`lmlTdCSt$lAZHE=7Jo8!yvR>>7(D{ zzjmK}yI;Yr6~B5KAE8%n|FZkh+i=eJ*wWI&fSy;kwif%xxrf1^kfh`=9ii&mnatVckFmi z(;92|#vG~wrGI+AUX9&@u~cERv{ewNHjpdsth|{&QWjzN;?K3tqGItoTq*1mBoh%q z%UP!P6^l+=^G~(MDvj5lhxX(q(L*`j??cREV`A7i>)jMzHCP-HD3I!8^#@h0E?n@R zBQSTZ7Q%Y;(3WdSC$|%FsJR2~H8y)f4h{zraIk93oY`dqGR+1-2Wfxi5%*fgAePJ0 zPopthwWh=%)##}noUMlRTclVbhT2Ax?{~!Fu@G2c6A>UTKWLse7;KOmBjn%`=d@9u z(m$3O!falr>4C~}l}}#vz+{whwB&|@g5M>nyIy=E>Y~KW&6g(}>Qitk+E`;$7J08% z4;ziHFFHZDfG)8*miT-P`=FHLyvhhKWvs(}>Gmucd3d=+pC^f@CGu+M4r=B*5p(j* zojx4-L95x*s|%5(2W~AI)BVB5^uJ2*E}u>uh)HFXtk3OyJeRl}tZTHLtxN6^9fhE~W?Am)R)VZO}b++cL;EC{E_PCDv4#KYB-g zE5D@=6}y&s)sbzwV7r>Z)>Q8SZP{12l3)`3GFPX^LubQFb}L`A`B#4GHkW)w z62$3i$1(F(`CszKaGO#msRRQpQlk63)7BZE?H&GeZw3gTiV@bj64cW4G~b^1`?4$c z?{`NQhS%UtL1{o4yRTy~n$=W$_d7}U%JI%p-GwBiD*D@p_P0lgx7b2AmA=Xbsz$$B zknH%@Pw0PbUZ`PZS-f+tpI#LGVJ@ArAq*1v?Zw12ygw1_JW>rt^q zqEe#UL(+VX1GE*sJxyM}>+=^2t8Lg%b8uBYs|f_H+pjOQv9+&U67XBTX@!;?(3MK; zF`xrJ0$Wbu$=^v4os{l6>-M^gdQRAQb+cWX55v7d&3($Ho!}y5ld6}jWz1=+`r=qN zmwe-0_kIy5?5CFq~FZ_fIH%Y zzQOwhZ@>dC-8?ZBd4@C_>3BV+xf@w0+-$mYuUK-@fy5U8(iOto(7?x1PPCgr2Q$>Hc8~C^Cb?>U1@Y zecJrGa_yBm2Kyb{Zzc9xWAEv^Bu##K;;MVZ+&EguOOEg@{pQP!u<5F;RV-Jn7h~7z zVZAn-J|-wV1y+=_rDmVUnlCwEVO@AiNR>V0e49CGF>T@Y&~2%Z0sW+j9%Rw7QhbC; zSWHZe-)_RRBI&Fdln&}$dc`;>wTWoC1*%-Rlo-c-226Sw9oo=CT*&ZnMl;vpZqJpVdwi^wG1bs} zQCHE~V}uQnOAM(DtijS-MX?Dp&&U_$r!OdOSH}Jv)F2gSiZM{ zJ?h%FDg|N5eA0Vkj1#f6-kav`Fb)ryJNJs^OGPHWmp?AFj7TJwtiS`=FRYKc!baB- z6`?n_1Gn!bQJ$~YtkB6E<#@+yTYBHZ`Rm2Erb<;F<1wcWFwy_~V?*A!L63sliz7w% ze*LkLz4Vz2j$?-QPe^7{DRzmnMH*q0Dee5FN_ulG4QB>XiIio!HQXwa&ku(}R6`u= z*{Z~#h8_!0Teu#H1>d;#I1oSF*z@DY{qSpt59jp^wf;)1?J{OtmkYj@{w_84tajRY z`p4gH(QP|?`*=Rul-L?Rk7rH+w%61yZB)F|3J;d@i{{eu-AD?*eC|Z&2xx89k!Ghn zM;M(pf>%-C?A>7T zRT@hw+U{SKN*qRAr#mF|7dsp6U;JP2EG=xu10_E``(G$M&ei`9Z1xdq^yN_paM?xf zBXkIC9QXhGLF$!%n_uEazt6UBo^>~PJ~L!FcfCWI@bviE|Ki#S;#nh@1TxX_*RO=o z(gu3xKQ3iF>W1at3vSALlW|%$b<|UjSPcHOUX9OEfxB950^?+Md`B%5|f=CdBsULufi1=twL( zX>+5JY;2AqDy1V`xRb5hZhegT`TnQ>kg4SHbCcx>cP6oFWfPs91Lg2!WINS!)2~K( zi)@UemerB{zK$dfQ^`ILuw9HYHmlFh^7sY*Hy6WUu%%d%bd5}N%|v>$Q@nk{|}VB#PL0u6&oh) zCrp-dtN*-Kt;REgWmo@WGzbg&iJ4v2v&RmT0H|kU;q}{NR^<*^KCReaM+wY|e7HQ~ zXtBbBb+UgR4co`Q95wBvF*P&`St`P>n!KI4y#sghWH|b6mbsL)XFJCE9Yw2#)ki)O zDttz8nYkQ%@*;DWVI)2?jFiA!A=18g^bo8y@hSU6QYeRa~vdv8Bd zTH62s7k(oDXqo%Px=-f~6}|4fT_fC3znFJf{KvT;7JUz#&!!xMZW|ki>cm}2DJ{Ks zsaa&Cyxyuv`&&=|4n{0nu9)`W({X1Q!EA5r+yCTjB;*&Msrhxo?c|RUR{&>^XP+>t zK8y^r(Q3(lj`xB91a_9p8OuH99tftbHcl6xJ$|e|INyDF&(n)*w|9L5fb|Y!An|m& z)c)(*-u7bPNR>pwg?#{SF67mwOTcUkL4J&wPOe%eKTzXo(i6a13z?(-L3fpj^Q#=x z_zx#EQ0eW~5%S}Y;=Vb>;a#n*v)3TI*l7i#nOPza3wCp(7p{iA%J>dg^J}aPF&ae* zXooQAWflNoR?d~BTU}vaTi6@~s4}&81Qely4wkKy%SDtPFqAeHVYvMJ>xnLRhJpz3 zrVlD_E9W}E+WeK#l9NT&2jB36=|YYI725PYmoW9Dn7-ycQ3SRLlu4e(wu`(6nhGjp z!Gf-1*drPFR!5mMIC;$DPWVk3wEq`S(~129sMT6tAiFRz@N;M?p?7sgkA|1TQpO+) z6nL7Dk(Ab>hQ$|!QjR5Se_jpDO>jDrVV}HX)aP8buKkIc1ljRcu$XH7R{%C_yhIol z>~B}o7uNr9e_z``3|EI6OBwDMxP#14SaqygDPzwK|IVfI?Bw1A?|sNu4>HDd)}KNg-`m=_%;V0Fr+Ivk z(*46byt70v8%ICq9;~$=AL`O(Hfjf5NwTL@=(BQ~K|@CC=Cs#BY}lO7n|ED|UH?ES z6CCMqQBe_i%G1mAhF9Uc5@)`h2@}51$UeZE`*n zse`2wu~xr2+FmwvoxJu~A~XzpO*f+SiHN(V?lX{)sGNFat(?xCJcv7SZF&|WD*dHc z5(a3M4basJucJEG4jUN)9~3dS6bad#9gJx|qP(@#X;FUvwwVcgNz3+E0EM<#UEfU< zWa(vH^?nj(R|CHDQ#uLJROFjQ>FC1PBf9R;N#y5gJaj&PLtH!{+Q&yzDp7ON%N$J6 z$Pp^I9ihV`dK;U(RURFv>wNW{M}V`ubznJLp?LWyWD@vLTIv1e(Y5B}iiG>K9@o|T zDNRrIu^dalUu&okGAd?%^mOFMo=V7^Ju7!GuVidyds1{XPZYQ4zJouGHEk1MdfiF& zbAcV5(tmi#Xgb#D_!`N|WbZea7cQ{AZh%Uvj=y>HthsduCc_cK6oxx%L7e9dKxVVo zpW0-+x1m%K9R`lwQ)fCZjd(J>Z%qjUtER;}1FHq>YDT7}c1rBtMl*lF0B=yrRieJd zTe3fUxGA1=ddlX^%3vXTkg&4ocXl?z`K9G&o#s}3CpgrFdwOW63tVkmUw4j*hg5iV zU)IobK;M4OtHwfEJc2ork)DL|4hLo~c*4@(IbFLNb-3%L2udj+#{8Yf>u_XP#@25H z@Jo@g`$(P>f$k%StT#!QvrX64`hL!5n@B?stg*iHn1|P%{cLE7u-V&(5UPl!HxCd= zg6BSc#?}UJ^OTbqf90sW+R-n*eY@}mA1|+?y{+xxU;b&z8{ceihwik_eNnPdr2R2c zZK*n!W`in=McRWHm$o#-o(~ktqNN1x*rlf{%NPQqn?UAaJ!`L&+Q)5O4XeL4!pOSo z``EH$9w+DXs`ANdCQ>TVjt&}hYdrQqKGg^_UgHD_ z)@$rR2RCeV0x0=8I+`BbpS12^u&QQAIyckfL}&E&xWr$I51Z?e$^aEE%Px1$y2Tv1 z8OI9|h@z41jRgQdCIZ@S-u>qn%HH~pTw?Y1xYR%U+*Q6#Hz5YT+}Hbwg$cwI8A$uz z03ra!j!aP%fg&zWzJL$_qRLTh(*E@k%RAz*Q-Ckj_TWz0=GaFFkJ(_r$l$-uMSvVIq>OnA;2>@VUv07n!F4Z5Xd;CaH7> zP=wt~Pm``i0E~2gIbiR*+!K#duKnO1oF3ST9T15QSI2&e;xt-j*x0yjm3L3Vz||Amodr@bO)3D=q`**3D;h&^trB!*Unmay74>H7$>m@4O`YL{t}-zE25ycICjK@N2}f z1tV_&X*gYooyd?r>A93rLhwNEQ%lQ-4VcZE#0dX`f-vBtOP(~n(EJxMo#Wb;PNp*( zUv1REGLdZ@(Ke($bK2h*2lC4Ij*bma;~vj>ra|hXwJv|=^9aWy(8RrQlKN{vAp#~* zQkmKA1P(ZJ7JDj*dMp))qgeO$)TqL3Rz$f8_agcpe_Tt45f7?t06Pp2*l!B8YOOkT z$gXkGu_i3l4F1(#$$8_d_RZ_xJ`GyQ^a~p(c`XZYU4QT; z0A(eY<9IV|b0O&b`SYRn#voPpwVcgbtZnx>4isRlaCQz}D&YLCe5M5#__FP7=&I2` z8NI@ZL$NXBF=#@oi0l4EuglLdkuDuFDh&pte5~1PYw4dATUXkWj{#zGUHr_ce_wJb z6ny|ht9)Ht;S>%G1=w-c@N&Gj3``J6?-=CT8e(QSw z&ikXcgJQ_5@pB)nX{ipCGn$~QnVeKF8ZZG=QcSH;w%@-=gz7hw z5ji>M+9I(Rkt-uFrFWL=k<_U@#RG}ODQ6yd3?hTx75w2l3x$5l?9TeAqVz5yK~g!M z>ykQOmmWHkFgJUhe1Jk?%$t>yGFJ?sfIs_w~q zPqho%@t6QlH7zD>^dST-_4MTYEXvnO@-*F994gF~i>q=Jqc^alq=p{Y@V=q1A3fFd z*1{0#FdjY=c{{Bf=P5uIq=Swe;hhH%PSkNg&~@4dptxnX#f@@l8ne`QBo-ME>87(_7-KTg%8Zhy1_v$F|Si7E37 zec{%oxC;LWV;Y@>4f(jVk3-93H0`~z`R*v2{`3IsMb!pkBWOB@lrYx-2Vut=B|kc< zm=ffF*9Ph(MJjaX{9<_k08*0e|{`Nq1>R;2eIF#`&FtfWC7 zcKWp|@S2CPO6ES!0V6>P>yNb_kq6%%y>O<_GU?)~@@2KT6)u@if#g&rSe=)JJgRKN z3)vg`#$&7A;fraVjshLV>Zn_7`toqck?DsIheHD&su5%+%c@|5zTn$(UhhOvT9F?P zYhu%y8XOhNLF#f5scO&)2LnW*dgZm>p2@{Pi*{W3<8MjjX}r+*&`U}5NQ6K2WUmrQ z9Er@uW3J=h1Y+%5!>g4X9KX&wj&LQNKVw1l#nfcyp!;4(XD=jeeCG$<9*pCieR@_@ zT711Qe_%2sl!diE;0paA+oLZlBH-NP;d0?>FCsNYi4G^B^$_OhM^ktHg^$s!qdqTA zKa##VZFc+PTlUvXY6!avT3Dch>fst)uSJBoJ==Q~@6hYf<4CqXtOecD>DGj*AFUhWa%Dnw`?@K3OPe|sT`rTNkp}RGk3nuCy zVu+a-3^iu?VwiLJCa9MeKR7(|*FFKx2B5){ZH&XB<^={^i zCOoG!R=mHi_HG4!FE;oWdz0rGw`xCI+;x%>$#l=uMTjk}o8<+;<9c=Q37fO)3#!8}U%fJT z_oi{hF|<=-r}+uFy6&L!8(tJCVY+HF?%ETfR7>RoIr-D`PT4rroW}~ef3zq#By3+G z>kp3RSh6U>*tNf8D;w-sf-;eh1uBg17afzDzUU61)ck+8kW7m@lDeJgj zx1h_4>WpfRGC-2b)D*P%Hmd7Y;P*@KV+SnmHfpwMJU4psR2WFUN6dOfLk5f{jqklh zq%t0Odq5P!8if-~G{Krj`uj7;$})UkJ=~d3Q+r@R(OrK}b`D{!bZYS5ZEAJ8Bqb0V zciegM6>Hkm=eO^jI&86G1&D)Ym4NNlyX7=bqvkq33=PxL_ak?#kM33YZo4;oPUtBN z+-bk?bq(;pbI7%zE!dV)D`18ltuMuOaqxuCy_cr9v$0Y4d=MgYX7Z&IcXBQJ1YxLT zH=~9>voldM?;%6S0i7MOwW^f);&myG{QhT=f}<9ED9JCyR)%jB6H|uN8I|G{QU3nZt@+UZtbp+dKD}$2)-B|vkF@|*jrCE zuhO9>rAdCRwyXKpZ>Zc=fx$bqtR$_i9lk?i<<$Gjcz-~zcfxtfkmSu)@&;hoW@#>a z?5W#HQs@S0z||4w-M6bBFOP`3t_Z+UyD3&yXb-vRGc$lS$)Z229iJHL#R14UQc{iR z*Krjfjt1<(1F`Unc>5jiBV|_)N?fl!yFPsIJ+z5B{pl^(CHSU}X7uExJ8gB?HaJ$3 z8#5Gu5R>E07-#*{WbD2{k}Z1f z-)U2&{J`F!&P8l8DQ|Jo+Jv$`gk;)Qam-P*s~lHnRLfWcU$w30>Fw z|5uDN;&4llZ=Y%P+oj;?)<#w>|D|_(s(02vDgt~2p(#{1*zV#^#XirAJ!?fQn-m$= zP+(o_CL>H99}r5e-l$#6kn=jkU2UeOzULf1Tzzam#5P7#x0q4jc^}lr(Iv$Ag zC+7N|T{jL7Dtb7scP2eWYm;Wz2PV-=k6Ry*?gWk;8n{1Mf)!KM=k9!N7n_RsQ|HY! z@6?YXEkBNOsr+q;wbm#^oxN-H~SNr=Q?{S)P+CHMyZ-u0S&r-DaT+KG)1R~lH+W`0`l;`6su zNtuYf$}{6RbLMvmtGgB_pVgG!wZcA~fAo`Pkl0C;!~D6vKaC!w5cDi~{U8BT#@jpH z2UFJbhJ`#3XW1DUb6xJ-S?@0|zt(*X&u=Q0C~vgi-#h2_yWX5}0)vaog_uS?=%=2I z3cX*7D_?3J;=!eiyiGGFVV;d~qGSnn~z&0-u{(ecKX5E_`On39E{HRnF4OZw>$C+7_ghb3GacEz+L1U>3 zowN4_a*3p^VdIqA(T+wFY_$i7PSA7fJobXuA?21w)+JtFxtQqx65YhU_2`0^ovct- z5f_t#+dsrHCo_T-O}+u`>ovF&H7XtV8R)12rvDvi{XcQn|I^f#-`9KC6ajyA7QHbe ziNWsLCOICt3L+|ZGXyx&WyM@%$5rcjE=*>7M@Qo;wH-sRthbI4Nf;#VDFvZOerG~U(vnzyPJLFwiovc+g}V9T z%a@zmI0Yro9<#JrgdhO^tuDp=&9dyQDqbG7A5n6Y+8JJTri(g^KEWicb*>I+HgIqv zFLScy+9LHQ-m3ZFvD95ud$xWS=VvotG`1*v<%FE84sCw;9He&ZR`{d1{(i&wf_!!3 z8yD(EE9jv$dsF_?)r{CKS#?Y$par0%t%IG($75Bd<+WfO_ZAr9*di~ zP(EM=-4u3P`tv_A0p9*-QukNHITbU)SFs&z*E4_@pJuB6ar{A%Zsw&5%}_T9w~yBc-cc%_7j&1v@iIG>&z`Y$=H}#Rtd^CRvvszH$I;chF%-TS&?R2QBUP)9 zTiTRWlL^e7oRAXgh4BT4AFE7Z=F%Z>t4$n&&1rh)GHmenJBiJ&zeZ$K(_FC^odalU zCI-C5>NB=SRSvTT&>`YVbzP2zI37VDf%PqgBZfakH8lO^n;rz6BJApsK?fGiij2SIJ ztWmlC?L@%9HoPgDo^#^OSCd-SS)L9QNjYnt8PxO9^>4;#^j_t;`kY~$(50afE|XXd}W%BsI21{;;@!l9-ocPw&aj*TyiXnY}xXC^{*fawHp6uP`xfHFTK4dPx(V-`;Zi(Z_U=u*SdPfu8K^B4By z(`!_K$gTf!ch>DnHuUj0_8WT={Vut3rnX50Hen0VD<7DXOBiw#s-%XB8~LSanU&AO zWvhuOz{qM|bJ3wqymukzF8O68-N`=L<;+lgPeP&rg4kYO*SK=es+*Sc2lSx!&GWfa zm|<7>XHtt1rH3!Nt(W^aik_;Mv3aT4v;_k&!XGP3CmELqBhh;@$ORq>I>@(K6EO z?98+<=>n&bKbw@ZkRJ$pY=&taR9f>cv~zH;noLb(?m9L=y8=mH&br(_hvTJ4QY)j-kKpLDa^#81X_bYIxmHAc%zolxF*Gc!Hc3cb`}<$0 z*dR6!s0c&57c<{uzyCNc#L@X1C_L>yAa?}!WnoI>BfZxf?id&ZjQ+W1SM`v|MMPEI z)RZ68`wiIHx_K z{S7e4oe-+^aO$L*Y049Ug42buv?`Ot*IJQNx5#P_@$(xOVW+-C_u5@bIVOCxQw$jh zgoXYa#oQ0I!Hme`Vgdy*9*qjVu*N`2QEr_RoB8&a+~P(6%xS6R3v?*d@tV-_78h6!8+ubq(#gC%e zwYyzLVSAhd*z(CaJ?()r65NoZqM7Z;e6#y%_C~xF&%Xy)OTH-#MWFk>3q^G`ZDH(p z_jtGkT-q4?v`#HF{-<5316}TYP!EnQP&Un_?KDB;R3THj)L#W?@%sITS!*aMDJh&7 z@HE$(1O3OHU^;V9;3dP60<`PoPUInO4&@a(K%lYx@u_U~C}8vDaS>G_*0#GxGe>J6J`il>9vv}Y=T;3)}>Kd33|Ccx$hmvr;77U}vo`V1j)+LEL@`&fc;gM3=ds8mU$hR@?!U1^%K|Uw=g1)a1{eD`3 zvZtU-3Jg5^E#%$K(wBp`TI!~JA-~E>h2|}eTgO1Qt8ZiE<^m`^uA!+JAfpQEr-EgG zpz^i`sPCdXU>Gn%nhUkaM^7ncV`?5T`T?^}r4hFTvFy_mtAC7P7C6K&ZSSS&C=y?5 zeg$3q9z||3wMbWzK!W6u~cf-UX-vTmys!=8}vQUTNyR4x>i zQ0+!ku)WL8!^7*YvAqLXn06>Mx3dm(YQ9(euyf{qR)@ z76LD=h7eD*&v~6mpQfqE9zYYFa%D=fT4*OAs{I61JPHn9=Y@U1y86)NB^=`F^9v}f zm+SXPH84IjRBEyz&kxYx|HuCrzzR!9R>zl^g(5na8AvP|i&Xtg8ySb+_Ki-s6wEy5 zOKfT?owKtu7s9Z7-7t%>jGuVySw(PY8j5@2_4EOEh`8t(?yY?9ymX?mh33Krx$nW04Rv| zq4Y%_#PF`8n8Kw__gag!9{7#;%L`L{xbc-|BL~!88Nj+0w+in|gsu*;_HzaIQxetD z78JlztYeDl_d5U-m-k->1u?a3ZF92{#yFvM=k?v$SB(8?uJr!x+gdE^9FgLXG-Y%P z@e)=)N3w5Pf2@MF4wmOva=W!&3ktokcG~9Ht~ofGWD~A@AiKJ{9#uS7xOioGmNxNv z3-9cU58kZonBe?IGGwe=+G0H@^$0?Co$u(u?|Z5p>O$bkQ9#0mY58#l_!Pnl6^P zDwvt@Mv;p=EzQS-NaL%%b@3zG^jtgrgUgLIL@F zB}w+)(XY0vlG`5t<8ao-KMj9PCY2o=z<%{8rbZKm87U-7EL+3djCv( z{;0(^MMXK)r!gcC*{NT=B}E&`&CX^8^j)J&)F9>U*w*d=zwbQaP*5&Ae{I8>?MX2E z6=7&k-_|>x-m=Q0DG@F#VhP`~lhL#pJVz3i65(hwx_7|OskZF6`?yfEk@5l^o@1~* z>UrUBexFKe-_sSIu>9!bIqQ)rLQaPAhw1amNlt^STkv26|8qtJTK%hlISwq~yl-g8 zSAgEa4~ei^Widf`9p)~Mdf+wIDc)c6ell|JI}^!9VOU|TV8~@BN^a+h|4SK{)sS84 zN%?{6phEd|y83;0qBZCOJCyqLk807N4IX#rmEMgT+zzFEC3@U9*ZdD*fD&E%BhWUt z^iNiV&u}6H&zu4|r8D6lNzIS`&$R1*a4I%7Ko{RAU75!S>JzodK^L)e&OXh+`LgTD zlP4=|xmyH!4{?E3y~9`Ope@>=2Dj-`ena#A+1acOwf{|&-)`(LJy@_K37Al{8Rp!N zZ?^A`kSh8g9ltb^@xh0a^^fMdv$x#w2ReC&GjOtW%{Lo?MUg+s53~qu-N!>@l%8Q^S{s? V<(D5j#Q7P3z|+;wWt~$(696vg+pz!u From 5a1123e09b9c55f256fb506c3d54fb4b4cbedd8a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 21:05:49 -0500 Subject: [PATCH 137/164] New telecomm sprites --- icons/obj/machines/telecomms.dmi | Bin 23547 -> 20556 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/machines/telecomms.dmi b/icons/obj/machines/telecomms.dmi index 7f5f05e3aff7341313167493b78a2e3c00d08b44..4a6988f88e4c96aecd5ba92ec5dca2ecaf2aa7fc 100644 GIT binary patch literal 20556 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 literal 23547 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 Date: Wed, 16 Aug 2017 21:50:13 -0500 Subject: [PATCH 138/164] Automatic changelog generation for PR #2402 [ci skip] --- html/changelogs/AutoChangeLog-pr-2402.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2402.yml diff --git a/html/changelogs/AutoChangeLog-pr-2402.yml b/html/changelogs/AutoChangeLog-pr-2402.yml new file mode 100644 index 0000000000..0ef97907fd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2402.yml @@ -0,0 +1,5 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - imageadd: "Nanotrasen redesigned the area power controllers!" + - imageadd: "Thanks Xhuis for the contrast tweak on APCs" From 0c957efee137844b8ff94cdd7680048e610b2a2f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 17 Aug 2017 09:18:58 -0500 Subject: [PATCH 139/164] The station explosion cinematic now uses the old "far explosion" sound --- code/controllers/subsystem/ticker.dm | 16 ++++++++-------- sound/effects/explosion_distant.ogg | Bin 0 -> 15355 bytes 2 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 sound/effects/explosion_distant.ogg diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index c7c50f4d04..e07d2db001 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -300,7 +300,7 @@ SUBSYSTEM_DEF(ticker) if("nuclear emergency") //Nuke wasn't on station when it blew up flick("intro_nuke",cinematic) sleep(35) - SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) flick("station_intact_fade_red",cinematic) cinematic.icon_state = "summary_nukefail" @@ -329,13 +329,13 @@ SUBSYSTEM_DEF(ticker) else flick("intro_nuke",cinematic) sleep(35) - SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) + 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/explosionfar.ogg')) + 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 @@ -346,28 +346,28 @@ SUBSYSTEM_DEF(ticker) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red",cinematic) - SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) + 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/explosionfar.ogg')) + 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/explosionfar.ogg')) + 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/explosionfar.ogg')) + 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 @@ -381,7 +381,7 @@ SUBSYSTEM_DEF(ticker) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red", cinematic) - SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) + 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. diff --git a/sound/effects/explosion_distant.ogg b/sound/effects/explosion_distant.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d9976c51fe7e1e24872450112074dad799ef4902 GIT binary patch literal 15355 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 KF(0Bt!2bbLssK^| literal 0 HcmV?d00001 From 2a2e4b2af4c70d0142175607343ae468aef865ae Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 17 Aug 2017 09:19:05 -0500 Subject: [PATCH 140/164] Improves attack logging of pulling / grabbing / throwing --- code/modules/mob/living/carbon/carbon.dm | 1 + code/modules/mob/living/living.dm | 2 ++ code/modules/mob/living/living_defense.dm | 7 +++++-- code/modules/mob/mob.dm | 2 ++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 8f5720164e..feef638fdc 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -171,6 +171,7 @@ if(thrown_thing) visible_message("[src] has thrown [thrown_thing].") + add_logs(src, thrown_thing, "has thrown") newtonian_move(get_dir(target, src)) thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index edf54e547a..9684e44ac9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -550,6 +550,7 @@ if(!restrained(ignore_grab = 1) && pulledby) visible_message("[src] resists against [pulledby]'s grip!") resist_grab() + add_logs(pulledby, src, "resisted grab") return //unbuckling yourself @@ -587,6 +588,7 @@ if(pulledby.grab_state) if(prob(30/pulledby.grab_state)) visible_message("[src] has broken free of [pulledby]'s grip!") + add_logs(pulledby, src, "broke grab") pulledby.stop_pulling() return 0 if(moving_resist && client) //we resisted by trying to move diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 578eaec93e..01dca7f00e 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -89,7 +89,7 @@ var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].",I.armour_penetration) apply_damage(I.throwforce, dtype, zone, armor) if(I.thrownby) - add_logs(I.thrownby, src, "hit", I) + add_logs(I.thrownby, src, "threw and hit", I) else return 1 else @@ -150,6 +150,7 @@ var/grab_upgrade_time = 30 visible_message("[user] starts to tighten [user.p_their()] grip on [src]!", \ "[user] starts to tighten [user.p_their()] grip on you!") + add_logs(user, src, "attempted to strangle", addition="grab") if(!do_mob(user, src, grab_upgrade_time)) return 0 if(!user.pulling || user.pulling != src || user.grab_state != old_grab_state || user.a_intent != INTENT_GRAB) @@ -157,18 +158,20 @@ user.grab_state++ switch(user.grab_state) if(GRAB_AGGRESSIVE) - add_logs(user, src, "grabbed", addition="aggressively") + add_logs(user, src, "grabbed", addition="aggressive grab") visible_message("[user] has grabbed [src] aggressively!", \ "[user] has grabbed [src] aggressively!") drop_all_held_items() stop_pulling() if(GRAB_NECK) + add_logs(user, src, "grabbed", addition="neck grab") visible_message("[user] has grabbed [src] by the neck!",\ "[user] has grabbed you by the neck!") update_canmove() //we fall down if(!buckled && !density) Move(user.loc) if(GRAB_KILL) + add_logs(user, src, "strangled", addition="grab") visible_message("[user] is strangling [src]!", \ "[user] is strangling you!") update_canmove() //we fall down diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 26b22d964e..d612611ea6 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -327,6 +327,7 @@ if(AM.pulledby) if(!supress_message) visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.") + add_logs(AM, AM.pulledby, "pulled from", src) AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. pulling = AM @@ -337,6 +338,7 @@ if(ismob(AM)) var/mob/M = AM + add_logs(src, M, "grabbed", addition="passive grab") if(!supress_message) visible_message("[src] has grabbed [M] passively!") if(!iscarbon(src)) From 72cf7083f6c765291b895f4a52c98c01f514c345 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 17 Aug 2017 09:19:09 -0500 Subject: [PATCH 141/164] Fixes leathercrafting recipies trying to build on the floor. --- code/game/objects/items/stacks/sheets/leather.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 285225d6f1..1bd66b6a38 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -12,7 +12,7 @@ novariants = FALSE GLOBAL_LIST_INIT(human_recipes, list( \ - new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5, on_floor = 1), \ + new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5), \ )) /obj/item/stack/sheet/animalhide/human/Initialize(mapload, new_amount, merge = TRUE) @@ -33,7 +33,7 @@ GLOBAL_LIST_INIT(human_recipes, list( \ icon_state = "sheet-corgi" GLOBAL_LIST_INIT(corgi_recipes, list ( \ - new/datum/stack_recipe("corgi costume", /obj/item/clothing/suit/hooded/ian_costume, 3, on_floor = 1), \ + new/datum/stack_recipe("corgi costume", /obj/item/clothing/suit/hooded/ian_costume, 3), \ )) /obj/item/stack/sheet/animalhide/corgi/Initialize(mapload, new_amount, merge = TRUE) @@ -53,8 +53,8 @@ GLOBAL_LIST_INIT(corgi_recipes, list ( \ icon_state = "sheet-monkey" GLOBAL_LIST_INIT(monkey_recipes, list ( \ - new/datum/stack_recipe("monkey mask", /obj/item/clothing/mask/gas/monkeymask, 1, on_floor = 1), \ - new/datum/stack_recipe("monkey suit", /obj/item/clothing/suit/monkeysuit, 2, on_floor = 1), \ + new/datum/stack_recipe("monkey mask", /obj/item/clothing/mask/gas/monkeymask, 1), \ + new/datum/stack_recipe("monkey suit", /obj/item/clothing/suit/monkeysuit, 2), \ )) /obj/item/stack/sheet/animalhide/monkey/Initialize(mapload, new_amount, merge = TRUE) @@ -74,8 +74,8 @@ GLOBAL_LIST_INIT(monkey_recipes, list ( \ icon_state = "sheet-xeno" GLOBAL_LIST_INIT(xeno_recipes, list ( \ - new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/xenos, 1, on_floor = 1), \ - new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/xenos, 2, on_floor = 1), \ + new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/xenos, 1), \ + new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/xenos, 2), \ )) /obj/item/stack/sheet/animalhide/xeno/Initialize(mapload, new_amount, merge = TRUE) @@ -161,7 +161,7 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ GLOBAL_LIST_INIT(sinew_recipes, list ( \ - new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1, on_floor = 1), \ + new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1), \ )) /obj/item/stack/sheet/sinew/Initialize(mapload, new_amount, merge = TRUE) From 51a615f5c6cb82cf0511d39c8458fc8fedc16a85 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 17 Aug 2017 10:07:39 -0500 Subject: [PATCH 142/164] Automatic changelog generation for PR #2399 [ci skip] --- html/changelogs/AutoChangeLog-pr-2399.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2399.yml diff --git a/html/changelogs/AutoChangeLog-pr-2399.yml b/html/changelogs/AutoChangeLog-pr-2399.yml new file mode 100644 index 0000000000..2d162a5edf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2399.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - rscadd: "Blobs can now sense when they're being cuddled!" From 3b55852c5ee76753485430fc258d36054bb285b4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 17 Aug 2017 10:08:14 -0500 Subject: [PATCH 143/164] Automatic changelog generation for PR #2408 [ci skip] --- html/changelogs/AutoChangeLog-pr-2408.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2408.yml diff --git a/html/changelogs/AutoChangeLog-pr-2408.yml b/html/changelogs/AutoChangeLog-pr-2408.yml new file mode 100644 index 0000000000..92f33a9292 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2408.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - soundadd: "The station's explosion now uses a new (or old) sound." From 7ab92ade3c9a29aa1068fe6dc8b48e54695a4ef7 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 18 Aug 2017 11:13:45 -0500 Subject: [PATCH 144/164] Update lavaland_surface_xeno_nest.dmm --- _maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm index d139ee641b..fed94448d0 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm @@ -269,7 +269,7 @@ "W" = ( /obj/structure/alien/weeds, /obj/structure/alien/resin/wall, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/xenonest) From 3c91fba8e32157334fdf614e509e0cabfa157a4a Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 18 Aug 2017 11:16:30 -0500 Subject: [PATCH 145/164] Update turf.dm --- code/game/turfs/turf.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index b204406d05..0a7951c075 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -162,6 +162,12 @@ /turf/Entered(atom/movable/AM) if(explosion_level && AM.ex_check(explosion_id)) AM.ex_act(explosion_level) + + // If an opaque movable atom moves around we need to potentially update visibility. + if (AM.opacity) + has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case. + reconsider_lights() + /turf/open/Entered(atom/movable/AM) ..() From db3622ca128c1435e3faecafc2057d9d5768d774 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 18 Aug 2017 11:18:33 -0500 Subject: [PATCH 146/164] Update signs.dm --- code/game/objects/structures/signs.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 9a25da9019..f6b044a0da 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -321,6 +321,6 @@ icon_state = "direction_bridge" /obj/structure/sign/logo - name = "station logo" - desc = "A sign: SPACE STATION 13." - icon_state = "ss13sign-1" \ No newline at end of file + name = "nanotrasen logo" + desc = "The Nanotrasen corporate logo." + icon_state = "ss13sign-1" From 8a7c0e657f4d111207bdf09b760d78f9086ab113 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 18 Aug 2017 11:20:36 -0500 Subject: [PATCH 147/164] Update powers.dm --- code/game/gamemodes/blob/powers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index deef4367e0..36707d9791 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -175,7 +175,7 @@ blobber << 'sound/effects/attackblob.ogg' to_chat(blobber, "You are a blobbernaut!") to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed.") - to_chat(blobber, "You can communicate with other blobbernauts and GLOB.overminds via :b") + to_chat(blobber, "You can communicate with other blobbernauts and overminds via :b") to_chat(blobber, "Your overmind's blob reagent is: [blob_reagent_datum.name]!") to_chat(blobber, "The [blob_reagent_datum.name] reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]") if(blobber) From b4431f384011a4452fb6eb078424b5907aeac990 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 18 Aug 2017 13:41:38 -0500 Subject: [PATCH 148/164] Automatic changelog generation for PR #2362 [ci skip] --- html/changelogs/AutoChangeLog-pr-2362.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2362.yml diff --git a/html/changelogs/AutoChangeLog-pr-2362.yml b/html/changelogs/AutoChangeLog-pr-2362.yml new file mode 100644 index 0000000000..5bdc603b06 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2362.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - bugfix: "Fixes a typo in the blobbernaut spawn text" From 2c33ef3ab080a2f1381834c66acb9002632cdae0 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 18 Aug 2017 13:56:47 -0500 Subject: [PATCH 149/164] Update component.dm --- code/datums/components/component.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/datums/components/component.dm b/code/datums/components/component.dm index 5e25a581f8..4d5fae2115 100644 --- a/code/datums/components/component.dm +++ b/code/datums/components/component.dm @@ -117,8 +117,6 @@ . += current_type current_type = type2parent(current_type) -/datum/var/list/datum_components //special typecache of /datum/component - /datum/proc/SendSignal(sigtype, ...) var/list/comps = datum_components . = FALSE From 61d7ad4e82621ba90616cd7e690cc26d65e1086b Mon Sep 17 00:00:00 2001 From: Cactus Date: Fri, 18 Aug 2017 15:35:08 -0400 Subject: [PATCH 150/164] Stylesheet and Wolves (#2389) * organizes the mam_bodyparts file by species * Revert "organizes the mam_bodyparts file by species" This reverts commit ab692973ba20c282becf0d69514b1ac03d5447f8. * stylesheet fix * wolf sprite edits * conflict resolution * wolf accessories readded --- .../browserassets/css/browserOutput.css | 3 +++ .../new_player/sprite_accessories_Citadel.dm | 6 +++--- icons/mob/mam_body_markings.dmi | Bin 45530 -> 45337 bytes icons/mob/mam_bodyparts.dmi | Bin 38375 -> 38666 bytes interface/stylesheet.dm | 2 ++ 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 7c42972a10..36640db74e 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -371,6 +371,9 @@ h1.alert, h2.alert {color: #000000;} .swarmer {color: #2C75FF;} .resonate {color: #298F85;} +.love {color: #FF69Bf;} +.lovebold {color: #FF69Bf; font-weight: bold;} + .connectionClosed, .fatalError {background: red; color: white; padding: 5px;} .connectionClosed.restored {background: green;} .internal.boldnshit {color: blue; font-weight: bold;} diff --git a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm index 0b21852a8e..fc99a87eaf 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm @@ -150,8 +150,7 @@ /datum/sprite_accessory/ears/wolf name = "Wolf" icon_state = "wolf" - hasinner = 1 - icon = 'icons/mob/mam_bodyparts.dmi' + extra = 1 /datum/sprite_accessory/tails/human/wolf name = "Wolf" @@ -191,6 +190,7 @@ /datum/sprite_accessory/mam_tails_animated icon = 'icons/mob/mam_bodyparts.dmi' + /datum/sprite_accessory/mam_tails_animated/none name = "None" @@ -436,7 +436,7 @@ /datum/sprite_accessory/mam_ears/wolf name = "Wolf" icon_state = "wolf" - hasinner = 1 + extra = 1 /datum/sprite_accessory/mam_tails/wolf name = "Wolf" diff --git a/icons/mob/mam_body_markings.dmi b/icons/mob/mam_body_markings.dmi index 737fa15c4276828ae4f9b4c2493a2721865494df..fdb97490c85b2cb980f6466df831936b308e4b52 100644 GIT binary patch delta 20882 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 Z;SUJi5^R?*4FV6|1ExpuImXTr{|1u+q4WR% delta 21076 zcmaI8Wmr_-_Xm2Yp^mbV@6Yw2I^aDy?+4bayi| z_wfDyUflcUJ`Xc<&VKgUXYI9DeAZffllBjHauK&u+zM>yXn$=^JXc89u!suUs>;26A@YX zTEztJdk3c}+jhwC{XW@PaOO*9cjwX7J<1V(E=rS5eRtx{#B-C1x;gflLhsW0lI&C6 zKhlUmctgE0xH>B5u`B1XQ@5HWBjw}gK74gKUFW8AIo1>&b+USVQejIF{V46;pY*<> zmfZ*1r23a*s;doSQ3e})KkkW=93LOw?<=dQhQG9Hp>+b=) z#70*F=tfvnltb?efqd73vMYCMps3OZddm1f>2ckp26D^h&w!7ldv zsa6PSdULy$EH%|6br#g=PQdr+<9c3c3n|9)?#H}m?M7?NbXnZb*`Cz;`I<0U$j2QD z7=P_mv|r*gy?gH)N@ll_762|TFRe#P4EyKiD6d|}ZO2T43!+8no;Vkwo-3)pzTeTS zyr%a-e$1-6%JqcCbB+HV+CwcHyFR7=Phd~ z{(?eN45-G-?s(g|PteopF6e~UE9UeUH=yT)l+Z-F+H544&1bEx*&bHR%V)ZFE-E3Y1jUHdsy0Bwisr4-34tmLNQ;)G0ttHHOZ;HS2Q+T(}lz z`nv{C#N{lT6aYlC%B&Pil|yryAFpypTQL&vuT45tF({|#dV!Zi0@)FhDAc~~H>6Q`%Uv1%oyCAoEVi~#UlYzjw0N=nJY@SFRDDqDr_F3y{! zIMsQGg8uUsG=X{LVbJ9Qbl0+4M*RnUI_Khf&jNa@?JF!gY^2X1_#`(zX6K~Pw3&7o z(}eR41hIoB7ddhDA6+%x89!VS4-B|`NEv0x7WS8LCt@yOP`{r5gj(F?Um>7Yfiv*k z@>N}paN(V)e@>8yxZB_BO4Zjdv%h#hNUrg6$JckdDql}iOrf|3@` zvGn3jt%_^;^>327uuMp4cIG>TiR3Qe5&y-A;~k#+FUh(J>Px!+5lA<^7A!3n>^n>p ztLs=h)1iQ0ObE%3A?E9m;iyTdW`??+IAboR}r zz(VPKMpnf@_H4&1xHB}bR?zb@TQBEiH)`huf&FmU9;Rt&OGv>Is46Mfwz7L+^s`x1 zLsEJQdvUzEFqp3n0D)<*1<|V&Vun@su1JKZZ{{~Qvz_eB$Sl{k7MGWVE0r>Cz5zvP zw|7U4s@hAQt7+ZN@3#2r3l85q@FtgmKBeU!i5;&JX$cL6Ev&e+h$`DhCGYuPi1!v3 zhhNJPWR9#XZ|he&4sb9qN^85#)3oN7J6>5u?2X&TDE#c)Y_uUb$HBt#+;EMULE)3VNqGsQYDy#(uza?A*m@EdcZ`fq^A>aRWq(N?Qrq@^Q16 z^Dq7Msw%mMGcUr2L`)7u_}n+1lc)$rBaM26DF_%}I6V*DD0$9x8Hkf7rZ_e_oC@pz z9Y?Jm|I4PRb7o!}qVeS+eT$K$Kf&j>r2Ud$P%_RQBryH`uJpYhB}o5f%kVWFcECpW z4u}_@IcCd(CkMnmr~0gzERUc*X6etm?4tMgl>`6u**#&?G!rI|4Nq>!@mvwV2Q{9z z0{gy~s25|XCsWvR@S7iE#OF=UOkmLaG;MmfEIv~4AN_dWj1?|VX`U@E@+Qg<7-n4^ z6nDxZ@fV(E&q3Df zr$FxI<>aqa*NL$^?Kv+oxD1+RI)dqNqUTtMfScQF65S#J0Pi%wK@& zl>nPc^*+B3npaNunHgD+4Wt8XHeCO`1%8(CyoqKD+3)$ByxSoZgNtoiJ5k*RX&@3r zJb1?OLeq>?Y3X}e;J~`FmD}?Y@K4>VLb5W^mRg~!GEoY^exe6SRozm?vnMr&$!Ml0 z|Au`CG2z#6PLXmXz5*5Wr;kGteCK)wZClxfAi*GvQtSC?SOnKPExRC{R8=mlBKyhIXk|K zE+?EwQMwS*m^Csw+*XXJ7#mzQ7&B1Pd`WJ=M{=PePc&tw+E z_=QPwcy#u@FG>V66xO|K8lh29xo4C@4g~tREI)IwYjr7+we!){cm^wSbqxwGQc-%rR4bYzfM5}cwhNcC5_o24Smn=pnB z`f7FaNBR(p=RZ(o>R>AfH?TdboxGLc#f1z2Y{ zOYTd4(~K7-0%&1%TY;9KGwg70!i6%8a^=d$i!>!{EMsb#EE|176=inMS?== z?JV;u`AB;ViI94+cb(HGH7@;E=RJK35U(o5uvKB1XR|DxP{S=ltAZ`iwN?J+rI`>C zjbbap3bEf}gHulp()WyO?^s(#X}4q`1%}ao7%k<_I=`3tn%GT|zB1JW06>sDBZQPQ zCDat#IiUKqvVmzcx7lAF0Hz;BD|uhOuWWkWw7Y>itxEfHUhX68XHAuiRhe7V{8M%frm|=)1PyZ{=&Kx4M zvEldh+>{8Bk%dj3KXJ#K$prwa^D=PLf|k7^y}cPdtEoNG@J@80`gHQ+6XUDC6b+MW zJ<`0*4FEZZ<~|{N5K4OF`$II~5EAS8jpK?zc8mZT+)Ur?%!c8qF|%5v!aidx#fGsd zVX=2BAvMwq+0FRj|94v$<U0?@*M7gU*{={u5SoU+<6L!PuCP!%f z{4Sf)!+Y-viwAsUVz$~JLph&2L*EpdAINn~_4x#(`mb@?hYuh6$H$50rhP}wR%T1V zc7F(MwxIT9hScJTm=G307ofityDaLnd74I|1lNdGxIi(gcxGL&OrFzLhJEz2w4E|0O7!HaA?-_X6%GLG z?3^(nZzubsU&W$DFckps>b0E#Sj0{AfgK23Sg_iFTU7M@|)L8#9_~S&)LbD}keeHxG&{Q-40k_w46)557 z4t?RnBku68{MuA=wFmy?&PCXz+9q9@Ci7=KGPdWckILM&5YsEJnE%(wGdwni7aH<+jFQmA z-(Sv*g)t18=0X*clan*HF+OxDiSN}vU$^n|!quuFgrn7Jc2B&edw&?pT0`zy*w5af@;7OLnj`vY=e^39!ERizohW16F7XC@C$IV83|Kp!y-i zTq<9({c}eErS0d>ua1V;u2=hW_DLRs{jy1;Dr;q_D?wPEw_@>|n7lMDw{}*dVByml z@zL>dGPzBM>P7A0n@47>;HTu{FX?ILr~}wymWP<;uGXCGsFZ2#8M~~@Ua{mTSfjNy zwO2dW@GN6G_OJ9dmn~6`tLsm*yZY|$vFGsvP%y^n$pb6I>=AajX`vS=sbp@1{Pn6} z^b2&a^E=EeZSTxKN_@)y?3l`bPq2R+1wXvh*bV7=IfCGrX%K$1OAk3CbL z;2{3cxrGh;1?(4j<2gQe!Uco{ut@Vvr#O7;pcouIuAvwaq^#TS4?KsbC#}_D4fU{< z*;`Wgtvo!yH+Tj|fHl9)OL*)o!?!0p?M1v7qprD_?4sM zRKm!}eab-&2K8tK-lX7_b_Z3Lp0byGd2)DKV;FA`l9=gnvSI_0_ITTBWz!$~bJ8Z| zebtO?Y~Q^D!|8tioVXmNyL4eHPW(tVtfhn9Wp$ozl;E<*>D zw`PKwyXIoh-K*`7S3zA}Q?64dF?r-Lt+B`JNgw|g4z3N@CNHYSu!T%cK1r1`&02VC zU}TuyGxGv(oviWCpFcY0Tw|Ab@Cp|?;$!SER$W04D>MznKWO-~Dg0`MY*<3Pr6o=5 zejn}cOij(?zMtB2zt85JSG)48o&CYls`dhvX9pSO+Xk?>JiWU=yt?8)VOD3k)RDvK z`@Lx+I$u-^%gbR7e-owPvki8{z3B+c$>aC-vsdR2Hj4(I`TF-?o6M=rkmghQqQDER zQxVpyAQgjJQjTQ6&wP|`HL%kILrz{)l$X$aB-{KC6;%&rs-pap!bU-P+yQ^WYO_zy zSbY-zw8oq2b<3IAvNn|syU)Yavn|6fWLDbPg~(cKDTF!4u#t9iN{e5totwDUe4s0* z?Lr)`%qsKIYacw&lY&h0YsMN>*wl&A}?DD9}9sK!Hz&>f7f0z|zQ3CZ7dTF02SyJ5Lqr#ZPfkR%~jum**9dZRX+m+D_SLP92R9p`-fBSaJmdNC?SS1o~%{H}|Rgm#1_qQvKFh z5k2dYv+BIywi~+K<*o^`N!FI1D(u}B8XU{++5%-*6F#I=BRP4yfBAatxfI$~BX_k9 zy6wL7NzK(gzg=-#V6G>8_l3s}u?iZIOT&l;yF`$b&2E3rwg!%9?$OBrw7<$WjTV-| zHNg4RPP?6?*1}0+-XvU|*oXowq1(jqW-U-|ArZq0{_~WyZGQ>ay4oVWuhB+o$l6kP z-PWv>5Z}v?#$M<-h6>8GY4j<5_0G_GD*vPfyZF{-)L>dRp&{KZ{piDXD86vwxL^MJ z3<^7RK14wr#3KUA0wyEEbhKSH4tM1{pl?E464c3!b^p zD};sAhmnzC9L>Nrh1vxLXg;L6Xz=$E4hNBto4&$7C5U~BEOr1j9nRm~JLc0F-e!+k zsMzPkL~Uls)39H7DTv@r0xIU3nbiV3jT}%k2;M5iRuJK>L5kqC1#+KOVh?_s-gntS z`R(6ih9EB)t@T@6TGK9ROMKMTB%B$$uDI^n0oKQ&4_<_H?^YZ(rK_y^N`3hFQ5tfs z;U6cT95%$oSr-)-i}l6bLP5H^vGLr>i9aog@gqXeja`^+nv#s1dL(B*F-MP)^3e(*k{-1-`W#yA|NEWnHXEqWzDs;ZubGwQEKAy}7H9S7p5-0F>4t?6 zpB5M)A-D)-LW91E0-rY(F$7z~cX@3*Jh~m?G;;O6ry+-?cH4<(G%KHK9L5_ZYEH|%g)J&T8 zLf9>Dj#%Bleg(85R@F28JRvE3`dO@lD7X7pIp8JwgRHO6;&M+jmhv(47l@weER-_G zEq|s+p^%NIv&2p@ygS)PLKavqLIq0sk@jn??a2ONzHXXh1R-q+dpG?bJJCqGlUjbK zNKUYCwr9)PgpuE(kzpE!plglI1HsMgQ}_J?!#6GNZIqQkNMtF!E5tezIF&G>G!lmc z{eA@Og7r5_{bfF!z30O3bE%%sy4w-|U79K=rRNTfukE4U;^ow+*kCuu;bap2x+UeD zPd4LQ<+gnpI+r<~Ip;HpX4gTTTXVayAm+FJ!42bGTQQSE^Fyn%HaI`_&$o9C`;S&a zM#7h0o(>o5KVp{`>Qwc)Vs0tcF9eXY=?u*aho{k*LGRY-n_22NEo=P{o7u0jNJfLA z*Pkk8VE6=KL@nvBktIF9P#&9(eowQV>`4Pe?B-pPs?U9_03A{64%a!52O>7WY^jzl z5r*my2#Wx9byEJb-?2d=Jl7AbrNKFM*z&-AC{wbqA(Z9gl40b!XdxazWoYmA@pKq{ zCy&(WO8OvhT!zCi780ZP7@vyt1P#ACb|VB#{!lzNO)4rcPXQbh+HB3L&h$0S;N2a% zRJ)+Bz`i>Gd?wBm>{3KPqyCh4f04C*+y<1v7GeQZgV^C=u(_2oPJ(D7xi2N;wDFd7 zwhX3*Upwbo%d&+c9MLH^@IUaiT!6wU3v>B5a~K+(uYgD)+hRU-y5M(-+`v=b>Rx`RCzU-Y7B%Ft;Zc)w^A(PGy-0QSBZbIppFdoP$hHScxO z^;q&?tEsn{SL*>fDkdgf#8Udc$A-aUnH%Km2xi?2p)LSQz>|U=6D_D7!G|~oZM=Mp z_Dgf(XYDH|wOjeQi;Ihsv-Mjc!eB+Q!J~RVi}0o_`?BzV%SR_C(pf**xzRmJ5g2Aj zx^GNQWJ`O1kKQ?N9n4(Zo=_ofPv@c`c6|11K$>9mtoz|-NVbJB4<7Tgtb;TI7k$qF zD3W;g#_NJD{n@kWweu=paIf*&arM=wDawSppuC3e)!oYUm{f14N?wM%R9hkHrjP|0 zL{f6?)c*eK!`wwIObwMA9TP)Z)wchVUgm@VL@|iAcXZU4#hxTlT`#-nTxZq(1R;w& zT?7A?XeC*76om!$tupRSeq$@2%T}p=0@9mEj<~&iOci<2AYyLCZX>$_1zEzVW^dWm zbN~Gx_8STY=tI7ljAqrQ#nb8!G>y&lk1ebj?WV=n5nevZYbZFS4n(t4@ylWv@J+zh zY<51X&LL9Lk4jwJK(mexFZtnDYlpt7%6WPv6*v`eNhwd}T*uTM)F&4dl7l7>1Q}*r z4I_W4%Lw=IlU9Jk0?lZAT$~muoy+?HgCLwr=Q|16W{MQ9{l=WLF?zjkgT;O#=DlQR zrSrMM-(m`b-_}0QzQy%c@4e{-xjVABp4i>5bm__mWmWU0&6cTOXI6_U*pkIY2Hyx~ zw+#f|8GYZ1pklvjW&bATD`}AAy-u!kr%@htC@%)_*J%SzMbz@|_xqZ^aVBhos7cX1 z*eEu^zuIsPp@&8rd~yp6+<5ty5plS)=o%Kj?Y#j7faE)BR# zr+Z4ki1hG~usYq?6G2|>L(!s%xw&TDvg^{K$I!U3D;X4wh)YSzyfJltX?jbO_&R*} ze@72(a>%n5`ioZ!J{)tv7NyrBANL1n)qlKRgqbzH8Tt3JQi^8aHVtvh-7Ls*LWvUX zWT!$9Zk2JTjSl|l7TWan5F#MC47_~DFmcgwFTp03mDv{jZtzl7b%;D}PI=_SM%Yqfwyt zC06a@zsz!TwX{bBgqe`xmv%_=Ah~z>_p-MIR6vG4h#q40JioX7*w8SEi@orn-J$_E zB!-#gWgPnq>vL(vKRcx8{^-QVv^(~P9n$(k98qW{&%~8fHf3hi01x+}XCmGzIQwGCQ&72)U z%HZ})*9TNY_`On=vdNp|z+9WX6p_3ziyRH`To!r7%R?reOt3!3h+3P|DsRd$2s)h| zA9p=FepUi$Ht$w3`f5o z1G^OZL*@50kKPM4SNc81c|#xHbsGR~Cp;WdS11ZP+I87tZAy8p+=Xv6Z;dMt2phGQ zgr~?rHcaFD{!gU~`a)1NkeA3;qa&NOX{PhI$?5!efDkFGYZE--s6xA(0!;hOACmR% zKsVgKzHmP&p*z{qmT_zLFE5dQrp7xKv68J$Bqh`k*! z43^uEmvpyKde)06EY1b&w`oYA>Ft4i^@aUwP`>VB@=5VW%n=FHSm=`{bdu+c^)WtF}5896(duAuI3D^A>VC zrG|ZWRRRh%2KnO1Ba)+UNBKGPCwXXJXmdWoa%l#QjE;g1{#kckPc$%dOZD1IHz`~v zGu;_1m6>LGgqrmJ18=8_j92gIVg5pitrd|)zSbg0DX!b{x2p%xupHCo1XOLDu8F zUvJd=)y`;Ag)|@`J*az@kYwRBq^&ikf|4;7Q+B3_#aHOeo!98s;%k(iYjF6%Dui;} z8D9)=-=?XkX7T&34Q#e_uqT|~dEO_VvHL^Ay>r+EHV9hV>%OJ$MpA*w>-~=z{)6Rb z6pupH{;!-vWdodZk@7;gJU8f7C2L#jNp)YbU1I=fA(V~Br5%(zAO->O!<9dHz(-!) z{iFYFCNLo6CQ>A)j{GQOZcTJ|*UPB$Ttnn*i(#L5N5_}A6{!wUOX|D&f{j}VNo;_9wsoA-1Hg*5>V>3X zoz7R+IK0fXR?F)wLbP|x3euja*Sa4F@YiT~^}#RP`Aklsl;$~N6G7z1xEd!*{eTywQP;q$1IIoC#R;s+@>b; zkFt%JWBSLb9_4S~x6#`FRMF|7A!HmPO8L}@yX2-u{5ns5DB9{&Ep*X-P11vRWE=uUax($f`&(bQc{F%Edd*YniVVJAe zT;NNt)EW8P=9w)wi`^MS!>ya|A4(yAQi*cJsmb;bkq}OC#;KVl;cPi>g@tIGh#Rk9 zSjnyEU_}H9+o&zL<8+Mba=1HtfEUvX7ng{jAe@#tUPAW7xrMFyQsn4(&dp*9st1w!tg;z@ErX25VIpLGqI6 zFd8`Bal{CWRb&c(dPB8B4$vJ;cL#zA7<4Y^UKR1vdNbW}Wt$$kBYva1qm`TK!$*{D zRjT{B-~C3(aUM{Jb~mhl+kXgf2`!QYJi5G0FD(AXdqZ`gtIKQb|1Yo{RmssqAhq~A z#&3)W_%cg1f|nym2|%DQDoD>Cd%civ-n>a%pF0>`7oWF>DVt=zEzP6s z!2-gDba;d|Q;jwhxy!Gg_7RP7q%I63JjkCv9wX^cjoTyC^!fg`EUFrEzPPV%he$Y zZq2z8wg2bRzZiky6TqvYy2pt$q^e$xVxL;I+05O7ujv@Of z6+yrhCQ2Ofvw-?vG6%B2OlUYrQdA}T0I;(tu=`nK6;i6qS;UW51o<-+D5!xj4*=u` z^@mEq{H~3-ckYg1Qmfw(y}Ly|*j3xJH`vn0tT6a`%DI(qO3@LSzfi31aGR!U_vO1^ zQ8w8>tL2c6N8-({diDD?&#{`e?(X6*CWP1$(303$@*RXtkvwHaby#O5x~)&ylte5w-NN8mTAFqcK~p~_gv$9 zr@~Q%!#c};o9V+N3EA!K3Y~Y)K*a-~cp774Wz{0OjT0*w`ii)6Zl3THH2V61H)Dxg zs})-oB+f%rn_FA>vIV@9v9!`Dp^JwVit?jDP2}A`2;=$uq*+?(KB!#Q=^Ag@iS4wY zcBm_F&kJpIG6`A*xwNZ@)HI4r18$9xhbc}*AuK#iJeGssofv(`afjlem*hIWqLPZF zj#oJtL!bP!99tP_+%|uO+YUEmeuUq$BO?7fEMVE{5vHqXPKRtXR^o6A@O#&p5?~&5 z!`#ScA*(nlZrKm2d8IuQedow+Ux8cGf!0WuEXz=*c`zRaUP)Q-gjgmL8L7u+Grc&pf$xJxkv0Y$Vs=%>zDd~i%wJ~L$y=^9+ z>APKF0*j6OP?xaRhbx)`DZOnw=ep~}u5RekR2ukTEQT1j(Hj3Quad|!D&^oV!S``7 zT_W~v%=XeoU{II%nSo9Z;&md*)CX*nnE5SutV^yQ){&??m+9qw`E+GxU$FtWKl3kH<=o?ei(QcIGk&D95 zmOe`P6I4+zP=Wr59wrCg7)vb^ip(Z*kJR7afBe6YlCed~_7OnP+zXz(PIG zZ)|gF^R^gWzKxi1V6OoKxBd#co?fNbd5?>53kr`8U8bod;?#IdsFPPN~j8I*5$gr?!f6vay8=`9jnF4R?T>%8) z`~ie7uB=|H!1Tz3EV(?>q&@$6mYhDCAO3*3#tBW&l7vz%j!-(_mM^UVlq6(a%yGE95AY;f9I9HSBB7t>}#3l@6ZqB{&^HvM2@yqpzO zW%GkM(lO`K;4iqi7W@EHYRE%AXMBn-6^x*`k;K*anCf4x^{Y7jrPn6j&(z7d?BfP7 zJqN&kX)6!WM|fnhMl;3Z5rahf#b~>fyOyK2@?ur|=jY|-o%cU=w}H{WZS-neUd6ju zqKj;qwD8+%+n}93a3bA#3;oo?E@yme#cnI%)Fziyp|r*xa?<;S@%tBOpC&)$2O+Q7JUQ`Vx}v-KAt0;$wi0*miBDwPT^}(6 zi-r0XjC(Q;XwR3BKH)#cVzpm0RaLB3F5Uk&{9w%)tY6*~4DoN#ugB$QvHO81g}lQc z(Ijhp0gqDAO7?q@lS}tjxiKH>o|gDhO+7OAHXaX?9Y0I8@^3L#6NU5497B1(tEuP% zUoR%RCL5xnwilGkMQsr&&ADU+6@wnETA1s`Dk(f@wF%i?t2_YS6zxjm=18&{;E%S9Vhl!zltc8gQ& zNBst9>A;LUzf$K8Rv&t%>V2+*%~mnMS{jh);D3rvqKtLM7pLTA~X-Pz5au)(?UTGV}qG^{zO{@?10{#*NIaN@Gu6b-4Z6T0yLk(+E#GA5%v6T9Bi5*OCRkeXV$rx}Ykzz9xL8e{SvK;CY;sZ~n5ER0^1u`VROGB!~)vz}W zHY~lc70d%@a6kk}9VtqNY+D1djT!1nr`)F6fAo=0-8{*Jl ztG-p(o%(n=1`{(Yi+x%9mCz)Uf6sQ+Gh}Qs;}1v~m5|?X@U1N4z}wjSy?olP<~o;s zLBS{4hS;knH<-w}CEms*NTPs4budl8gwsuT8f$pxZEMcSIYP)gxRUG#bJdZkJu?CT zUXRT$6>Ag>l+Fg3lc_8$tXJs$p<9C~!P3l#NNf~*ha8ziohZSeW2_>0r6K!8O-Is70_a_o?f})jgKe4;VRNa;A5T;Tq_MpovODhlLZCwEgl7x>p1p zzyuzmN3MdUvB2Ap!5+fxi{Jb1qp~-=t=9`nME_HA@X-7BnSwW`+RZq%+o)QR1Tx)^ zenG2AA?(L4|88!~cTh!=Ez6SLCx?HUy5XQiwexlAo z?GgR>tEm(UJ5<=@RQAvYVKcv9^bP9mzJ~#V$~~ttCl^9DOfCvBb7J;uK;`X_t$rOC z8iMl6;0YEQJHzH*NW(P0pBv(aprWb6lanq=CT1K20q5Pl*zD0ZoNN$Jk(1|z@XgrN zenC``vST$3=VbYNk56wH8=IQl?!4uvZAM#jNWRDoc5pB#w6Eq^UR4Uen#OG!z}SCk zz^HFylZ3;LEgxrdov%d1W06kb2x_kP;sr9W$=ztl*&04)-B)owd@-#YoJ#p6J*LA?%~a?+)~EnvRf*LsAVWXxpTTY<3mwD)2)dp*y0tWXc2r#bq^Cm&~zor}EXdlDS)yC~Vc zEN&pfna_do`@8YmTrIBjnitNWsahxsU5RD$ zNyTaup*LS(dFYqpFz9?xk%fy9snt_S9IO-a-yZzA0do+0?Z0^*odCJt)E`&Ce%R@V z((d^@mWOuLS`PdtH?f0cIV=s-rFU+K<-wZksl#LchB}?t>6DxTLjnlRd*f{6qQ!OK zbR;tIL5PO>Vy(7MQ5Nn1l*uc8LlPb_ccH}fUyaJ5fc=>A;?fdAP(*83K3~R0!b1Rj z*zvN(P=abR*(Hg-18FsaAEK}YEGAvS42m5e%FQDmKY}R|H;*iS}5 zbrfgoiyO1Qnyjwi?{?&Hb#KCq>^nHA3`Mxs9kx4K?F~Qvb6rDrH9h^#5J<%k_`<4< zN)!$Q*5SQ(1rSE}4Q#)Qg`Ji+U_8K{K0}I;wSL4gmLTaf4^)_1E;TdM*R_a}i8n9s zGZFd|Y7$=%LNei?c=Gs0BMZij|E7Kx;jf)Hg-hO0>MQsHEQK2Hqd|M^pmY4`IRdxl zdw*IZ6mJp1LbNXJh!gsHYI;=dI{OHc)sxJc1r1g#ZxOX+LmPRt>d>fGFo2ED{Eniq z^E)WT(Rn;$5NGM=W7jhx02S)7xeeG60aX7%B1g*qfR}8~!nYw4RaHW9)a35-c`_G^ z&VT#&zD#?4w&IK|Xdw#TUyT_@9YjX{`@ zRdEDaUGnXB$z|$Ti|eOSr($@|d6yD{Q+gyvB0IQg7ybd2&xY=}J%0q#YL98+7wtOr z>k7a~vVm^}%~GO$t0)46t5qW`?0A-&K&NjW4rU$Yd5rUba5vrx(pe zB<_l%iDRR263|!rm)TCM9v&VmlwhOryIB%Wnzuk`h)J6P0~|u?RmS`ReE-XjCC|qE z)^}Dgxi{)@uhULDWPKQAB#kTtj04@tB1@tlK7a@~hrtG%z=jd~ahZngT2`BYC8J5Q~F* zPv*wPp58C7N83)Vl9#*Qgx^3h%i2)}mypLs@jF~@F>k5lbOVn1&3DihCN(e$JmXne z%8Jatqk&f{#%i2XME-+hRWs^YVv;ACZ`#1EOe=ZHG@||%MIS%a+n*Oblp+Q~T&DXF zSie!PnVA_NN04f?&x+kD0Om2<;kR1kjMd7bZ;0a{k@9IYqw7O;(!+0+wg^+1FfLfh z0DH8vtWSJ76?lgkd_gYoz+@8+XVSc_StjUz| zB8mBMt%l#-R{!!ZcCdl&(~ug=c6pHOe8ZTs#KG&z%fdYU z2Ne<6gUr+46K4ziDcqemqrSA!F8!d<_(n}On#zvo2;4i)v7xFY{9M{AgD3pVeY_Bf z^F<|y#|3})^@9Cgdki|2--XDM9#ZsR=s=+3DK0A{<*c%xH`SSI@gudjp#G({(l+Ys z#8QupDo_G2q8o4&|J$=1RoS)MiXcAUI;|)p%W3XLPp|JAZ&<%=1dQ!Y<5$UkaG7h| zydG6ET{10mdT*tRA(kTIP&p*1P)q&Kxox8e9Ba#VEUbh5%AiXPOD|JQ`$yA zM@tSSLC~b3RrRxO|MKhBR!e(Kw%?FONdiu|O?a*tmfAk>j$NCt<;BH?>q>p=?w&05 zkO*@O$}TRuZze`x1Xy2(oAe}R7R&;}_^qF#{Dy+?bp?4RK@*q`&ka#i1^iDM?kv&h zkN4&evna)bt6__;Dx1tgehDJxj^dYnaSk%UFyjgcM|v~*J@)VEM=ZGXr?&hEPr7tw zfP^IZcI4U6%nbRp^*%EWb2a)oZxwS;JG0>$71HANeP%<{Q^@DyfYartQ$I~@y~$W zTjS(0gBjXkq%L~-?ALHUSW!VKEiK*q<7Tr`4Kw`ev>`?Isk^&7kqC0HEFR&&ezu*x z|MHvDf@DA5$klUH)%N3*pv%`D?(S-qL1FV>@n^*>ZyrH8J-h`9+gy2pftWhulZVoI9-yC@zH;y1Vz$a=TB| z>``3y=B3|jp-*`6O1lwqwWRm@u2m`b^ylQ|ZJXygpU^3Gzyl6y^{bd(oH_BY9C5*a zI}VkTBKp3YMfs%->6w(G-0?rTi5e1qrp4sNHq9FZz9xkHrongOy9#HljN7Op`@MTj zP}=Ax4pr@gc@#ZJ;Cwz`J)%gMw`eV0jZxL{c~qC&dm&u0tHaG(kgb7M<=`jF?K)6v zv<$BNJTyOlYF*84goDCazXk$?fzP6fNrGpaU(lP@IFLhpvr8hJO)a_tf% zZ`P=pRb)!Gu%Kv7vh>RHyQy^Vily+2`Vo!n!6HgB!J=(u#DSn!4H=DFp0bf@RR3t1 zQ%5vwvX!=Zj#KZ0uO6F^Bg><8ERkx2mdeu>Y9tSic!i-P(E8EwaqD+e^YC{`j~g`t zzgC5qcwJsx^imib(uRigD0W50)RfX`N!9CWn=%f+dHt}* zx)-Rb8Znr^#-k6Vf$&{i%TVTMp+ei%SyBu!M`rDq76IVd~$S7l7* zzO*n<0Je?A5_V3mZyq)7rM)q1x1q-T7Gr}mKY9XY3EVMw`E#DvGRP_Oz;z+Nno2*> zFXT&i88?ZXAfC8vqcHjCz(DQ{73Wn@)QRO24rR5~+$wgyU;_oBy*u+ zXXXtVtUVzQuJP=#BkKh>k-XTK83I9$LpS*|iko=C=SU4hi)&^^U0a49%`&L$|6pk68&1AFGU+&fs3v^fD|h~GN%7rU(IShmO7kH!Ek4llLIAyTc&cHOd$6hnorJ${kfM-c z*5GGu-!Fju%^1N5K%TKFS#%z4S?>;&fGmDA$6sJb^48#M*LX*(p`v6KjCHwu88QC< z0inTXPH3mm$;sydY)nkSgr^p|Cs*sq*eB`;->dzO-1Cuu#hT+9MxZ5*Q#Fx1xZ>MU zjeSot4$uSPsdX#%W3EHH=9jiOMz0qQCSJ zjfypErvzHU$(cKe;(v*~4Qqd&av~DtbxoB+s(9OLCIGnRRof!9j(p1!((&m;wS560 zQbks|o-E-t`#q58^Qry$$}+!yp5<3Z(sbh8b?78u5cHo349d#Ngc})C?@BGcz2~|V z`PG|h5QRF{?)+>+4i7x4K7%MJB*%M@PW^8M+>bI#f{jCLG9xDw*U`$B7x+fz(tKV} zN~k8OrIO=pt8SPEiQix#e#?tjzoHQHX;DGOJWr1DKtI5HyOSCQSjFJnhu(4&jSbu6 z`!M$8!bDyDy$=~7+>p&AvBvMv_5Ey>Ms=^@3Qaj~t z&_tDOgnjIc2wLeoWV5{w|41zytqyP%kTwGdNH2jH z5CVB8zPDU&*1TWuN7lNzE4gRieb3%!f8Y7`4Y}tepzBMF+Kh3~>?lE$6Ci9ZxX-T> zh2*K(nZ<|ot@9ECKDm59{WyJ$_e)WTBp8Y#QWOU4# z6V+hwT#0DLi!jjX`h=XRagJPX21}R;)^6pAUmdE@8TmyJ^%$0vt9rkkiO=Q%8lAtV!QX^H})IA@JnO0{ZQfw z^AmJw8F}ZcZDhBRO2d(Q#M6UZs`3v?Zlsl}Ug8frYhLCy4040guY%=%$)ckh*V<*d zIbrs#lz>T}<~Q`Lu{~y@-1?L3+%03cpxfz(qHj&$rYY^hNVyz&cJ2_^{1#6Z|74V^ zyi?F+TU* zpu~<1+3&4_8bBfXK;3pIPX9xXDWF2$l`+0r?;Mms)POunq(bFKk8D>@{o0#!$P&f6 z%Ido|frSxdbUH$~dXgfp(m<6n%=|Fny<@TynX+Z<=D(pGdFO7*Z%6A6J?-cCLul^J zq<=l->l4qG$f<8^0d`C9FL@K?aqH$)u9tmnaX5#bY|ZO0Li_E2)Z8WHoRs#ve9ZI`Vu^~3oOqw1oM0kO zDlRsBjAX`xf{Kb$7rf(F4l9CEg$Gyy!r5C#zV*0dj_=qfQW_OS#bEPzR%z<0uGk|$ z;|qwbU<%>k#9%)^)g`<2%pZ00^ZF%kKfhK`wY4$pT3nS|1w?Oj?cHh`2Wxbd+i;%K zsfYi;4(V)w=#Zwop-iy@7yh0)G%~*Sy{G5IQIyAUfHCWgL{eww?8zjwW={)c=s^## z+i6g@>R;Pq6+M3HrqkkuaM0=LLUEfgQXo(X@fg^A0i~{;yg*44SltVOuQ4gPtW`dBAkkP(!xHz$elKq{Wi!|}&=YTBU zPqfIVWlOI=GES4rxF`~j*{jJP#eEf7@?O>zgEPOLWepn@jn?(sT}+MFNV0MDzsgAF zvJmQXB&^SDbRsv!)P&9Fc3*xH)R`d%cHY&W+f~q;;%kwj9yDkhoydTcUEYUkepYfL zR6a^PbxHTc>C?k!?K2-*m1v;*Fij7XxpCW<n3b`Ti&j2&PF0)@S;>rXRBJ`p=hJ+>MyFhe0QY$ z`8B>&9X6q@`-S5J9zyNVlvnZP^m{+BayOwHD zxfx2$i32-hk(!GY!phju!bXs2@-(!7J0k!MklqGy3s1WRgn6V~h;0El;~1$FHw@la zBhx(i`lSFCSM3oow-CLG*4IYUxa(iNIuZ~VIQc4-B~ZLVphH>H$r@ z&9S>?sS;XWAI`~h3trzGhZ^s>eP5qZs1qE@)(lL3ho4wqn@ON0OjPz)IJSqcMw@Qu zyp4yp{aWMoGG*|tqJ>V-#~H4t)9~c{$`3d!aMvn#s3ZIq=yU1uzr>$Z>Uw1?jLp1Rafk5=@!yY=RmDV7)w} zxd*CBQ|0?jy?x#iaIm$T7!^d5kvX2N1<#DBrsuo8Pln-wwf+<_jhf9E3YW|$D;4*r z){LUYRb*MYiU?dGbAHECYrCh-Y+K^3pHj17%|JibMgmKED{zL zNV{TBp#2W%!(gKc>p!oH(6tm?#O$7m^vt7=hv-{r`jZ+A8N*wK3>Hz&pFfKkIRJDf zU@&b+f~nuT{yrW4xf~zGFCXHR9FPT&ZFi5X!(F_Z9ohbnKZz^k-KtNI8Da^H9*pA& ziJ+SCZfoVc=x2PE>P9@h%UeeuJN)bommO>oYamoq7AWYQ$(DI#yi<-SJsc86U3J`R zH)3OK+}_)krPhhnzFKzh9i@$bt@j{7vxol5eR@np&>K!YSVwaVIUVLbr(M0b8*9yu zD^I;uGC2^CYFlcRqUs1V~!N9L1o1Qe?|2-~|D>pUu=!QWQ#p`?R$yj+J z@|uHX{?6XAn)wH)v8rWmVIhnW;vUgA+atwSwy;#=d)WqAavLh~8@Ol=B$o6dsPT() zepk2i-TW`t2po*b!CJJMcTv%XUdJraoYKDHm2mc0&ATf#0}))APMu@v$y86-2cA^C zhoBj-!$Xkg9sFKSOy<7hbRw?svFDN4qK`xFP0iSzW%bKM`!c~Z(q4&DjwAP}Il=CQ zN?i#l2duUwpcnqbMeBEl$0UJ%iLiadCYik>P;CtdrahK7D61Nq1LHX6zNoDEwt`XAFuL zQav6Oo6{A}C6br7rp+ru;_1UovMNku?8`YNphSp{(V3MNlwV>kz?FG`Hih~-nxevv z!6(}2ycdOI;9}97x-(scLH@-uAHf2OIQSNxf!6i*%&wSyd3pC~%AX`Of`E);mC zqYU534di;~aoc`%E`QFf?F;$Dq*E-=l}FgHuHj0+i`cnP<~AX4z`uuq{+Jg^DnA6OOBl>h&s4We+dk}HbMPR3 diff --git a/icons/mob/mam_bodyparts.dmi b/icons/mob/mam_bodyparts.dmi index c9f1ba70e89616558a049949aea4de052e6d5938..7de9b40734b0bd70fe918db43421a168f150f464 100644 GIT binary patch literal 38666 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 Iu310*Z&WXiv;Y7A literal 38375 zcmce;2|Sc>zc+l5>>({w7_CyWXU~X)h*D%C`)!zA=%gLj3s0bA^T3q z48}6da=ri2ecsP~-t(O2oag?W=k=MHYs_5Nf4hFa?{EA5=hZE3wFAt@nIQ-|prL+E z7lP=(+kKOa^x%*~VT%C&@cZ61aKHA@&C1oz+1<{`5rVvvzQ)~jIxfcXqWe#N0cWPb z;Ukd&vvnU2+G(cW5?u1X+|HJBq*&9z={(t?P} zA{i* z+fU@{BJW=J9;junl$Daym9O(|d%*~je`x$aH%c+?`3CxCG zwyA2bCq@lS5A3PW)(;L<*dEx>O#R`g zxT)ipnlgW5-fl#)|NfF#HFK=oF@452hLh+e#|~ZcS+-j zeM0B!Qw(mEAC+~PFY*O_40hy~M9bWBiv4}1=|P%#ouGQFF5?3C@5jYa%tp#_Q8y*| zn^opG&}%QphF)B7mlMxwF!@%(rhY!}SgvG!Mr6!6onuj4>6<>+#C&cWJ@Ao*%wpKw z)bvak7k-Ah;yMcik3b2xE-{vz(K9h;?G_nN%Bt98ezWiHLo-BoLC?bS zazDdPyPOqDBnO5XmX<4v4zQb{^;|=iS!)ZI)!^!z~W!~|q-7;FfF>)A^BH>4fH#42QQ#E{q*bRLlxWUS4<8^->fsgyW&lCw1E~-I9af^H9+>&5 zmqGjAQeXe$Wp2N58_OQCmhp}l_bM!SKO!=wotM%s^aQ)YX9uU=u=DzSF&)7T_r>(G z#|aMxSdh?Kj$|cb_qjRGSV$(FqKz5<^-H~SEu(_myW%U#9sK6a8&Pi70n?;I_V4|B zu3B{cqoHk%-V}n`rAp!SjeRqy$|T~`HDr|uctwdz z(t)IbgW~?x>A2yp=H})b*b6yEY=0XMgExfMcM)^L>|t=! z(63)If6SA$1rh@|o~JcGyNd8qZyEmz(-i)|KMxqOXi#tS2B_C)({O z(i9snV)}@O1d}8WTjQaLC#QDmMCfKv`W0I=E2wIdVKcCB^g;FSSPj{X=Mr37DXO6z zwDaRzCv9Pk8@9wAPaRoC?n}f|yY5W>bp*8Vf}#bf`&_BdA7j}~ni-VTzqLc@sAPHj z3ES`J@nnX7ALy+3*SbWOti`T8S?;S`a|is1Az=Ga8S_0AMv>=o!Ea|v(T28r)6nt5 zy;`E6N0E_ZUFl@5cOOMQvIkp`bfWMiCsOxkS!{Q}^5gykW2)pueNjq8tQ+D7rEjix z%M(h{&FEty5{ZTmG+|xfq!?p*=iA2csTFj%Y8lEzosB*yz1GCm6f9{N>~0H3^-x;+ zD2oQyi4$-X(W81fae4q}M_uq^)CDiWU=UJLQVkRer82bW@S4vc!8J6xlvb)3)$S{$ zMl6fnLZi3P+W+B=aO_t8(#6&i`{lIq%kyc|?ZPh_EjgX&&6*~i__9|PtjvZ{yM@C6 ziu38@48(uygBh8BC?+t&{}b8@8u?e0{6Ai1@rZVEOS5blXm2f5ZT0pWMMt+QW>d70 zBb8$Do+4460(9iSeY-R#e>3p>U~iMusnXGcMgtZ-uW++AG&f)8W~I*{6Ycwio`h=z z{sjTi-z=$P?P+67SCNx}0ZNR!Gz=R-;+-Q{t3%K>JR88P%orN6ihq;1n zEPLz`Kn%@T;pZHDKLr^IdsJj>PY2bq4%cW6Cv$AT^HzcoQVeb|RooG3G|G;JxJ`1OmC z`VI+nFH*C^)wdZ*oz$;izrMTrxBsC6-#FumlfevP#;>Ix%T}m{!G-dWDyOg{T

B9_81wl5^9X$eXVr>d$%_y<0RU9P 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 SRFWwDr=qB#kbm9$`TqwYxM;cn diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 8576be384b..7ad30fb7b5 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -161,4 +161,6 @@ h1.alert, h2.alert {color: #000000;} .monkey {color: #975032;} .swarmer {color: #2C75FF;} .resonate {color: #298F85;} +.love {color: #FF69Bf;} +.lovebold {color: #FF69Bf; font-weight: bold;} "} From ad8af9f9ecfa86a3274c60d1b7cd748844e53572 Mon Sep 17 00:00:00 2001 From: Cactus Date: Fri, 18 Aug 2017 17:27:07 -0400 Subject: [PATCH 151/164] fixes shark tail color husky ears moved to extra instead of inner, in line with wolf ears --- .../mob/dead/new_player/sprite_accessories_Citadel.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm index fc99a87eaf..ab4b044cb9 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm @@ -122,7 +122,7 @@ /datum/sprite_accessory/tails/human/shark name = "Shark" icon_state = "shark" - color_src = 0 + color_src = MUTCOLORS icon = 'icons/mob/mam_bodyparts.dmi' /datum/sprite_accessory/tails/human/shark/datashark @@ -326,7 +326,6 @@ /datum/sprite_accessory/mam_ears/husky name = "Husky" icon_state = "wolf" - hasinner = 1 icon = 'icons/mob/mam_bodyparts.dmi' extra = 1 @@ -390,7 +389,7 @@ /datum/sprite_accessory/mam_tails/shark name = "Shark" icon_state = "shark" - color_src = 0 + color_src = MUTCOLORS /datum/sprite_accessory/mam_tails_animated/shark name = "Shark" From 45d6ece7a8fa6ceea2e7a3c8264339af9c877143 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 18 Aug 2017 18:57:53 -0500 Subject: [PATCH 152/164] Adds a warning to the traitor panel for the last headrev --- code/datums/mind.dm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index d943e417e5..a31aab8607 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -400,7 +400,15 @@ if (assigned_role in GLOB.command_positions) text += "HEAD|loyal|employee|headrev|rev" else if (src in SSticker.mode.head_revolutionaries) - text += "head|loyal|employee|HEADREV|rev" + var/last_healthy_headrev = TRUE + for(var/I in SSticker.mode.head_revolutionaries) + if(I == src) + continue + var/mob/M = I + if(M.z == ZLEVEL_STATION && !M.stat) + last_healthy_headrev = FALSE + break + text += "head|loyal|employee|[last_healthy_headrev ? "LAST " : ""]HEADREV|rev" text += "
Flash: give" var/list/L = current.get_contents() From f7bde6a76a393f93187577fdb8bbd38100ea7100 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 18 Aug 2017 18:59:58 -0500 Subject: [PATCH 153/164] Makes mixing meth dangerous again --- .../food_and_drinks/recipes/food_mixtures.dm | 6 +++--- code/modules/reagents/chemistry/holder.dm | 5 ++--- code/modules/reagents/chemistry/recipes.dm | 2 +- .../modules/reagents/chemistry/recipes/others.dm | 16 ++++++++-------- .../reagents/chemistry/recipes/pyrotechnics.dm | 7 ++++--- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index 17662feb6e..bfa8b8bebd 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -13,7 +13,7 @@ id = "tofu" required_reagents = list("soymilk" = 10) required_catalysts = list("enzyme" = 5) - mob_react=1 + mob_react = FALSE /datum/chemical_reaction/tofu/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -37,7 +37,7 @@ name = "Chocolate Bar" id = "chocolate_bar" required_reagents = list("chocolate_milk" = 4, "sugar" = 2) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/chocolate_bar2/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -91,7 +91,7 @@ name = "synthmeat" id = "synthmeat" required_reagents = list("blood" = 5, "cryoxadone" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/synthmeat/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index a062d5c614..54d17497f3 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -370,9 +370,8 @@ else if(cached_my_atom.type == C.required_container) matching_container = 1 - if (isliving(cached_my_atom)) //Makes it so certain chemical reactions don't occur in mobs - if (C.mob_react) - return + if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs + return if(!C.required_other) matching_other = 1 diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index c13ff096e4..428c10e24a 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -10,7 +10,7 @@ var/required_other = 0 // an integer required for the reaction to happen var/secondary = 0 // set to nonzero if secondary reaction - var/mob_react = 0 //Determines if a chemical reaction can occur inside a mob + var/mob_react = TRUE //Determines if a chemical reaction can occur inside a mob var/required_temp = 0 var/is_cold_recipe = 0 // Set to 1 if you want the recipe to only react when it's BELOW the required temp. diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 4151a2695e..01195333fb 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -51,7 +51,7 @@ name = "Solid Plasma" id = "solidplasma" required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/plasmasolidification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -62,7 +62,7 @@ name = "Solid Gold" id = "solidgold" required_reagents = list("frostoil" = 5, "gold" = 20, "iron" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/goldsolidification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -80,7 +80,7 @@ id = "soapification" required_reagents = list("liquidgibs" = 10, "lye" = 10) // requires two scooped gib tiles required_temp = 374 - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -92,7 +92,7 @@ id = "candlefication" required_reagents = list("liquidgibs" = 5, "oxygen" = 5) // required_temp = 374 - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -103,7 +103,7 @@ name = "Meatification" id = "meatification" required_reagents = list("liquidgibs" = 10, "nutriment" = 10, "carbon" = 10) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -436,7 +436,7 @@ name = "Foam" id = "foam" required_reagents = list("fluorosurfactant" = 1, "water" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -453,7 +453,7 @@ name = "Metal Foam" id = "metalfoam" required_reagents = list("aluminium" = 3, "foaming_agent" = 1, "facid" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -470,7 +470,7 @@ name = "Iron Foam" id = "ironlfoam" required_reagents = list("iron" = 3, "foaming_agent" = 1, "facid" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index dcafef247b..8ca65a6588 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -140,10 +140,11 @@ name = "Meth explosion" id = "methboom1" results = list("methboom1" = 1) - required_temp = 420 //high enough to not blow up in the meth syringes + required_temp = 380 //slightly above the meth mix time. required_reagents = list("methamphetamine" = 1) strengthdiv = 6 modifier = 1 + mob_react = FALSE /datum/chemical_reaction/reagent_explosion/methsplosion/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) @@ -154,7 +155,7 @@ /datum/chemical_reaction/reagent_explosion/methsplosion/methboom2 required_reagents = list("diethylamine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) //diethylamine is often left over from mixing the ephedrine. - required_temp = 420 + required_temp = 300 //room temperature, chilling it even a little will prevent the explosion results = list("methboom1" = 4) // this is ugly. Sorry goof. /datum/chemical_reaction/sorium @@ -269,7 +270,7 @@ required_reagents = list("smoke_powder" = 1) required_temp = 374 secondary = 1 - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/smoke_powder_smoke/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) From da6e3d7c8e1d68543f4e4cea043b3ee0f9f3563c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 19 Aug 2017 06:45:50 -0500 Subject: [PATCH 154/164] readds toggle_hear_radio admin verb --- code/modules/admin/admin_verbs.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index a839b35b3c..3276a319db 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -12,6 +12,7 @@ GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault()) /client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/ /client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/ /client/proc/secrets, + /client/proc/toggle_hear_radio, /*allows admins to hide all radio output*/ /client/proc/reload_admins, /client/proc/reestablish_db_connection, /*reattempt a connection to the database*/ /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/ From 10807cb1b95397c9b6987756a3a7e0814cf8b5e5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 19 Aug 2017 18:39:13 -0500 Subject: [PATCH 155/164] Patch DMITool's import to accept pngs with no alpha channel --- tools/dmitool/dmitool.jar | Bin 202277 -> 199210 bytes .../src/main/java/dmitool/IconState.java | 5 +++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/dmitool/dmitool.jar b/tools/dmitool/dmitool.jar index 4cfa49f36de43117f01bfdf95913125b0fb3e5b8..3e99778951d6afd8256b1233ac2c52db088ee1b4 100644 GIT binary patch delta 35898 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 delta 39153 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