From 37c1cf502eb9752803c77f4175143d1d8597b2ca Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 26 Jul 2017 15:45:14 -0500 Subject: [PATCH 01/63] 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 02/63] 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 03/63] 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 89e29a036cef4c545e8397cd1f5c8d8f941da69d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 2 Aug 2017 08:52:47 -0500 Subject: [PATCH 04/63] 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 05/63] 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 06/63] 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 07/63] 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 08/63] 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 764ebb2e5e4d50f9a266cd1a792d656c661d3a65 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 8 Aug 2017 22:24:01 -0500 Subject: [PATCH 09/63] 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 10/63] 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 11/63] 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 fca1df9a2bd67815eca77496ae93e1ddb6b03d54 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 11 Aug 2017 14:54:00 -0500 Subject: [PATCH 12/63] 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 0e7b9a008e560c106df44d117b6d8baae4282d81 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 17:54:27 -0500 Subject: [PATCH 13/63] 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 14/63] 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 726ffe1fdd8698d01e960979a269c582be869bde Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 01:25:02 -0500 Subject: [PATCH 15/63] 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 16/63] [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 17/63] 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 18/63] 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 19/63] 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 20/63] 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 21/63] 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 22/63] 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 23/63] 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 24/63] 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 25/63] 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 26/63] 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 27/63] 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 28/63] 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 29/63] 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 f8329e2a89a5308b482ec1259a3f0af422429347 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 09:17:25 -0500 Subject: [PATCH 30/63] 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 31/63] 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 32/63] 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 33/63] 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 34/63] 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 35/63] 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 zG7HCjAq)h%^iJ^9P`~;`ineYG)Ogy;SDo=$;JE7%6)H&3m*8sO#W~2BF4U2#V{y6P zt@gR8A$<`5j0$XV3HY;!Us&I}08Xs>N-vl?l6Q3m}Z_0a8r^FgQ`yQ#=SnU() z>({!AL~zJCxH2omPU{vKKOLX2W`TThet!P4T#VO#{Qw3fVnIId7|iQ)UJLc)@#DMD zN~x54P2qg|l#_l^a&julX??OOs3Ca5y6D<>Y&x`h{OU~fpHHtM)|B-&TXM|ADr77i za9mZulPPUAL`_^j+b40xN)1-=`g_Ada9@9~R!~zT{mZb&)kjRXj;yw-YVR4#H>=jv zq@<9?r=F|QzJbTl+LL+)}XG@E?1H|X3h1|6c9{W1OOExBy=KE_5A zk_jNRSHsQI8EU0swx70 z;DrKv=ES5Z&?;Pg7Xt72iJ5;AE5(Nkx(93e!RUk<4j(~sKdp}0kLi6!t-&l(O?o?r z7Nz|$pm#;^bSlX~`uy~(dQ_T(BfHObzF8Ca+{#10AgfSQH}mhJ&ySH%N(vpCy?b+? zR(H#eR7ul&%i!XUTyLAm(WxNF2~?q&0G+QINpIi2y$UM2O?i%eYD!i~R6ogPD53fG zV!z-~Pw7nB8r?Ii*LkG0x$GdYI~F8KbNz%jK|2nQiX_N#PxK+y=LTROaGi4nQkbU9#sLmx84c1{czrep(<O=C}=#|*Oz(G=GwKU5#S17 zZu!Fbfgq5AE*@WK6qlb~x}g6a1+4=&3m_Gm15g^*T1}maZT$N6rI@s|(eP>EeF|~i z!?sXHRp}=?UQdBfS-_}=vRafkEH?MF@9w`^7{bSTNFHO&1-O~1C8-PnNL2K@n>8;T zKv>R;U9W=MmzV89<$12FOSAxj=jXrx2X*r8@l~BIe>f_hsr70A8u?pe*h|cx8RB783`6tw53$Cvu`!gd z_rXrpR>ic>a876@AI|mv5_eOO4@@)a5iCRag3qXF*oP#x1HXa9VC&**;SoY_Ly99M zx{fqmsC(qn{+`dP2{+hB-;y}UFW3#!InK<6x2NQ5RtJ#_(vnS+I1G|m5U|7pP(NBT zQ_)vC7sPRUmiz<6_7oGFDJ1r@MFd6bL#MFV^c*xl`H-GNpZD1*OSgkB2XJ35!J?21 zXt%%ECjk14|EA$cN$_`E@eR+Tr@ue*l*3*!c5b7G%(T%~?!dsxDkZVSd%cOo8NQd` z2f$zFwz=$=c1k}SD$Yk3#H8A8DRshVNS=85!`Y(;+?lP0&@<^+ah-gjQ4nt;E=1{KQ-E-`7bP z7F?l$ubvp_>+=Ub5x85(8z@=C?NLrP=Z5Asr``mzM>FH$_cP!Pc6TtKWk;<1wH-5b zyL|2IqlHH1eHEuzc7+WM4Gn^$(ip49ZsMKXo}carcp5;|w)K5{Y7A$?g2@Z!);RRN zsvx@Zqly-?C8XIBwwI`=C^hNv^&c)hQ(FstyU@E5j?jYNrZM|{>7Nh^$;#Rq(QpG# z2-&`?E1gjN?sUO82Q=?6YD1a=i>H-x1tcrW+9l#i$&{A=x`?4TIS+XPHlg9r`ndnK zWw>dN99{+(wG!tUr5`>AD@c>~_uU$|m1YPY5#cNn7T|`EbKF*c1e*&7!M!^war;X% zKDWA2eIL4?Ohs8$cx>Ni6ry^VqVS<15z9fNk>@_?M(_?q{cr{=gLhx;T!2bItIv6Wz+G=vlcDqsVw3?bm5HMVgkQZAxm z!bf^_8=FFqLnhkyi8-+4?v(u-XDhhlr}U^whF3vW&|gn_oDkIXAaX;P8&FU?1O1|6 zmLU%8^n>C$21qqu0oem@gE9@2E6>DD>`}>rX6Vx z1^~7WmQlo`Td5Id`Ei_us4#0b(~?c!>KCII7vpypaw%H4woyeBj_%mgr+ z!ac2iM1E#6hwt|I#Ju#o=ktx9=gZCr=M4$VL*?_ROB|<7JE7vVcZ}w<>%Z?Bv4AwY z5_+Cn#F`qCxKa0Jdz8m6erDj6m|KF^7r)Xkoa><1KxHv4z&*63+cnYe+Y<3242xPGXm2C%-`YalZF=P1)lb~ z<$!!iPTzFN^M&k;jAzNR6x2&-+6_~8^zgI`@qd>uA*^5EvON}FsdBg4Y(;d~26LIX zGxUE-a;*%FkENInO~mpdh3@&g_5cr_cQpIHn zM!+$@(l*A)Bt@~jjDENolhM(`GlqN@ik#`mL?pg_J307&YJ(p@i}qBMGJ7v@e;a6%RJ+ZSdx@O$Za131zM`w+b4`jBPh`L3xZ5{~aVIXS|% z-K>BMr=|iqbeYo;*_pb+FD#RJhUAss?OY?5295m-jVdg_ZSVF*`ebe0Na8q}R~|ta zA~-&c6au&+Wil?}K&w;EaX3kWu)AsQ(sAy(GBPS78HvaU*_9D0MY7^HlAXQB{X4Ec-_P^>p4aPny?+1y`Xk);bzk>& zo!5E3=W!gTHY3r|Zp*d^m~E~1+)P>gnLplUmH8a2E3;&FYw1+XSXc5>o6yVjH(Ik# zEG^WNA0h@P{4_y9CVcjCUD+~oMnTUyp%eNjTVX*X)|?>xQs`-k_b-CwAE0(BW>k8~ z*#-Y^Lp9K4`ui#S8llLpcm1(Sh_~?(NO2@qUHK0}-LiWtE~&P*_BgabE?m5rg&{-4 z#CHreE~0n@zlP4&Im=~aDTK?muig&bqWyTpn&;2oLk)f-7uQZv(bJahBx2DccG5ym z7hW0?0cJpSLkQsmtn})9wSpxP4J4&kFZc3MUy7sRef#!pkmE#A5hLanVsGNPL4Ha4 z!~OqZk-Qz>hDjp3GTqpQhR^qJ-@Jg&-^8~%?%VBL^u4`3fM^*no_t2MVnLtWgf@WK zX6Eed>~DAv9*XByhg0PAJavUaeGUE`7wWDBh#df3g^m$$r`Ep;v@AEkyEeeXq0>Ck z<;`jeBc!3QvLA&ssl9u>Bt0hrv{B|FsI|MD?3n1awjs2T0KA1OLj2-=WVy?ul-1YS zJ&dHkrAs!at*k_C3cA<82zBAno&X94T{cqbe5K?C)CM*L^r;sZtxiUgyxji2V}z$_ z=)HRNYHzIDUw^+FS^9R%^Y%iOtpA-ZSG{_tKkW>@MwzdYAratgf}4gh{tnfjf4EcI z>&Nvn#@!$8q2cK=@Z2}CZ=z$&Q?DJfXmz-3l^M=dR4=2VQA0uez!fp#BHkALEo5e7 zZ(t^e|q(SqnXWVhUzO^%^ZHde4hG12Jj$Gu)})1gnp3=;^~PG%#vN-Pw`cvGI4IO z=n)YYS_aE6?!N5O%^*A9~sH`hzN z`^^DMX#zK@pL>m+um~yva#$V2_yRVBh^o@4J zun}_?)kFd}0RTo1D|wy{mPy`yshy(hO#eNvIk)EQwG3~qmMd_vuNN5FqWRLloYl!nB>80M zwbw$4$*mGL`8K9cuC)s$A3SLI;$BtMmZ`3rn-dOP|NKJG@ag_UR%fNBKFWembr2B@ zXup2ob&}>7JNwBkYyOV0x>nWg<)@o_=63bZlxKu1I&a~ zUWI4l-r!4z=3J!1IG994tTz7j=vWu#6FM=3J`3vlVAgiJjmZ&xVC{B(S=nvq7JYNt zUYJ2JxVId%-tyt&$1F%OHQsVJLRowo1(TgP3OIGOI{wOeTNV zG;nl*IzTjZR8>{cHGZF#S^9vOoLE8?$nK>)mtB^z(nMp)tG7iajvhJk=4SudU$^^X z2q-OV$lY5M4=$U0ls&f>tjxA+!AUeUXai^Zm42R>r)bSefoT5AvGGilw8c7;Z@%VquUi%xKk>li7_jB4KS&htM~CR(B!KI$Bs{Z+rYP z?>A1vx<0dinNnXkEv%}(119}hTz|0Yr0sL9y(zwwNkh-)uF zGZfgZF$@-O*PAzc0lGlZ%#9=VYV7SbH*VZO^xzpUMze|^UU_*3Wv4#xBY~hzByu>^ z=U$CL3&AHRU_($mAP9ia_kdwyCNcxWWd9}zZa7?*5ef4%XgYcutqke80M+#E*RMc$ z)6dcS824TITuzK|q>(4LhTKf}w08p#GJb?M?!wRGOcDril#I=vyI}1W%r9?F;)%rwY34Kd(cD8^s4*$}_3MdU-FeZ-qHP zR`O@i3GA2mxYv-#$P_V}uV{r5RlSCWp1~kqSOh@Uu6n3(Zc_EVg9y9t| zON$?|h+rFmGH(!O038HVvlnx#z-2<H2R~d zZrYZ6Jxca=_K%j6VZs_!xz`)*CVEbwLr03aHRuW*ti(J8_InSp+?JR76{?{#kS_7S zsMB-l2JyE{iIQ^Teqy#0k+}KL(i$GjnP$UV>*w8nfdUC{8ql9BPrT`al~OfUI4Mf= z(`ozFug~5?Y)b0dH+~kLgDgaGfB>Nr;bMa=!#c-@N`n$AXa@+`! z=E;ZK4tFiyD(cvB*g=peqT-DYvvJ!sDJPM^ev3pFfrrt9rQ+F7_7o}yDM97z*(%5j z5b-g}7#{{56JEbw@4aTdwu9s%?6et7Hq4!O<6s5QCI6ymC0~KVhYc(x2kIot0^4nh z*5_RL@&R@ORBS)2JmacB?)f<~^;Z2GlEE5QUKYb;0FJC(xcGOg#DMv1g9Y@D+|7^#p`IV zqapE>*?4#YK(2_^IsQ&3KjdS#7yKnY2xYoApf=ndCI!&lwHNq>RRwDWm{GWpA}Vz7 zn~0HyrD@JqowWscn~1WD;Z2D7-{~=D2&QEZFnd7INZsGCeUJD-63g}@8@s!^U#6!k znHKCk2FmTOclyCd?AS?$+u+W`N z;lu%B+6M&^?l>HYDX{CNMHtMr_a-xOQ;?P+EPQOY$rTVCz3ciuMDM#AF8M|1=DnRc zNF~@qLPC&7ZyEo_aHbIz-aDT@so>@Bi5#^_g+YYN-gotDd7s0KD0O1^tR0+o1K;i6 z><|$FmXa`=sLpSZGNtzfBJ6lmj2dCLSC%ML`LA&b!6*dz*(PCd^oyLuW8EiJMfwmS zhRD0m+o?zGr9nJp6cQEX2P@T0R20!Hg`p9cv9SwQSS^r;%Z27Izmya^02EPsO=urN zoAQ|V8sdIjCMvm-Dyb8}4K_sjzuY}8V?+}jZE%BvTNx)DX zKX;B3JyPN>@gZ`jr6M}@fS(eHCyx zT^Sq3?GuRu5jGe+r*WM1l(>+)mZ&+QKOtrLV>j5Q{6~&##rY~Q{e@E};@tio9wn*< zu|UrfcA2O*U{T%GdT~;9Y~|oqxSo?iTkpZx_7o0hd_-l$$JS%`A`08alc$xFLqe2m zcTH^@u)WLv;Iq2!?WNv2o=>xX^;qAG!+Z_lj50*Wn*f+8-Di34%_{#g_c>8!EWvEW zSbn%wI<*}IDiH&^Tdmm^g~``lFl=u-W0`->|HJ5X9Qxx{;l~bDn3#rHGV+QU^x)|R zip82?uk|k9zQ@RnaVkuQ5h7YD%6HVh8t%jh`uSNuVA@N-)bDNF_3y2X+EM>00I8TD z=EA=n_x^u#fT1qna-OKLb__X8R}DH2fySg=rw>#tP<|@_zQx96n=S77SQ92JXQ8>h zOjvsO_>ZE%xxcKv&c=NQjel*nh}^+8OKz14T#7wkO)}#K;&KKd!^PZykx`|SON)<5 zlCX?MK!21%L&yX9c;3rt1gryuzNsGE6Y;icG_U*ku@$(1MG&T@p&m0##C;8gE&xye z`x7;jM%L{|5*6UxBHmU)l6Z#evdgi!L-q-)$hl98SEGEKsqyTP7PoQ-~M zLoR=E1N1b-ZQ~ZzlfH-8Qv(OFGK`FZf!gW$^VIgIPNle**bjKy!P}RNj57B)1}m=| z1!+2KBzJ{-*b^`V&1m`#u(R6Wi?oc4SU1gVu%j|cG#xeWkSf<-b9C+R6-p+30TQ~x zj9xe)c;+jQO%!2kVGrOfQImKs_6Ojgd(+d7M7CK4`yXDh36ao!Tk=x7iiSot-nF=X z(dXX1Zsbpd5sts^5KQwV*#uc10qbYqe5Iq3Ijx=VjWf?7sDEbbdk~pGpMU%&VR>8V zF-JtwXco!+Xl`ydUE)+#Ay_vSnkA#{&sT%eTd3zf1_y##W?#K}B_@7~e~jvB!H%Fp zB9b}IeUizsgV%`G$*>wp3LIjR7!v|cMKERoZ`671EaD@nsmSL(ZKvE2O^eA31UPP5Nn7j{haj}!WTdklfp0m9Su@Z z!@Tf^qtI9VOz5F#$R?~GQM4wcl^Wc-{`*ySBUrIVT-&t`mMJw;Lv=nnp&lQUUBiShTqLm<1HfW>91ae z_T~GQ{TB<+#@N!1GLbvLNW@O+ zpJ;a428D2VXQb2-TZfTGyI}3bUw@KhRGyBdS9pUTs8et&bAN}LY3Qt1eVLhgN?SWr zJk%>OQLufQ9ss7+F#6gn`Iqx2Cmk-{;LPTHuh~g0G1E>_gxK^mDbKkgO4I*j(*$#~ z)y}()y_XO41b>7k?s)fcEVmOJ8Op;S5Y_E9|HOtCkr|UN139m6mSWmtxLqZQBr0|b*(LrEv6xOM07^HxL)R$7g1hE+bFV73!28pSo-rY zY*Hp4=nrk%Kv2oxzaqEZLW^&))ME(_elOl~UtQ=&Fzq{?m0zN&qEe2o67dN!cyCCU zzejcW%xhmXH;0J7aHqs))Sn&t9%`R|_x!&Z5A??nczei=qzUx*b^FCMZ1ne8xCIW_*n)vE9$>VbQ1{3Ou}Sn+rDi8tFqUGgVPAnNORgICB}O8D zJz>sJ&zWA%{dkOPKwYtdCLcl{*RNl1FpI%keB|YKXw>`@a<>7Sd}h4>4JIe}DbZ)`@#$e1T9~x3lMX7N^TAnVfA@*GELTTy z+*}_h7rLj1CpA#Awrf;@JdqG8omiRFjo(b;YKd$6&FrfLmTO6Si89#rE%1oLc?;*pL zH)qc4Z6`JKdscGtkbD)8Gib%xuT@qE*NN=9Iwv`~Je;bhn_TttBwmQmdaHHYx=Z^* zbaYti30D8A`oBg#)9;Kzcx62P>W$|taqVzb$?ZSQ7-occZ<5i?%YQMIzerK9b!u!h zYaw`0cNbNc>{%2J5DqPCHHmYfdn!oSDgI_tz{eTiJJtiH+CAs%s#P^AN0UqU zk%46TRBV>b%d$iCcR#T%_);ox&g;>KquYvA^LOqOK38P9a7dgw{&;btsM=t*$()P6f=M@ABV6zP zFE-%-C+ef$>@(1!5+Ia9bj&Q>-xAWZw1^PSa&s<1_Tx2V5l zXmGtu?2i+yZzgU(-q6f9`|R2ISa;?0yCbw61p@w`_3wnb`#IEF2IJe*gqPQB%^6ns zmZy+LJkJGb_4f#dL-+#a%1PmKB;wj}_fN7I4_RG|*mabBI^wPPY0jEQuVVF&P0I#^ z#eV+H&&DZlP@{-zkjEt6XwId==fLslb2?S=*Q!okTSO9f{+YBor90mLb6yNqZX%<8 z#YVYuhE|4%OA(vp%1y;GY72U9)&)Lw)5wU84!d5%7JO$O!y<>F4ExUPj)8kJ7v%C% zG-pUbGhadUWh~vX_jiahDzm=PCmRG-pKqmmh8fex=gBG5B=kvPd6)D}>Bn;dvDvf~C=Xfc*Tim=D?DO9%?no;(y%;w6=UBzaB5Uqw{hn=4lvYh? z)qe}yKk~q0CB?f3#`;Oxl$%y=d5`7vUP7)sn}a^2i?L0JEVWttXQVgrWJN=>@nc3& zrToh)s$%=ooslqWsQJ*PWmEONgWQKn4WF#SS_sIYuhl2F;D(+`Q?>L*K5Jx0jq#HgR#y4J$-ML=2JkB0eIOBiOeG4pp>uo|&0>2H6iGZ&g~_ zIaORMt$B@eUvSXAM@k~46O;LytRA}tXXUz?B840y?1}TTv~{yXYm5lfn@#>Hw>Uok zj#QCL`>RuV)SNxUk{Gt2*Fh=)r*lqZx?>Ss);7F5u;Y7e@IB1#!tF!G{2!K<_`oJ% z7U6o`ATKg zBnncM3uwKNj1ec(iJvO#;gfZFQ^)piLly23*P9$g5p{oQJvp9jca0|)1H0{}kJ3mW z2SQVvhz+N2ZJSW!c6&~|XP#xcGF-=QwIl6Hb>X;P`5cL^3k41Q8_J;(E=Q2y7Zh~h zg_x)4e{!fA69VopXlQ2jqUprI2b(@7LAodObFEinZW;TdG>#VS48)T63~w;PrUCLd z|EOEH^dKuDGY?4(yk#JoDsk+>r6-Ro2d}_X!g$K|iKR+tW$QdG=>1Jt=bo$) zr#sBq%+n%L&0Q&t+3L5;JSh<6CB}e_p;GXl5Jf^MmL=f=cUUNzd5JjQ^YwMBI)Tig zuQzjaBjtf~i%4nHjIEQqXsxl6yFh|sHGS0bW?tS5GGNs+va3^Z)buo2n)V%@VEXJ* zk1|%}E>@sIw_oexMJt14O=~Jjk^F}bw}wi)kXO;$epk&zoxea4cq-R#8puL8vrZIm03%B8IU~QKKSa^UD0f)z|+HC?`O27BfT<_+8!2 znwpv|`>q6LAK@2Rw?^G7wLY+>8YP^fWt|Wo;v}8^zK@giWUUL#~0Rselprolz)1X*>TtJJvOKQIv2e~aTGOD0Tk_U%n5UI zL0mW*Qryy`3RgZy*;o+eKKaFgor9xPl);>MJZ}e;!K)$aXbV(IPUj3JM1LI**MGI7>U*>f^>ZOSXgUt1J}gen_3#qMLY zwW|;D7G`C!gLO(x$z3S}fYt5(v1PzsbU7}vjH#%oKvOQM|8}ogbl=`8Mz5%-Eg|7n}7AJl69=C z&72$@Y@D2py%d~Dm1i9%W^_tYlHu$akpb*FRvJn{?A(n`ry8d*`?>QRVxje&ZTuVC z6l7&D@yXac>$gY1{ZHgrjdKj_?jaID*0S|6vbVL{uCn5vpT*`CabaIYHg>H{$Tt=W zmL>F`S*AbY_IoijaayKS#%!c>^{ZHCjV;OzC>%17wj8hwPr0hQD`fdWlxfQsw8v>s zKIY?-OkzPyZa8#sW4qC%h2g;i*Y7NCIsH>R%422Hgb{CfHqpRg2o#EqnWtoAe7&lj zF5pSNoN~ux>6VZynTB6PM78xu7aF)M1;46(?U zHFW`J**i02dpH_)=DP)S84_^D#>QQ))QX!`{#w$#%$+5{*}Y4q7MVFiEmgCUkVsQk zXThi)&t9>ZD_&I6HK5I!;~Mz2d9jW8Gd*gwt`^Vqd*s-^&g=hFjxH_D9P&R>a%LS% zGW6Ilat?c8J-Sx4B_|~vlNDY)>FjP~UOn~&jCVrO3p{P)$$`9b7o2yqZn7$Vnv{Q| zf{Un9{+3Cr{&iuy!Vka4iprCsLki;J>zSCC)NJlaL@4g7VvH9o4bk^FW+5&LL97IOX~W-6e?H?u!Z`;Cr09Xa|9 zZ7+cL1f!!glZSGm-&3TYMvx+P(ynhjZx2?2OxE(_p_yZq>$g;7>tSyaCVk|X$-_sU zofRfJ9H*0O4qFs&G?MOWzID~#bje?NgJOr z*Q~#0qVh#*s_KPFo^>A>7uO&cxUfq)1o3RP@(7|8leGJno!g~78ZSPzJ`Y|%G{ERr z`bO;1dI;JZD6&p15<0tn-EANJi4B@=w)X2(ONxpr85l%|N^9D2+tG?4gp(eAZO!hB z?H5gGmCb`C6)~ts9e(>IS*%@i3EN`e-|+_`Om@g*77^@yc1f#y!f`XGp?kA)a&{*X z0o-LkzC?J)#Hdh`Oy0pK69@Bx{z<65|Cr0$g;+IuMz^FE(X)>DyOV_Dd|w@Yp1+}| z;fSqf$ol%0Ux>#VBd*`Z__-n!_4?XrG*M)@?08}Gf77Ydxb{d)jQRo!5)2}i&G>LA zddI&ne*n2nYbS2vI{m`C|Kp+8iKze26~Qkd5=nUUfml`l?j#N7g+1g_ea6MkUPDdt zl{Dfrshe*fBiUzbh5_aTi=#+=}!-PC5s{gMuLf{ zuf;bVPH!Y}_~7Y;d% z*!??H4LDv&w~mUGsvIf_>k1q^r2$pi~=xi^2MmE%mVcGX7u^cAjEL>w?sZ_< zyWp+FuZ}Q9qA&YV`katJLT8M)!h;04CAaN&@r4RsBlsS3kahpK3+~z_0Mmi~h($gb zwp2x3y(0bdf_4v2oqfl%6W4eqgi`I7zaQ*5U10N7U@)#k61w?feX`=i9(0CvHDv>! zPJMfkkT4B6^1R_GG*?jIaz&sZk6j%-(0V!&mi-s@UtL2NQZ+NVx%>A~q^}_|amxc1 z-rOck*}U*eS;sxM2>Czzm^Rmp$(`o=_=oa0l*34{^dwQHpVSxpkPY;+Vw{xO8WO*R z#Ml1FJCWoCH<6Mz3b$Qe%uY&@DWeN`ynX=zbfnKwQgkb-cR%N1cd5p(Cg9wL0fpN? zCGK6N*j`3a;zxOCammR0@`VdqVYMCe+vU3GXu>FU*k?{jT|Ka=l0SiemcRdO-0Y<~ZJRz8W>+fM48dFnl>L7A0}kfVR^ zw)XyR?+yZ#i%mg(0{6vuiHmW=Hsi_mfVAW<@1e`GqcmzEjlyIHTlraK{O%b@5^`{G zBo<3L_5UZ5iNO@B$%fjU?DF`>Siw2wn`2`WV_@1_yDp=ji^t|XJi|~pORuM+!++pF z)AamtC#Sb5)$0qwy{alJ-^;n?=N8;OD!rlki-8ZsMdK`T+7v^x>Pj*{JFnLPaH5$s zph#_tGxHLXGTZGluwr3*ls&`=9dCPR{Gl>d+dtg%c5%`5x<$eM@2|<3PqFPr;puD> zbw3Nhn+G;G7Rl-Y-$Q(>$VaJ)M`8F9DE~yCuZaIanY~JDolORQc`UeBqv(}U)KggSkKf9=3?cPjC2nVaGtkUX<}-s zpB%7?7jU+;e3b_gQ;iS3hMUvG4GVuXo}@c-p^{3500s1{v}37m--&NVIPb_!R4jp% z`ZM*`qAtP&RZMMRV}SAvj0)^_kQ@zYXi0#ZT&q!|5tv|;%h@wO#E|zCGlQmC_2kL> zH(c|)9~&{f8R$q)OAE_xd*6qcu-)@M*~O*6W_C-LkB^U+!J0EpJlwwiZ&IH5ncE-Q z7EAGE;qF=JA9ji^*7F|s6g#aU_s!nkzE;Pn4CujNNi$uCKsc?AV{omKJ@0kBlLagfek;A5}>bo2}e=ce9_U z;{%qk>#?T9c_Z3;=*icQVFQ#m6skge#4%={8e>Rz?7i9ZL}m9EUOh49d}e`lCnJx( zOFOc_qvtXHb`QNlN?zX2F#4y*iZ$TqM8<@l4oThtQ~-#t(K+f|5u-kf_nRJvn{Y{^ zlD34`g0@`vqSRE0j#kG>U7KL#jjpKq7Ok91N_otylR@fUal`b{Pd;5ESOB@JTmGYI z*194R55X{KkoJ8ah>4#0SXe6i zlbtT&_CU^ykJRF>yay2&CjqPf}c~jGbY5!}`-DwKsoFG|+ogEWwkw_DY zicVjn)?<})N3etDz?!H}YE|tL?H1Yz6SKcx)taX>rVV}AU@qRN!9&&C?hD<$*$IC?P9;s{@_TKbe?3ww(KFweCew((oarcq8Oy% zJtKGMULYN*=4}(AVOJI)T5I?kAyqp=!|gEUvi6k@*4e!egvu+f9-PVuSUIn)P1`$b z;=B@2Z)JToEo;Sp_cwd){RwpgBG0ovW}ns#f1MJA@U&r!9z>_~xgWz4=gQFM>ZS%T&gj@V(>bHoYq_Cst`?^ny##@i&(Z~ ztGs)GbN2@ZIizY_3LYyl6ElDU4ZyO=^f@FpO{|FfZZh|DP8+5S&96p$T$inIlwE6Y z58K+IFyc6@KQyuK&v~@m`MT5?&}{L{3+Z**HoQ*YK)vu{-GjlpJ9LbWBs6gDr(mDN zqJM<|qrSCCv%&)F4tDEudC`6x@Ba7}DI%cc0|KpV%G%NZqTHAt?>@#&(L0O@ycb9$ zQaMb%(|Ofz#Oc_%yh7`3oK`Mw#{tJvSN#3%uJ=`ZWTY#%$cFB7W8XVs|HGyitRkY` zQVSC^`uDi^T`>llZNBPEj%@IW%xCIVsBg%8`2b9tvHE>;v!z?>nusgfOw&xajF?9* z*4z`J(4gF2fzk*1tD5IC?oXW!+{WJ8_bz0oz<0Y&k$vf-5WJxqNDsFCwV#=9WSI|c zQ^`^z{?_Eqp=G|vQVXAv`=b;Q9n7WO`t&-q#Az2xDAco=nRV)_I z#hL;Ce`8+5p+QS>+(iTGNXVva9y9AS0$dLiKB2Gl&8{;wUA?M;nMC00@CH2Ac~$p3 za*E~+vOt3I_x>Ghh~Y92BDrQp&i^+8<5v#V^UVF#Kiqe!E=0;hEmN-Iit3X`iDJ68 zvA6=RnNWmNs-J)S(D`z-6_}8KY*j_LktcJ4FUf+W2zTz=z(-C1XXmSaDUYo8{3oPc z-+vh6?Lw&6EKG5^njiM1FVt+`OgMd7pd`oHG2Uk4oq*X98IRp}RUAu(FAJ7c9SP}R zhIqp(?&_nj&dR4_lCbQlH9hgUG<@feo~1qB53*a5h=+Iw?!3WAF!$MVfV|_c^|9VI zM0nJx8pU$sp(M>fabI%&>HO+nlH#jG(8le{vn9+pejoSaGlDGwv0453*XljZ)#GR< z3e|Pv9MJ(fj}Fi~n&CPVC-<~kW8eBS${Sf0pONB-IF7t55o+8^jEmNPg1G~4y*@Or z_MH_J6r4WPdokVHpZxBen!5=iyi0SzZ)F(cs63&&1X1+h7p2)`U)=jPXr3eE>D2my zQ)4GXKc)&|1GR4i=fwkb>O757i^!YM$z23?Nv@h~b_y|dggj*}Q5FF+pvtN~eembh z?obNfaxwQb4r7GM zmt?Mn^iNpaz051YzzH zGUo0XP~|+A{D~)ExMSE_eU*7GGi0-#-KnbX!ovX)7g@o`4sp69^YoBLjj8PFz6GIm z)*hGFjIPX4PCbJ>0iT}j{e823uU=f#D22Iu2vJiF(b|?Qj#R|k|21MX%zIkJ%5OVXe z-fwOhfVa*c+KE`}L~Yas?g$CPS0w#M<~6ooj>FzgAmSW0zj9^IYtE(#zq>Jr)3#9B&(ZF=xtuBa%1yY! zLDBgwf`9AI;%G)yfbk%wNQ6V!EBu(Xb$V0fVA%f=Bl!-FQNho1@eB?O+`qEo23BTx z)y{R!o*hho9ps8%xq6-GNwaL=Vb|JidHp&K2{pzGmqJTZU%#Fad@p@C<}9$bsZzyI zNf!+|wQ*#5h-S0G{1TV5t4(E9uP$Hwh(@8zK=9zT9pxOD|Ux$z)dcRCUr za@T@k1p54zkbnJ&9BknB*V@F!qt5(ae(n-jVh*opR&kDw_TymiMW93%)9WF+XHWRU zrA@t=nBoAF^YLRAE#ZVX)we#U=)k&>wXZlejuKr_zulTM3%Z|(9p&k^6_J zdoCy^*P&}Qj(B$mej75S7yOr^|CY)6nf>bBUV(>(HeX_(wst01AyM{kay8%a%a>y( z3!KxacWlW2^8Zh^ug26YD`WKBv<(e!T(7rsbuFA!op*jkHtuTY`xowPWos?D>pbX0 ze);wER@xc3v`kRcJPAp<~g9ROS~fw?FQv>2#(T`)J=?rQ{g z^KPUxNHkha7Jq}KSyf=)OLFXFOA?Y*yUqRNMFoFC%;`p-v9nK$BxcMe7({rXt&y6=fH&@^FW&{`y+Xq~&hLBnT@Tw|# z4hQgV+SDX|kl)tBvZ$%-yJEh=?7uDt1tH^s??-nxqP|*K`FMMdu)z0?{%8v z8+`kXl$Cv^=c^pH$+~Ewdew-w*EEWEa?;Y;k=vV#Sb!XMJ$1?#T5d^^j~@>Loe_Rv zO&&GL!N+o`&ee8bstq|hi#Fu*ic!_lnj`0z6c~hem3!>R=5YXq5qMnygAFeSJa_JQ|+cwl&K^ym+!=tbD_02&gnF%a_fZ~Qj zbk}HQmb@*S7&EWr8u__OP$#oz%RrZu4L+Y+Hb2R})||{VoVt=47P!coII3~rd^LI9 zS#__am%!1WgAsdKX6M8ufOJ9hPl~MUbD${*U-qlsvqiFm7{*x2Ic;q_aKcoA$@rfi zeSoXnffixc0bVVUkNEO%)OJ(rD4$=A?`Odl{c3`Uk{3e}PK;1LxG@__mgOEHw-B4B$kFCr6|&dox3b$ye|`{Xv3fd#Y-Ikk%&?texu;!$?d6_+K#mS|{$h+?QgD*7?UW62 zQd+5`F9^1I*S8tP$lAt_7a`|B&|YAuNCZ~{dmQ|NXtMU%b%-1q(ZX>%^8x=qeij~R z0X#ZA33js8L{3?Zy}d|X+HcYJ+O=}v{|k$qQE=G5f4|CWa#3E{;}VIg7U?#l>C)5@ z6B%I3L))0QU7LCS#9)T+WqaHv{Zl{q)V)>+ed24N$RbwH?{}aQR5~P(FLHBrE=-CN zbM&Zv4?XeJSMZBZHZQkXj}&%WC-6dip7T2pXYZ6-MP!j zK=-$0YR<(!cIT+SD%FoV=B^c5gQvnJJ*4mmI0(C^iL1u6BPnPV)eG(p@#2mP6H!nw zDuc3(N2xQ``o)7ZM7+M1`CPsTkaJE3_XA;6KM~hW$OH@%XlCpV$$mz4>^Ac&@kh2jl%Nz6l6w|uq)WH^9>-QA=Z$6ZOMG~1>EekKON$$VUMG8yxQb4f4hG~S4m@Hn`8Rn^@PFwhl zNdL8s-?Q~QR2(w@zPhJ1YsEWS-&BOn&*9Y;PVVj7#pUilo>){mxx&~mTYcj$Efc4) z0!ScPb!KA*t{Emr93}IC&amm< z#(A-YYl%lLlcNl&ck)&Y-k$l?MinWT(Ea2|IAoXwTp`qjJ6l>_7N4bkzMjCIbYQ6Ju=1hVoTPC)rRyVo zL7XR0Xr@CyQn4FKoKR#+g@x_o$g&_tbF;(g7g&ETNL3;~=vrSA+-Xpg_R6wE8Ivu_P8}|U* z*Uj_@lS+X{o%K+~9ttf_I$F55f*8EsxW%WOI{0SUfat-z~aFp zmwtB0o)%!fS~Eyy^a6AUnQoqMODwx-GBPsqa{CX+$!*7`&k>aXf&mHEI7VMkSlG7t zBY(w~e}#yI(t&2_YglZ1fxcyopQ@r4?;f%}{%srYJ*e*18@?yFiHLyu`cOGf=-Q-` zpP+kShxp;c+#vjE+bU7QkYg*KIAKDtQ!cE_r3{neWN$a*EH?l`9ugg$Ds$if)H?Mo z`%>V8;RIq^dLk-_2urQ^^XSErUH@6T6jRYl4?9!v8P>|3_7YxZg(&W9RvI zJ1$({IN4WHt|V95WbtNk%GcGM0GaK6WY4i}At^=31Zaqq-}Kgj5RXFF;km4*qvQSz zY?Py6%?{`(_ZE=f5H!SNLkl7|9)Mrfdeeo1#XhsithXzj5(>aV?D5F58~a@s<@M4} z(nVMSqcd+_dlL*|H9Yl>_*EZT? zp6n$y%Yu-;a_Bn_I*#`En=;r~$p9s$w8jrGJ&(Q-`T?K933q1R{c48-&X1FZb z;Iec1RXL=?-wcFb{k&_waD!YcLxcJN^2P7vS5w6Gz8@EOpAxhAx zIb8jKU0fuXB12R@{qMrXu5EPcp2T7#Fs6t$iP8Zm`nvK=BH*Cl zX@XR%EkCO@{fS%BTUba4Wxg-Ao@TDM5v0rjOW!mFRp?(+MMLzDM)}%MP};~s)X8d& z(xAfs0b(6I^~2d5?7b}w#KB?oQZ(A4I_(NFGR>USjH16EP~ag*?8F|Dv1K*2wV}Fe z*cEo}qyyh?`|4tInXBjKO`BAM`Gx{VsbO);^q^8=+wgs{9V#l< zRkz~vhE;G5zz$W$d?ExE2mukbc0vd0!*eBHSqr=s-nP0Le&!^%d5I(u1r9X!J@BXmg8&>#F?yuhz#tE@g>R z@eIm3FO^p&wZL#Ze`WgyRJV7pHJkebTK`FmqR7%+6;F%*KpZ$~f>d0J{rfG1j#b&m zcKSbbxum0$xS#0=nxWbHx{=Q_N4KhtVk5wTg_4w&<7>>s%(zFeC7NV>XCzUJoKXu* z+gM^#b-Jsn-y*1N8Jgq?G=#)XVIY-WB4}m*YK$d9y@s<5Ct)WsJwth`pJqDGJf6O1 zxzs3xN_z4%Z9u0{?>4%eiIZE+ELwoea`d zlwbRaxCj^R2{j_k*BPx!$2VJK39!F4o8<8$_)l7j6TGe_3}a3FI%n<&>eNXb``v<=`@{oVXv33#JY5c!AFpD+(AA0h`QpbqK{OjI zoNdTM>bi7;9t5;PD~^R*x+1gRB0GC7IK6r{KhChonP#u8exM8AMClcR>#pp{TuEQi z><^QByygs>*H=|ysO6hU5sw9@eMTuY-FCZ+I4|KY^RSTOtVn4#WFs)2-{MTs()M3I z&kZ4F!Cc>GFZ_m(OG(j)oBhRo_AxHg?QgM=r{1w=KEc}#H(0E6Ae0lD2nv)6>eCAG zx#zkhbMWAWyftq!qpBwLJw(m5*5uTh{Bc|O*LYr37gWHre4=t!httgDe6atf677@N zW_KN$$z94%ySKSFCb z@xXD|Zh2%XVAMlYT`kDzodXyfO20z2XZ!!AvLK~mAc3|RkGMN~5uX%TCpbdG%P-n& zmMeXb@Z#}3F<~@)6RB&2=eqOYKWX^?Cbmh*(ID-KbdcdU z7(2=aJQql!;1z~VwqRBhzoUaYN$l99eCP8IsdCfvcM)22eBQ(qD9YOsq|bC*a3EXH zl+AwR0v~aZ^Hnw4OBXI!R<%!CqMy}ZHva-hdW3BemH8Jv;Oy8L9?)bGvv8v&)Na#^ zAQuwxx+FsyYFrPmu1zqsEr>4+v?jX^YH+_}*@~V%ANbvA0dX%*1?$GL5kR({l=jgG zUIp01rRhcur!MUTlSpNiaA5=bN<;dWWD4o#gN{RD)wN%TkBYdo?uH!f|_~}lgJhI(eg@51)iH|K) zS4U_zGKGx99x|(s%VN|NRNhnVlbn*WQ$(a@>JWCc(tAvgeXR%Pe%%c2x4(V+u#V&J ztQAS7h}r(2y$D1Wu`N*c=}9`rT}q{{3>NeFcK52eCehvC`r7CJW+eT6*UuYQ;&5f^ ztS1QoCnoqEwNT@K*Fa4A1bMa^--2J_p02_|(!Igl`;zN!npFjAZ7vhWX4S1ic8{}) zvsOHqfBdIk`s0+8loVuhzGEXBlsH~gS5)X53ML_91$S+)b<1AVe@wthHPl`E=veXG zqa8}qDAZ}Vn?>swFLBYWefZzDYx8Bd*SjQ~2-2RRCn!Y6XXj6|Q(+PeV--9Wb3^Cv z&Iw(!l@5)sE9vj6HD7}kfUza{UoFVP4xYyn%oLJ@5WsOlwV|wIf+|jvVK9C-+Vj?v zK%z+(Fwa!x21`2GT!{AH&Hk&r484F-nl8xLd*yX``ADGRoebs;0ZlBTX;!T3YLL<{Jv#sqdbcfWyi`)re1nT*%wxX3CwRN8kH}FGid`Y zBB7-2#T;(`HsRTwgZ9C=9F@mjWt`jW27kIq-&gqLZfjs3d6;e3hj?f0ga06KUS@*b zfEWCZqjZ!&<1+H_wrjw!YDwixVyWl*?b>=T^~<_85Px32z05S2Xi@jH6=wdFEKtgnUG-^@hF9g(vSZ3G zBq`sq?p!gVB~?_fuc}SSJXTbpFB(_6W@pb4Qf~L~6sOS1A;ZP(VS9Jj)04PJ#<$Nt znUr>{8X=L~Z5Q4ix?q3VRb7jEzUjt%^U|uSYjNrP;<9pJP-D0?`S?qs`$?ed=ziGk zr~SC~$7e=a@@|&(PVA%$;T6MQ-kGr%Bz!LnQ0Wi$>Aqy>(-sxGXnTHZzRaF{g%_IE zWPx?Oh_3f5?i4QA+Y_)|%`|A784UB5JqeZQ6 zN>XnyYl~kkN&U6z_05Jj!wAi;t^Bj3i{5hOF)gr|zlmbt`bSxeHkzX+MZ)YWmLBka zV*lv-X>Bi;8LRQBFO9XkcKGX8@hY|!4^t#gvhXFCFHH%Bx5fG01&%&}#`2JBDwkyi z*HLwi<7=91ew=d8qT5;8a+s!0qUvFg;+Zp7Irf{H`i2U=eDUYHVMSW1y~&9Ff}B^v zDubC@`w8skQ*kh157UOnv%(2o6+76J>FoYIV}5aJ{rd$alS6ii3@?W7cQH%-sXk18 zIaOq-WJv!tHfMIyt@qw$7T(0(Z*jf}tCtuvqF&CrO)u<>nRvK;u>75t;>x?t`!7Gb zD9lJb^|AG)xJsoa>B!e-IU4o7S!F|8sFu@`Q@dAiyL zd&|jdy&Sr3bnY$dh3&XwMxv9NXG_TlM*LA7%r_@1%qs~@`69n^T5o`~i$cntyqH?W z=N81rf!jpOys%_fY~;K37q(OMH;nZcP&pZR&)$6@zmL}upAQDV-xw$+!^@E#wEL^( zW(r5bymouva-S$ZKY{Pa_&vqxf1|#D3ifm#k?r)aYHXCns#xyvm~79vsu9_LzH)4M z>Iz3my<$I8bqg~#8SqA_EH%;;`weBFqOfDvp9X2pDu+Nmh1kfus;^L)A$81=CyHOq zdw6uJ|DyWeW#%*<%3)yMe67cLX>pi5Gs+@ztmkWSv{Io@vDpS zL@b&@?tU$S&UUr zYv+3eA@MFp{aZYBv89Y$_9J!x)HY&AO;D0;o&483?jnuQ2t-$Gxn#6N22?6^rM_k9 zdg31WIdVeRdsVyNT=pCf0t0;-2d9^H4%1XNt7=++W1{(NJkX5IBD`|xX29vvDu*|W ze&#uKtF{*If2qm@M+YEM?oYavGO^1Qs$0DJ>BWk~s_I8YP9tM3;(x@B3Ivpo~LGaHfO5Zp{U())>E-x#(3h%9)Z}}sH(8I-QMu5YlJx20)-XK zxCM6Ze5_8-0-gY%K|Kg0LNbIl3& z-qk-=RCKMvkFdW?v5)eaSyG6l_tl#-)NO@C^-p-JfzB=^P?-cV|^OBeC(*leGfJwzY zl>Qm);59tl)=$|IC$n0@?Rt^g^z?zMVyWwUw^v-;#b*AzE(w|`37qPcnx}`=t^N6f3A-yldDe$M`+%Yt*@_>mI@+1DE%ml)=Mo5zWdiQ~1q0yI^Bm#j$J1)(!KHNr{~Pe~LTPc&Oesjvq@#k|_I5e@jxbt7s@w z$u3RyQMUdnMUBQXOsg#>d&t^9j5WK2k(ePNdy*w&o1~!`6K3YQ=XqW{Z=UzhtMfUZ zb3SvU_cMU(45z>zT6F{T{?>HS&n@`~1_U z)JFl)sM^NAuwKFIBQl38b~v>XAy$#ms~sQ1?ZS5_E6s$0%-pgq?i-7xn!!h9cBxk3 zfq+HF3P`s44D*(k09F*mVdQeS)Z#DIKpv)}{Ez}rOw*<{YEF?2l4o#zZ}-vYPP?dk z-I0%UF4K46V71!i%@8TQTclg?>ZT&B_EgX%ba<8M zizH8`s5(qTzzuj5Ag0s4^kKj#>$bRS!v_?%wXkJ=jP@F7Vt-FCzz6zY70fB-G4okp zmh1V2M~B4u(Y(aj*QIl3cCz!_J~Kb6Pvuoj8GU~ z<%e8AC8-bqvJ3R=bU}zBkvx8S)O0u}k`4awjJ@@aZhxy|c^*0c-$JWB!%<=yNEom=5 z3W2|@iP<-&Tix;T@tuI^0C1%gzykbB%jMl)Kt)kzdD6Mlytuk#c7Qk_itw;7P~~>KrEwzbn7>ck}1?rQJzboh@=V(l;9C?aPGC(u)Q;m2d3nDY=^Z zUNo01JS3!O#_nMB#TV~9Gdu5o8dVWSQ+4^QNa6QCdYte+`bSYdKHsahsn(b028mV0iK0|9^Z?DZRR$3tE~EbX1ABA}FS+7LIX`xz+ZKd3kfsoz;b201-1yxJw|1JNfLdFAy>Y>r<^rZJ5 zB(fhWKJ%?PG_>rP+3P#JOCJ&6;jN!gTgG$4e@7|jVb_MxFV*A!gbMwdn)1j*1*k|! zNDNFD4H2jepkTseVhPAnhsv=U8y^)~sC&ss$&av4hM;hOPh-!n2r^S58nw(cR0WEB)-;s~)7K=Hv(A*-NI0eNme39mBTjh=ix;?JZqGj~`cn1O0pm-5js zi;6`qP;PE+(Vy?g_2nV8<8XL-e=b}Gzjp?G(#Yu9#Kc5<^Io9#{hdxn3JD3-k^o5> zJoOu2bL|-M+F0(gi8P)}iVYY;zX#ea#T0^cfSGXDWv~0`7>SRcU zIb9Iu)sYk|aGqD>e`@^bjJ=_9?D-UOp*y1;&VR<6S|7(hw+|Y86;UklZPgEPuWu#s zHNxdU@}L`A*(0)$&~CT67CFKN^sNS}yjGla(A@X?unu$jIg1tm5$B5=dHyseO9do* zJbxp$xG|qnTK9##TyKRs`23y%jE8!4kH3^ZnJgX&TyE$;ZbpBbY-uii(YNJk< z<$zeak9`VSI}IH!QbWmYplJ2b`rl9SK(R6080(N9Z9bPodl&D7U@*sk(puMS7oZ!% zhOVS*T!%TWMv9XaazJ6JiLvp#?-9UcKF!s9-xxhpof3ssjQTPEZM*M`5QLk}hdeII zpR^I>8rKbRe?1LBJBFfdGF`4B#<~5vJ%8W2WxK^}P2_n!_j7H{$InkqBJ7Gzl;&n= zMoWvy8zRwA-Y`Od7lJ4Skca(FV`(#b#_?4A*@L0#(Ys3|C&tIMk-R7mk0(H$?<+VF z2~bfTh2zIiL2MAqk9XtoXK&E2LXe%TXxm{7n}x*$1}eQAINvl`@gh6hCwovAK&N%G zZG7~kW4e@4liENl_BS!0q4cDidFM*-+y0=g!SV5oyKmj4;?D*J1}1K8l~x)`$9td1 zUYOl-t!EcjK5YI0hw?BOVLm7&WzNXC2!b;5cmyE`=a3Kafq6mzJ_&;I9My4L;6*e< z+aL&17ZdQj@s9)H(YbTyuDo*4W(f;=bevsd19koe*^x`O{Toloa3HBHP+5s0 z21wcF&3}%BOcU)PuY-6zetl!nHe{QAbCjUS!+C=)bzD{Ag;)F0Ts6NK4E59t2zdns z-5#Z$qu!%(c68#`?R^lU0m=2FDL`F$(7(>xAPbROi7W-cZ$R*04R)Q_H|MG0Q7)@$PdA5n8CSHk*hmr+hAVLWW8VclS914!CEL9mIppw& zG+`c7ME=(L+Hb-FUTv9<@0yC?Rp&XacU5&mit0w*a z(~*70LEnpxxa@i@ZGs{2$nxGF<+kd)Eay3bMk-Jew5pd3htq`+;e2L_buQKq6wmACrWU^> zI>MZ=Wm%M_{1uGfk&K5v&R|Luh=_q!Yc|l6XH=6dhG~wRAM@79xCVb{5OKhxn&(GI z&Qr42LBAQ2LbFo!5=mZOUiu`=sXRmn3TJ95L>IEtbEgdoEO>>)N_RfNB%x}$!zcpFfUI_qzGd2yBek`v_P zSmiOv=$jKHlA?LeJy*Y)3~GDLWWcQv;AVS$E$@Jqwe=XB;JIPLl1UpQEoW&i*H 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 36/63] 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 37/63] 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 38/63] 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 39/63] 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 40/63] 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 41/63] 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 42/63] 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 43/63] 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 c4090f5484559165cb81101a198ca4f2c014529f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 20:48:23 -0500 Subject: [PATCH 44/63] 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 45/63] =?UTF-8?q?=E2=9D=84=20---=20=3D=3D=3D=3D=20D=20E=20?= =?UTF-8?q?E=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 46/63] 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 47/63] 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 48/63] 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 49/63] 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 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 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 50/63] 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 51/63] 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 52/63] 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 53/63] 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 54/63] 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 55/63] 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 56/63] 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 57/63] 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 58/63] 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 59/63] 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 60/63] 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 24be45e6fac2d8490ccc59cbc1ca749099991771 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 15 Aug 2017 18:56:57 -0500 Subject: [PATCH 61/63] 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 62/63] 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 63/63] 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