From 5ca691894c7a5dd5425efc6b5fdeb12493b0ee18 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sat, 23 Sep 2017 02:37:43 -0400 Subject: [PATCH 001/141] adds dildos to ashwalker ruin --- .../lavaland_surface_ash_walker1.dmm | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index 6712e631a7..27c4f5074b 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -198,6 +198,7 @@ /obj/structure/stone_tile{ dir = 4 }, +/obj/item/dildo/custom, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "aC" = ( @@ -287,6 +288,7 @@ /obj/structure/stone_tile/cracked{ dir = 4 }, +/obj/item/dildo/custom, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "aN" = ( @@ -305,6 +307,7 @@ /area/ruin/unpowered/ash_walkers) "aP" = ( /obj/structure/stone_tile, +/obj/item/dildo/custom, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "aQ" = ( @@ -379,6 +382,7 @@ /obj/structure/stone_tile/cracked{ dir = 1 }, +/obj/item/dildo/custom, /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "aZ" = ( @@ -401,6 +405,7 @@ /obj/structure/stone_tile{ dir = 4 }, +/obj/item/dildo/custom, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "bb" = ( @@ -489,6 +494,7 @@ dir = 4 }, /obj/item/storage/bag/plants/portaseeder, +/obj/item/dildo/custom, /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "bk" = ( @@ -509,6 +515,7 @@ /obj/structure/stone_tile/cracked{ dir = 1 }, +/obj/item/dildo/custom, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "bm" = ( @@ -568,6 +575,7 @@ /obj/structure/stone_tile{ dir = 8 }, +/obj/item/dildo/custom, /turf/open/indestructible/boss/air, /area/ruin/unpowered/ash_walkers) "br" = ( @@ -897,6 +905,7 @@ /obj/structure/stone_tile/surrounding_tile/cracked{ dir = 8 }, +/obj/item/dildo/custom, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "ci" = ( @@ -1042,6 +1051,7 @@ icon_state = "cracked_slab1"; dir = 4 }, +/obj/item/dildo/custom, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "cB" = ( @@ -1475,6 +1485,26 @@ /obj/structure/stone_tile, /turf/closed/mineral/volcanic, /area/lavaland/surface/outdoors) +"dG" = ( +/obj/structure/stone_tile/slab, +/obj/item/dildo/custom, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dH" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/item/dildo/custom, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dI" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/item/dildo/custom, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) (1,1,1) = {" aa @@ -1597,7 +1627,7 @@ aO bl bx bD -bS +dG de bV dg @@ -1625,7 +1655,7 @@ ci bA ct bN -bL +dI cI ah ah @@ -1732,7 +1762,7 @@ ak bP bL bX -dh +dH do du dz From fa9933a80bbab138fc6f6913caba7178369bdac3 Mon Sep 17 00:00:00 2001 From: Daniel0Mclovin <31661882+Daniel0Mclovin@users.noreply.github.com> Date: Sat, 23 Sep 2017 16:59:58 -0500 Subject: [PATCH 002/141] Podpeople as roundstart Essentially it allows podmen to be roundstart along with editing them so they take slightly more fire damage and more damage from plant-b-gone --- .../carbon/human/species_types/podpeople.dm | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index f5f59ae829..e0c97e9f98 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -10,8 +10,11 @@ burnmod = 1.25 heatmod = 1.5 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/plant - disliked_food = NONE - liked_food = NONE + disliked_food = MEAT + liked_food = VEGETABLES | FRUIT + toxic_food = TOXIC | RAW + roundstart = 1 + /datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() @@ -38,14 +41,17 @@ H.adjustToxLoss(-1) H.adjustOxyLoss(-1) - if(H.nutrition < NUTRITION_LEVEL_STARVING + 50) - H.take_overall_damage(2,0) + if(H.nutrition < NUTRITION_LEVEL_STARVING + 55) + H.take_overall_damage(2,5) + /datum/species/pod/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.id == "plantbgone") - H.adjustToxLoss(3) + H.adjustToxLoss(5) H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) return 1 + H.confused = max(H.confused, 1) + /datum/species/pod/on_hit(obj/item/projectile/P, mob/living/carbon/human/H) switch(P.type) From 7054cf01ea4bca055c8be8314f5416976db5fc93 Mon Sep 17 00:00:00 2001 From: Daniel0Mclovin <31661882+Daniel0Mclovin@users.noreply.github.com> Date: Thu, 28 Sep 2017 20:02:17 -0500 Subject: [PATCH 003/141] changed a few 1's to TRUE's, removed food prefs --- .../mob/living/carbon/human/species_types/podpeople.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index e0c97e9f98..bc5a875d48 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -10,10 +10,10 @@ burnmod = 1.25 heatmod = 1.5 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/plant - disliked_food = MEAT - liked_food = VEGETABLES | FRUIT - toxic_food = TOXIC | RAW - roundstart = 1 + disliked_food = NONE + liked_food = NONE + toxic_food = NONE + roundstart = TRUE /datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species) @@ -49,8 +49,8 @@ if(chem.id == "plantbgone") H.adjustToxLoss(5) H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM) - return 1 H.confused = max(H.confused, 1) + return TRUE /datum/species/pod/on_hit(obj/item/projectile/P, mob/living/carbon/human/H) From 2635689e79586a16983a6f933abe9cc04794d834 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Sat, 30 Sep 2017 22:32:04 -0400 Subject: [PATCH 004/141] Cleans up some antag/event landmark checks --- .../revenant/revenant_spawn_event.dm | 12 +- .../miniantags/slaughter/slaughterevent.dm | 6 +- code/modules/admin/verbs/randomverbs.dm | 1261 +++++++++++++++++ code/modules/events/carp_migration.dm | 30 + code/modules/events/electrical_storm.dm | 39 + code/modules/events/holiday/halloween.dm | 74 + code/modules/events/operative.dm | 5 +- code/modules/events/wizard/magicarp.dm | 11 +- code/modules/mob/dead/new_player/login.dm | 9 - code/modules/mob/transform_procs.dm | 14 +- code/modules/ninja/ninja_event.dm | 6 +- 11 files changed, 1425 insertions(+), 42 deletions(-) diff --git a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm index 783cfdd930..fb0bdfb6f9 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm @@ -34,17 +34,13 @@ var/list/spawn_locs = list() - for(var/obj/effect/landmark/L in GLOB.landmarks_list) + for(var/obj/effect/landmark/revenantspawn/L in GLOB.landmarks_list) if(isturf(L.loc)) - switch(L.name) - if("revenantspawn") - spawn_locs += L.loc + spawn_locs += L.loc if(!spawn_locs.len) //If we can't find any revenant spawns, try the carp spawns - for(var/obj/effect/landmark/L in GLOB.landmarks_list) + for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) if(isturf(L.loc)) - switch(L.name) - if("carpspawn") - spawn_locs += L.loc + spawn_locs += L.loc if(!spawn_locs.len) //If we can't find either, just spawn the revenant at the player's location spawn_locs += get_turf(selected) if(!spawn_locs.len) //If we can't find THAT, then just give up and cry diff --git a/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm b/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm index 888a10669e..4d85744738 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm @@ -23,11 +23,9 @@ player_mind.active = 1 var/list/spawn_locs = list() - for(var/obj/effect/landmark/L in GLOB.landmarks_list) + for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) if(isturf(L.loc)) - switch(L.name) - if("carpspawn") - spawn_locs += L.loc + spawn_locs += L.loc if(!spawn_locs) message_admins("No valid spawn locations found, aborting...") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 975e8aa731..bce2dfb60d 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /client/proc/cmd_admin_drop_everything(mob/M in GLOB.mob_list) set category = null set name = "Drop Everything" @@ -1256,4 +1257,1264 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits to_chat(usr, "ERROR: Unable to update player flags. Please check logs.") else message_admins("[key_name_admin(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name_admin(C)]") +======= +/client/proc/cmd_admin_drop_everything(mob/M in GLOB.mob_list) + set category = null + set name = "Drop Everything" + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + + var/confirm = alert(src, "Make [M] drop everything?", "Message", "Yes", "No") + if(confirm != "Yes") + return + + for(var/obj/item/W in M) + if(!M.dropItemToGround(W)) + qdel(W) + M.regenerate_icons() + + log_admin("[key_name(usr)] made [key_name(M)] drop everything!") + var/msg = "[key_name_admin(usr)] made [key_name_admin(M)] drop everything!" + message_admins(msg) + admin_ticket_log(M, msg) + SSblackbox.add_details("admin_verb","Drop Everything") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_subtle_message(mob/M in GLOB.mob_list) + set category = "Special Verbs" + set name = "Subtle Message" + + if(!ismob(M)) + return + if (!holder) + to_chat(src, "Only administrators may use this command.") + return + + message_admins("[key_name_admin(src)] has started answering [key_name(M.key, 0, 0)]'s prayer.") + var/msg = input("Message:", text("Subtle PM to [M.key]")) as text + + if (!msg) + message_admins("[key_name_admin(src)] decided not to answer [key_name(M.key, 0, 0)]'s prayer") + return + if(usr) + if (usr.client) + if(usr.client.holder) + to_chat(M, "You hear a voice in your head... [msg]") + + log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]") + msg = " SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]" + message_admins(msg) + admin_ticket_log(M, msg) + SSblackbox.add_details("admin_verb","Subtle Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_world_narrate() + set category = "Special Verbs" + set name = "Global Narrate" + + if (!holder) + to_chat(src, "Only administrators may use this command.") + return + + var/msg = input("Message:", text("Enter the text you wish to appear to everyone:")) as text + + if (!msg) + return + to_chat(world, "[msg]") + log_admin("GlobalNarrate: [key_name(usr)] : [msg]") + message_admins("[key_name_admin(usr)] Sent a global narrate") + SSblackbox.add_details("admin_verb","Global Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_direct_narrate(mob/M) + set category = "Special Verbs" + set name = "Direct Narrate" + + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + + if(!M) + M = input("Direct narrate to whom?", "Active Players") as null|anything in GLOB.player_list + + if(!M) + return + + var/msg = input("Message:", text("Enter the text you wish to appear to your target:")) as text + + if( !msg ) + return + + to_chat(M, msg) + log_admin("DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]") + msg = " DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]
" + message_admins(msg) + admin_ticket_log(M, msg) + SSblackbox.add_details("admin_verb","Direct Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_local_narrate(atom/A) + set category = "Special Verbs" + set name = "Local Narrate" + + if (!holder) + to_chat(src, "Only administrators may use this command.") + return + if(!A) + return + var/range = input("Range:", "Narrate to mobs within how many tiles:", 7) as num + if(!range) + return + var/msg = input("Message:", text("Enter the text you wish to appear to everyone within view:")) as text + if (!msg) + return + for(var/mob/M in view(range,A)) + to_chat(M, msg) + + log_admin("LocalNarrate: [key_name(usr)] at [get_area(A)][COORD(A)]: [msg]") + message_admins(" LocalNarrate: [key_name_admin(usr)] at [get_area(A)][ADMIN_JMP(A)]: [msg]
") + SSblackbox.add_details("admin_verb","Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list) + set category = "Special Verbs" + set name = "Godmode" + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + M.status_flags ^= GODMODE + to_chat(usr, "Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]") + + log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]") + var/msg = "[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]" + message_admins(msg) + admin_ticket_log(M, msg) + SSblackbox.add_details("admin_toggle","Godmode|[M.status_flags & GODMODE]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + +/proc/cmd_admin_mute(whom, mute_type, automute = 0) + if(!whom) + return + + var/muteunmute + var/mute_string + var/feedback_string + switch(mute_type) + if(MUTE_IC) + mute_string = "IC (say and emote)" + feedback_string = "IC" + if(MUTE_OOC) + mute_string = "OOC" + feedback_string = "OOC" + if(MUTE_PRAY) + mute_string = "pray" + feedback_string = "Pray" + if(MUTE_ADMINHELP) + mute_string = "adminhelp, admin PM and ASAY" + feedback_string = "Adminhelp" + if(MUTE_DEADCHAT) + mute_string = "deadchat and DSAY" + feedback_string = "Deadchat" + if(MUTE_ALL) + mute_string = "everything" + feedback_string = "Everything" + else + return + + var/client/C + if(istype(whom, /client)) + C = whom + else if(istext(whom)) + C = GLOB.directory[whom] + else + return + + var/datum/preferences/P + if(C) + P = C.prefs + else + P = GLOB.preferences_datums[whom] + if(!P) + return + + if(automute) + if(!CONFIG_GET(flag/automute_on)) + return + else + if(!check_rights()) + return + + if(automute) + muteunmute = "auto-muted" + P.muted |= mute_type + log_admin("SPAM AUTOMUTE: [muteunmute] [key_name(whom)] from [mute_string]") + message_admins("SPAM AUTOMUTE: [muteunmute] [key_name_admin(whom)] from [mute_string].") + if(C) + to_chat(C, "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin.") + SSblackbox.add_details("admin_toggle","Auto Mute [feedback_string]|1") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + return + + if(P.muted & mute_type) + muteunmute = "unmuted" + P.muted &= ~mute_type + else + muteunmute = "muted" + P.muted |= mute_type + + log_admin("[key_name(usr)] has [muteunmute] [key_name(whom)] from [mute_string]") + message_admins("[key_name_admin(usr)] has [muteunmute] [key_name_admin(whom)] from [mute_string].") + if(C) + to_chat(C, "You have been [muteunmute] from [mute_string] by [key_name(usr, include_name = FALSE)].") + SSblackbox.add_details("admin_toggle","Mute [feedback_string]|[P.muted & mute_type]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + +//I use this proc for respawn character too. /N +/proc/create_xeno(ckey) + if(!ckey) + var/list/candidates = list() + for(var/mob/M in GLOB.player_list) + if(M.stat != DEAD) + continue //we are not dead! + if(!(ROLE_ALIEN in M.client.prefs.be_special)) + continue //we don't want to be an alium + if(M.client.is_afk()) + continue //we are afk + if(M.mind && M.mind.current && M.mind.current.stat != DEAD) + continue //we have a live body we are tied to + candidates += M.ckey + if(candidates.len) + ckey = input("Pick the player you want to respawn as a xeno.", "Suitable Candidates") as null|anything in candidates + else + to_chat(usr, "Error: create_xeno(): no suitable candidates.") + if(!istext(ckey)) + return 0 + + var/alien_caste = input(usr, "Please choose which caste to spawn.","Pick a caste",null) as null|anything in list("Queen","Praetorian","Hunter","Sentinel","Drone","Larva") + var/obj/effect/landmark/spawn_here = GLOB.xeno_spawn.len ? pick(GLOB.xeno_spawn) : null + var/mob/living/carbon/alien/new_xeno + switch(alien_caste) + if("Queen") + new_xeno = new /mob/living/carbon/alien/humanoid/royal/queen(spawn_here) + if("Praetorian") + new_xeno = new /mob/living/carbon/alien/humanoid/royal/praetorian(spawn_here) + if("Hunter") + new_xeno = new /mob/living/carbon/alien/humanoid/hunter(spawn_here) + if("Sentinel") + new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(spawn_here) + if("Drone") + new_xeno = new /mob/living/carbon/alien/humanoid/drone(spawn_here) + if("Larva") + new_xeno = new /mob/living/carbon/alien/larva(spawn_here) + else + return 0 + if(!spawn_here) + SSjob.SendToLateJoin(new_xeno, FALSE) + + new_xeno.ckey = ckey + var/msg = "[key_name_admin(usr)] has spawned [ckey] as a filthy xeno [alien_caste]." + message_admins(msg) + admin_ticket_log(new_xeno, msg) + return 1 + +/* +If a guy was gibbed and you want to revive him, this is a good way to do so. +Works kind of like entering the game with a new character. Character receives a new mind if they didn't have one. +Traitors and the like can also be revived with the previous role mostly intact. +/N */ +/client/proc/respawn_character() + set category = "Special Verbs" + set name = "Respawn Character" + set desc = "Respawn a person that has been gibbed/dusted/killed. They must be a ghost for this to work and preferably should not have a body to go back into." + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + var/input = ckey(input(src, "Please specify which key will be respawned.", "Key", "")) + if(!input) + return + + var/mob/dead/observer/G_found + for(var/mob/dead/observer/G in GLOB.player_list) + if(G.ckey == input) + G_found = G + break + + if(!G_found)//If a ghost was not found. + to_chat(usr, "There is no active key like that in the game or the person is not currently a ghost.") + return + + if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something + //Check if they were an alien + if(G_found.mind.assigned_role=="Alien") + if(alert("This character appears to have been an alien. Would you like to respawn them as such?",,"Yes","No")=="Yes") + var/turf/T + if(GLOB.xeno_spawn.len) + T = pick(GLOB.xeno_spawn) + + var/mob/living/carbon/alien/new_xeno + switch(G_found.mind.special_role)//If they have a mind, we can determine which caste they were. + if("Hunter") + new_xeno = new /mob/living/carbon/alien/humanoid/hunter(T) + if("Sentinel") + new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(T) + if("Drone") + new_xeno = new /mob/living/carbon/alien/humanoid/drone(T) + if("Praetorian") + new_xeno = new /mob/living/carbon/alien/humanoid/royal/praetorian(T) + if("Queen") + new_xeno = new /mob/living/carbon/alien/humanoid/royal/queen(T) + else//If we don't know what special role they have, for whatever reason, or they're a larva. + create_xeno(G_found.ckey) + return + + if(!T) + SSjob.SendToLateJoin(new_xeno, FALSE) + + //Now to give them their mind back. + G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use + new_xeno.key = G_found.key + to_chat(new_xeno, "You have been fully respawned. Enjoy the game.") + var/msg = "[key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno." + message_admins(msg) + admin_ticket_log(new_xeno, msg) + return //all done. The ghost is auto-deleted + + //check if they were a monkey + else if(findtext(G_found.real_name,"monkey")) + if(alert("This character appears to have been a monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes") + var/mob/living/carbon/monkey/new_monkey = new + SSjob.SendToLateJoin(new_monkey) + G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use + new_monkey.key = G_found.key + to_chat(new_monkey, "You have been fully respawned. Enjoy the game.") + var/msg = "[key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno." + message_admins(msg) + admin_ticket_log(new_monkey, msg) + return //all done. The ghost is auto-deleted + + + //Ok, it's not a xeno or a monkey. So, spawn a human. + var/mob/living/carbon/human/new_character = new//The mob being spawned. + SSjob.SendToLateJoin(new_character) + + var/datum/data/record/record_found //Referenced to later to either randomize or not randomize the character. + if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something + /*Try and locate a record for the person being respawned through GLOB.data_core. + This isn't an exact science but it does the trick more often than not.*/ + var/id = md5("[G_found.real_name][G_found.mind.assigned_role]") + + record_found = find_record("id", id, GLOB.data_core.locked) + + if(record_found)//If they have a record we can determine a few things. + new_character.real_name = record_found.fields["name"] + new_character.gender = record_found.fields["sex"] + new_character.age = record_found.fields["age"] + new_character.hardset_dna(record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], new record_found.fields["species"], record_found.fields["features"]) + else + var/datum/preferences/A = new() + A.copy_to(new_character) + A.real_name = G_found.real_name + new_character.dna.update_dna_identity() + + new_character.name = new_character.real_name + + if(G_found.mind && !G_found.mind.active) + G_found.mind.transfer_to(new_character) //be careful when doing stuff like this! I've already checked the mind isn't in use + else + new_character.mind_initialize() + if(!new_character.mind.assigned_role) + new_character.mind.assigned_role = "Assistant"//If they somehow got a null assigned role. + + new_character.key = G_found.key + + /* + The code below functions with the assumption that the mob is already a traitor if they have a special role. + So all it does is re-equip the mob with powers and/or items. Or not, if they have no special role. + If they don't have a mind, they obviously don't have a special role. + */ + + //Two variables to properly announce later on. + var/admin = key_name_admin(src) + var/player_key = G_found.key + + //Now for special roles and equipment. + var/datum/antagonist/traitor/traitordatum = new_character.mind.has_antag_datum(ANTAG_DATUM_TRAITOR) + if(traitordatum) + SSjob.EquipRank(new_character, new_character.mind.assigned_role, 1) + traitordatum.equip() + + + switch(new_character.mind.special_role) + if("Wizard") + new_character.loc = pick(GLOB.wizardstart) + //SSticker.mode.learn_basic_spells(new_character) + SSticker.mode.equip_wizard(new_character) + if("Syndicate") + var/obj/effect/landmark/synd_spawn = locate("landmark*Syndicate-Spawn") + if(synd_spawn) + new_character.loc = get_turf(synd_spawn) + call(/datum/game_mode/proc/equip_syndicate)(new_character) + if("Space Ninja") + var/list/ninja_spawn = list() + for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) + ninja_spawn += L + var/datum/antagonist/ninja/ninjadatum = new_character.mind.has_antag_datum(ANTAG_DATUM_NINJA) + ninjadatum.equip_space_ninja() + if(ninja_spawn.len) + var/obj/effect/landmark/ninja_spawn_here = pick(ninja_spawn) + new_character.loc = ninja_spawn_here.loc + + else//They may also be a cyborg or AI. + switch(new_character.mind.assigned_role) + if("Cyborg")//More rigging to make em' work and check if they're traitor. + new_character = new_character.Robotize() + if("AI") + new_character = new_character.AIize() + else + SSjob.EquipRank(new_character, new_character.mind.assigned_role, 1)//Or we simply equip them. + + //Announces the character on all the systems, based on the record. + if(!issilicon(new_character))//If they are not a cyborg/AI. + if(!record_found&&new_character.mind.assigned_role!=new_character.mind.special_role)//If there are no records for them. If they have a record, this info is already in there. MODE people are not announced anyway. + //Power to the user! + if(alert(new_character,"Warning: No data core entry detected. Would you like to announce the arrival of this character by adding them to various databases, such as medical records?",,"No","Yes")=="Yes") + GLOB.data_core.manifest_inject(new_character) + + if(alert(new_character,"Would you like an active AI to announce this character?",,"No","Yes")=="Yes") + AnnounceArrival(new_character, new_character.mind.assigned_role) + + var/msg = "[admin] has respawned [player_key] as [new_character.real_name]." + message_admins(msg) + admin_ticket_log(new_character, msg) + + to_chat(new_character, "You have been fully respawned. Enjoy the game.") + + SSblackbox.add_details("admin_verb","Respawn Character") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + return new_character + +/client/proc/cmd_admin_add_freeform_ai_law() + set category = "Fun" + set name = "Add Custom AI law" + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + var/input = input(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", "") as text|null + if(!input) + return + + log_admin("Admin [key_name(usr)] has added a new AI law - [input]") + message_admins("Admin [key_name_admin(usr)] has added a new AI law - [input]") + + var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No") + var/announce_ion_laws = (show_log == "Yes" ? 1 : -1) + + var/datum/round_event/ion_storm/add_law_only/ion = new() + ion.announceEvent = announce_ion_laws + ion.ionMessage = input + + SSblackbox.add_details("admin_verb","Add Custom AI Law") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_rejuvenate(mob/living/M in GLOB.mob_list) + set category = "Special Verbs" + set name = "Rejuvenate" + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + if(!mob) + return + if(!istype(M)) + alert("Cannot revive a ghost") + return + M.revive(full_heal = 1, admin_revive = 1) + + log_admin("[key_name(usr)] healed / revived [key_name(M)]") + var/msg = "Admin [key_name_admin(usr)] healed / revived [key_name_admin(M)]!" + message_admins(msg) + admin_ticket_log(M, msg) + SSblackbox.add_details("admin_verb","Rejuvinate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_create_centcom_report() + set category = "Special Verbs" + set name = "Create Command Report" + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + var/input = input(usr, "Please enter anything you want. Anything. Serious.", "What?", "") as message|null + if(!input) + return + + var/confirm = alert(src, "Do you want to announce the contents of the report to the crew?", "Announce", "Yes", "No", "Cancel") + var/announce_command_report = TRUE + switch(confirm) + if("Yes") + priority_announce(input, null, 'sound/ai/commandreport.ogg') + announce_command_report = FALSE + if("Cancel") + return + + print_command_report(input, "[announce_command_report ? "Classified " : ""][command_name()] Update", announce_command_report) + + log_admin("[key_name(src)] has created a command report: [input]") + message_admins("[key_name_admin(src)] has created a command report") + SSblackbox.add_details("admin_verb","Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_change_command_name() + set category = "Special Verbs" + set name = "Change Command Name" + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + var/input = input(usr, "Please input a new name for Central Command.", "What?", "") as text|null + if(!input) + return + change_command_name(input) + message_admins("[key_name_admin(src)] has changed Central Command's name to [input]") + log_admin("[key_name(src)] has changed the Central Command name to: [input]") + +/client/proc/cmd_admin_delete(atom/A as obj|mob|turf in world) + set category = "Admin" + set name = "Delete" + + if (!holder) + to_chat(src, "Only administrators may use this command.") + return + + admin_delete(A) + +/client/proc/admin_delete(datum/D) + var/atom/A = D + var/coords = istype(A) ? " at ([A.x], [A.y], [A.z])" : "" + if (alert(src, "Are you sure you want to delete:\n[D]\nat[coords]?", "Confirmation", "Yes", "No") == "Yes") + log_admin("[key_name(usr)] deleted [D][coords]") + message_admins("[key_name_admin(usr)] deleted [D][coords]") + SSblackbox.add_details("admin_verb","Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + if(isturf(D)) + var/turf/T = D + T.ChangeTurf(T.baseturf) + else + qdel(D) + +/client/proc/cmd_admin_list_open_jobs() + set category = "Admin" + set name = "Manage Job Slots" + + if (!holder) + to_chat(src, "Only administrators may use this command.") + return + holder.manage_free_slots() + SSblackbox.add_details("admin_verb","Manage Job Slots") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world) + set category = "Special Verbs" + set name = "Explosion" + + if (!holder) + to_chat(src, "Only administrators may use this command.") + return + + var/devastation = input("Range of total devastation. -1 to none", text("Input")) as num|null + if(devastation == null) return + var/heavy = input("Range of heavy impact. -1 to none", text("Input")) as num|null + if(heavy == null) return + var/light = input("Range of light impact. -1 to none", text("Input")) as num|null + if(light == null) return + var/flash = input("Range of flash. -1 to none", text("Input")) as num|null + if(flash == null) return + var/flames = input("Range of flames. -1 to none", text("Input")) as num|null + if(flames == null) return + + if ((devastation != -1) || (heavy != -1) || (light != -1) || (flash != -1) || (flames != -1)) + if ((devastation > 20) || (heavy > 20) || (light > 20) || (flames > 20)) + if (alert(src, "Are you sure you want to do this? It will laaag.", "Confirmation", "Yes", "No") == "No") + return + + explosion(O, devastation, heavy, light, flash, null, null,flames) + log_admin("[key_name(usr)] created an explosion ([devastation],[heavy],[light],[flames]) at ([O.x],[O.y],[O.z])") + message_admins("[key_name_admin(usr)] created an explosion ([devastation],[heavy],[light],[flames]) at ([O.x],[O.y],[O.z])") + SSblackbox.add_details("admin_verb","Explosion") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + return + else + return + +/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world) + set category = "Special Verbs" + set name = "EM Pulse" + + if (!holder) + to_chat(src, "Only administrators may use this command.") + return + + var/heavy = input("Range of heavy pulse.", text("Input")) as num|null + if(heavy == null) return + var/light = input("Range of light pulse.", text("Input")) as num|null + if(light == null) return + + if (heavy || light) + + empulse(O, heavy, light) + log_admin("[key_name(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])") + message_admins("[key_name_admin(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])") + SSblackbox.add_details("admin_verb","EM Pulse") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + return + else + return + +/client/proc/cmd_admin_gib(mob/M in GLOB.mob_list) + set category = "Special Verbs" + set name = "Gib" + + if (!holder) + to_chat(src, "Only administrators may use this command.") + return + + var/confirm = alert(src, "Drop a brain?", "Confirm", "Yes", "No","Cancel") + if(confirm == "Cancel") + return + //Due to the delay here its easy for something to have happened to the mob + if(!M) + return + + log_admin("[key_name(usr)] has gibbed [key_name(M)]") + message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]") + + if(isobserver(M)) + new /obj/effect/gibspawner/generic(get_turf(M)) + return + if(confirm == "Yes") + M.gib() + else + M.gib(1) + SSblackbox.add_details("admin_verb","Gib") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_gib_self() + set name = "Gibself" + set category = "Fun" + + var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No") + if(confirm == "Yes") + log_admin("[key_name(usr)] used gibself.") + message_admins("[key_name_admin(usr)] used gibself.") + SSblackbox.add_details("admin_verb","Gib Self") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + mob.gib(1, 1, 1) + +/client/proc/cmd_admin_check_contents(mob/living/M in GLOB.mob_list) + set category = "Special Verbs" + set name = "Check Contents" + + var/list/L = M.get_contents() + for(var/t in L) + to_chat(usr, "[t]") + SSblackbox.add_details("admin_verb","Check Contents") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/toggle_view_range() + set category = "Special Verbs" + set name = "Change View Range" + set desc = "switches between 1x and custom views" + + if(view == world.view) + change_view(input("Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,128)) + else + change_view(world.view) + + log_admin("[key_name(usr)] changed their view range to [view].") + //message_admins("\blue [key_name_admin(usr)] changed their view range to [view].") //why? removed by order of XSI + + SSblackbox.add_details("admin_toggle","Change View Range|[view]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/admin_call_shuttle() + + set category = "Admin" + set name = "Call Shuttle" + + if(EMERGENCY_AT_LEAST_DOCKED) + return + + if (!holder) + to_chat(src, "Only administrators may use this command.") + return + + var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No") + if(confirm != "Yes") + return + + SSshuttle.emergency.request() + SSblackbox.add_details("admin_verb","Call Shuttle") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + log_admin("[key_name(usr)] admin-called the emergency shuttle.") + message_admins("[key_name_admin(usr)] admin-called the emergency shuttle.") + return + +/client/proc/admin_cancel_shuttle() + set category = "Admin" + set name = "Cancel Shuttle" + if(!check_rights(0)) + return + if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes") + return + + if(EMERGENCY_AT_LEAST_DOCKED) + return + + SSshuttle.emergency.cancel() + SSblackbox.add_details("admin_verb","Cancel Shuttle") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + log_admin("[key_name(usr)] admin-recalled the emergency shuttle.") + message_admins("[key_name_admin(usr)] admin-recalled the emergency shuttle.") + + return + +/client/proc/everyone_random() + set category = "Fun" + set name = "Make Everyone Random" + set desc = "Make everyone have a random appearance. You can only use this before rounds!" + + if(SSticker.HasRoundStarted()) + to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!") + return + + var/frn = CONFIG_GET(flag/force_random_names) + if(frn) + CONFIG_SET(flag/force_random_names, FALSE) + message_admins("Admin [key_name_admin(usr)] has disabled \"Everyone is Special\" mode.") + to_chat(usr, "Disabled.") + return + + + var/notifyplayers = alert(src, "Do you want to notify the players?", "Options", "Yes", "No", "Cancel") + if(notifyplayers == "Cancel") + return + + log_admin("Admin [key_name(src)] has forced the players to have random appearances.") + message_admins("Admin [key_name_admin(usr)] has forced the players to have random appearances.") + + if(notifyplayers == "Yes") + to_chat(world, "Admin [usr.key] has forced the players to have completely random identities!") + + to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet.") + + CONFIG_SET(flag/force_random_names, TRUE) + SSblackbox.add_details("admin_verb","Make Everyone Random") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + +/client/proc/toggle_random_events() + set category = "Server" + set name = "Toggle random events on/off" + set desc = "Toggles random events such as meteors, black holes, blob (but not space dust) on/off" + var/new_are = !CONFIG_GET(flag/allow_random_events) + CONFIG_SET(flag/allow_random_events, new_are) + if(new_are) + to_chat(usr, "Random events enabled") + message_admins("Admin [key_name_admin(usr)] has enabled random events.") + else + to_chat(usr, "Random events disabled") + message_admins("Admin [key_name_admin(usr)] has disabled random events.") + SSblackbox.add_details("admin_toggle","Toggle Random Events|[new_are]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + +/client/proc/admin_change_sec_level() + set category = "Special Verbs" + set name = "Set Security Level" + set desc = "Changes the security level. Announcement only, i.e. setting to Delta won't activate nuke" + + if (!holder) + to_chat(src, "Only administrators may use this command.") + return + + var/level = input("Select security level to change to","Set Security Level") as null|anything in list("green","blue","red","delta") + if(level) + set_security_level(level) + + log_admin("[key_name(usr)] changed the security level to [level]") + message_admins("[key_name_admin(usr)] changed the security level to [level]") + SSblackbox.add_details("admin_verb","Set Security Level [capitalize(level)]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in GLOB.nuke_list) + set name = "Toggle Nuke" + set category = "Fun" + set popup_menu = 0 + if(!check_rights(R_DEBUG)) + return + + if(!N.timing) + var/newtime = input(usr, "Set activation timer.", "Activate Nuke", "[N.timer_set]") as num + if(!newtime) + return + N.timer_set = newtime + N.set_safety() + N.set_active() + + log_admin("[key_name(usr)] [N.timing ? "activated" : "deactivated"] a nuke at ([N.x],[N.y],[N.z]).") + message_admins("[ADMIN_LOOKUPFLW(usr)] [N.timing ? "activated" : "deactivated"] a nuke at [ADMIN_COORDJMP(N)].") + SSblackbox.add_details("admin_toggle","Toggle Nuke|[N.timing]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits + +/client/proc/create_outfits() + set category = "Debug" + set name = "Create Custom Outfit" + + if(!check_rights(R_DEBUG)) + return + + holder.create_outfit() + +/datum/admins/proc/create_outfit() + var/list/uniforms = typesof(/obj/item/clothing/under) + var/list/suits = typesof(/obj/item/clothing/suit) + var/list/gloves = typesof(/obj/item/clothing/gloves) + var/list/shoes = typesof(/obj/item/clothing/shoes) + var/list/headwear = typesof(/obj/item/clothing/head) + var/list/glasses = typesof(/obj/item/clothing/glasses) + var/list/masks = typesof(/obj/item/clothing/mask) + var/list/ids = typesof(/obj/item/card/id) + + var/uniform_select = "" + + var/suit_select = "" + + var/gloves_select = "" + + var/shoes_select = "" + + var/head_select = "" + + var/glasses_select = "" + + var/mask_select = "" + + var/id_select = "" + + var/dat = {" + Create Outfit +
+ + [HrefTokenFormField()] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: + +
Uniform: + [uniform_select] +
Suit: + [suit_select] +
Back: + +
Belt: + +
Gloves: + [gloves_select] +
Shoes: + [shoes_select] +
Head: + [head_select] +
Mask: + [mask_select] +
Ears: + +
Glasses: + [glasses_select] +
ID: + [id_select] +
Left Pocket: + +
Right Pocket: + +
Suit Store: + +
Right Hand: + +
Left Hand: + +
+
+ +
+ "} + usr << browse(dat, "window=dressup;size=550x600") + +/client/proc/toggle_antag_hud() + set category = "Admin" + set name = "Toggle AntagHUD" + set desc = "Toggles the Admin AntagHUD" + + if(!holder) return + + var/adding_hud = !has_antag_hud() + + for(var/datum/atom_hud/H in GLOB.huds) + if(istype(H, /datum/atom_hud/antag)) + (adding_hud) ? H.add_hud_to(usr) : H.remove_hud_from(usr) + + to_chat(usr, "You toggled your admin antag HUD [adding_hud ? "ON" : "OFF"].") + message_admins("[key_name_admin(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].") + log_admin("[key_name(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].") + SSblackbox.add_details("admin_toggle","Toggle Antag HUD|[adding_hud]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/has_antag_hud() + var/datum/atom_hud/A = GLOB.huds[ANTAG_HUD_TRAITOR] + return A.hudusers[mob] + +/client/proc/open_shuttle_manipulator() + set category = "Admin" + set name = "Shuttle Manipulator" + set desc = "Opens the shuttle manipulator UI." + + for(var/obj/machinery/shuttle_manipulator/M in GLOB.machines) + M.ui_interact(usr) + +/client/proc/mass_zombie_infection() + set category = "Fun" + set name = "Mass Zombie Infection" + set desc = "Infects all humans with a latent organ that will zombify \ + them on death." + + if(!holder) + return + + var/confirm = alert(src, "Please confirm you want to add latent zombie organs in all humans?", "Confirm Zombies", "Yes", "No") + if(confirm != "Yes") + return + + for(var/mob/living/carbon/human/H in GLOB.mob_list) + new /obj/item/organ/zombie_infection(H) + + message_admins("[key_name_admin(usr)] added a latent zombie infection to all humans.") + log_admin("[key_name(usr)] added a latent zombie infection to all humans.") + SSblackbox.add_details("admin_verb","Mass Zombie Infection") + +/client/proc/mass_zombie_cure() + set category = "Fun" + set name = "Mass Zombie Cure" + set desc = "Removes the zombie infection from all humans, returning them to normal." + if(!holder) + return + + var/confirm = alert(src, "Please confirm you want to cure all zombies?", "Confirm Zombie Cure", "Yes", "No") + if(confirm != "Yes") + return + + for(var/obj/item/organ/zombie_infection/I in GLOB.zombie_infection_list) + qdel(I) + + message_admins("[key_name_admin(usr)] cured all zombies.") + log_admin("[key_name(usr)] cured all zombies.") + SSblackbox.add_details("admin_verb","Mass Zombie Cure") + +/client/proc/polymorph_all() + set category = "Fun" + set name = "Polymorph All" + set desc = "Applies the effects of the bolt of change to every single mob." + + if(!holder) + return + + var/confirm = alert(src, "Please confirm you want polymorph all mobs?", "Confirm Polymorph", "Yes", "No") + if(confirm != "Yes") + return + + var/list/mobs = shuffle(GLOB.living_mob_list.Copy()) // might change while iterating + var/who_did_it = key_name_admin(usr) + + message_admins("[key_name_admin(usr)] started polymorphed all living mobs.") + log_admin("[key_name(usr)] polymorphed all living mobs.") + SSblackbox.add_details("admin_verb","Polymorph All") + + for(var/mob/living/M in mobs) + CHECK_TICK + + if(!M) + continue + + M.audible_message("...wabbajack...wabbajack...") + playsound(M.loc, 'sound/magic/staff_change.ogg', 50, 1, -1) + + wabbajack(M) + + message_admins("Mass polymorph started by [who_did_it] is complete.") + + +/client/proc/show_tip() + set category = "Admin" + set name = "Show Tip" + set desc = "Sends a tip (that you specify) to all players. After all \ + you're the experienced player here." + + if(!holder) + return + + var/input = input(usr, "Please specify your tip that you want to send to the players.", "Tip", "") as message|null + if(!input) + return + + if(!SSticker) + return + + SSticker.selected_tip = input + + // If we've already tipped, then send it straight away. + if(SSticker.tipped) + SSticker.send_tip_of_the_round() + + + message_admins("[key_name_admin(usr)] sent a tip of the round.") + log_admin("[key_name(usr)] sent \"[input]\" as the Tip of the Round.") + SSblackbox.add_details("admin_verb","Show Tip") + +#define ON_PURRBATION(H) (!(H.dna.features["tail_human"] == "None" && H.dna.features["ears"] == "None")) + +/proc/mass_purrbation() + for(var/M in GLOB.mob_list) + if(ishumanbasic(M)) + purrbation_apply(M) + CHECK_TICK + +/proc/mass_remove_purrbation() + for(var/M in GLOB.mob_list) + if(ishumanbasic(M)) + purrbation_remove(M) + CHECK_TICK + +/proc/purrbation_toggle(mob/living/carbon/human/H) + if(!ishumanbasic(H)) + return + if(!ON_PURRBATION(H)) + purrbation_apply(H) + . = TRUE + else + purrbation_remove(H) + . = FALSE + +/proc/purrbation_apply(mob/living/carbon/human/H) + if(!ishuman(H)) + return + if(ON_PURRBATION(H)) + return + to_chat(H, "Something is nya~t right.") + H.dna.features["tail_human"] = "Cat" + H.dna.features["ears"] = "Cat" + H.regenerate_icons() + playsound(get_turf(H), 'sound/effects/meow1.ogg', 50, 1, -1) + +/proc/purrbation_remove(mob/living/carbon/human/H) + if(!ishuman(H)) + return + if(!ON_PURRBATION(H)) + return + to_chat(H, "You are no longer a cat.") + H.dna.features["tail_human"] = "None" + H.dna.features["ears"] = "None" + H.regenerate_icons() + +#undef ON_PURRBATION + +/client/proc/modify_goals() + set category = "Debug" + set name = "Modify goals" + + if(!check_rights(R_ADMIN)) + return + + holder.modify_goals() + +/datum/admins/proc/modify_goals() + var/dat = "" + for(var/datum/station_goal/S in SSticker.mode.station_goals) + dat += "[S.name] - Announce | Remove
" + dat += "
Add New Goal" + usr << browse(dat, "window=goals;size=400x400") + + +/client/proc/toggle_hub() + set category = "Server" + set name = "Toggle Hub" + + world.update_hub_visibility(!GLOB.hub_visibility) + + log_admin("[key_name(usr)] has toggled the server's hub status for the round, it is now [(GLOB.hub_visibility?"on":"off")] the hub.") + message_admins("[key_name_admin(usr)] has toggled the server's hub status for the round, it is now [(GLOB.hub_visibility?"on":"off")] the hub.") + if (GLOB.hub_visibility && !world.reachable) + message_admins("WARNING: The server will not show up on the hub because byond is detecting that a filewall is blocking incoming connections.") + + SSblackbox.add_details("admin_toggle","Toggled Hub Visibility|[GLOB.hub_visibility]") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/smite(mob/living/carbon/human/target as mob) + set name = "Smite" + set category = "Fun" + if(!holder) + return + + var/list/punishment_list = list(ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_BSA) + + var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list + + if(QDELETED(target) || !punishment) + return + + switch(punishment) + if(ADMIN_PUNISHMENT_LIGHTNING) + var/turf/T = get_step(get_step(target, NORTH), NORTH) + T.Beam(target, icon_state="lightning[rand(1,12)]", time = 5) + target.adjustFireLoss(75) + target.electrocution_animation(40) + to_chat(target, "The gods have punished you for your sins!") + if(ADMIN_PUNISHMENT_BRAINDAMAGE) + target.adjustBrainLoss(75) + if(ADMIN_PUNISHMENT_GIB) + target.gib(FALSE) + if(ADMIN_PUNISHMENT_BSA) + bluespace_artillery(target) + + var/msg = "[key_name_admin(usr)] punished [key_name_admin(target)] with [punishment]." + message_admins(msg) + admin_ticket_log(target, msg) + log_admin("[key_name(usr)] punished [key_name(target)] with [punishment].") + + +/client/proc/trigger_centcom_recall() + if(!holder) + return + var/message = pick(GLOB.admiral_messages) + message = input("Enter message from the on-call admiral to be put in the recall report.", "Admiral Message", message) as text|null + + if(!message) + return + + message_admins("[key_name_admin(usr)] triggered a CentCom recall, with the admiral message of: [message]") + log_game("[key_name(usr)] triggered a CentCom recall, with the message of: [message]") + SSshuttle.centcom_recall(SSshuttle.emergency.timer, message) + +/client/proc/cmd_admin_check_player_exp() //Allows admins to determine who the newer players are. + set category = "Admin" + set name = "Player Playtime" + if(!check_rights(R_ADMIN)) + return + + var/list/msg = list() + msg += "Playtime ReportPlaytime:
" + src << browse(msg.Join(), "window=Player_playtime_check") + +/datum/admins/proc/cmd_show_exp_panel(client/C) + if(!check_rights(R_ADMIN)) + return + if(!C) + to_chat(usr, "ERROR: Client not found.") + return + + var/list/body = list() + body += "Playtime for [C.key]
Playtime:" + body += C.get_exp_report() + body += "Toggle Exempt status" + body += "" + usr << browse(body.Join(), "window=playerplaytime[C.ckey];size=550x615") + +/datum/admins/proc/toggle_exempt_status(client/C) + if(!check_rights(R_ADMIN)) + return + if(!C) + to_chat(usr, "ERROR: Client not found.") + return + + if(!C.set_db_player_flags()) + to_chat(usr, "ERROR: Unable read player flags from database. Please check logs.") + var/dbflags = C.prefs.db_flags + var/newstate = FALSE + if(dbflags & DB_FLAG_EXEMPT) + newstate = FALSE + else + newstate = TRUE + + if(C.update_flag_db(DB_FLAG_EXEMPT, newstate)) + to_chat(usr, "ERROR: Unable to update player flags. Please check logs.") + else + message_admins("[key_name_admin(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name_admin(C)]") +>>>>>>> 3358cbb... Cleans up some antag/event landmark checks (#31129) log_admin("[key_name(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name(C)]") \ No newline at end of file diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index 34e5d5e9a2..6fc129bee1 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /datum/round_event_control/carp_migration name = "Carp Migration" typepath = /datum/round_event/carp_migration @@ -26,3 +27,32 @@ new /mob/living/simple_animal/hostile/carp/megacarp(C.loc) +======= +/datum/round_event_control/carp_migration + name = "Carp Migration" + typepath = /datum/round_event/carp_migration + weight = 15 + min_players = 2 + earliest_start = 6000 + max_occurrences = 6 + +/datum/round_event/carp_migration + announceWhen = 3 + startWhen = 50 + +/datum/round_event/carp_migration/setup() + startWhen = rand(40, 60) + +/datum/round_event/carp_migration/announce() + priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") + + +/datum/round_event/carp_migration/start() + for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) + if(prob(95)) + new /mob/living/simple_animal/hostile/carp(C.loc) + else + new /mob/living/simple_animal/hostile/carp/megacarp(C.loc) + + +>>>>>>> 3358cbb... Cleans up some antag/event landmark checks (#31129) diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 0f1af1f8f9..bf6017a9a0 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /datum/round_event_control/electrical_storm name = "Electrical Storm" typepath = /datum/round_event/electrical_storm @@ -34,3 +35,41 @@ for(var/obj/effect/landmark/epicentre in epicentreList) for(var/obj/machinery/power/apc/apc in urange(lightsoutRange, epicentre)) apc.overload_lighting() +======= +/datum/round_event_control/electrical_storm + name = "Electrical Storm" + typepath = /datum/round_event/electrical_storm + earliest_start = 6000 + min_players = 5 + weight = 40 + alertadmins = 0 + +/datum/round_event/electrical_storm + var/lightsoutAmount = 1 + var/lightsoutRange = 25 + announceWhen = 1 + +/datum/round_event/electrical_storm/announce() + priority_announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert") + + +/datum/round_event/electrical_storm/start() + var/list/epicentreList = list() + + for(var/i=1, i <= lightsoutAmount, i++) + var/list/possibleEpicentres = list() + for(var/obj/effect/landmark/lightsout/newEpicentre in GLOB.landmarks_list) + if(!(newEpicentre in epicentreList)) + possibleEpicentres += newEpicentre + if(possibleEpicentres.len) + epicentreList += pick(possibleEpicentres) + else + break + + if(!epicentreList.len) + return + + for(var/obj/effect/landmark/epicentre in epicentreList) + for(var/obj/machinery/power/apc/apc in urange(lightsoutRange, epicentre)) + apc.overload_lighting() +>>>>>>> 3358cbb... Cleans up some antag/event landmark checks (#31129) diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 843f043bfa..4374ce9972 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /datum/round_event_control/spooky name = "2 SPOOKY! (Halloween)" holidayID = HALLOWEEN @@ -70,6 +71,79 @@ if(!H.client || !istype(H)) return to_chat(H, "Honk...") +======= +/datum/round_event_control/spooky + name = "2 SPOOKY! (Halloween)" + holidayID = HALLOWEEN + typepath = /datum/round_event/spooky + weight = -1 //forces it to be called, regardless of weight + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/spooky/start() + ..() + for(var/mob/living/carbon/human/H in GLOB.mob_list) + var/obj/item/storage/backpack/b = locate() in H.contents + new /obj/item/storage/spooky(b) + if(ishuman(H) || islizard(H)) + if(prob(50)) + H.set_species(/datum/species/skeleton) + else + H.set_species(/datum/species/zombie) + + for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in GLOB.mob_list) + Ian.place_on_head(new /obj/item/bedsheet(Ian)) + for(var/mob/living/simple_animal/parrot/Poly/Poly in GLOB.mob_list) + new /mob/living/simple_animal/parrot/Poly/ghost(Poly.loc) + qdel(Poly) + +/datum/round_event/spooky/announce() + priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE") + +//Eyeball migration +/datum/round_event_control/carp_migration/eyeballs + name = "Eyeball Migration" + typepath = /datum/round_event/carp_migration/eyeballs + holidayID = HALLOWEEN + weight = 25 + earliest_start = 0 + +/datum/round_event/carp_migration/eyeballs/start() + for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) + new /mob/living/simple_animal/hostile/carp/eyeball(C.loc) + +//Pumpking meteors waves +/datum/round_event_control/meteor_wave/spooky + name = "Pumpkin Wave" + typepath = /datum/round_event/meteor_wave/spooky + holidayID = HALLOWEEN + weight = 20 + max_occurrences = 2 + +/datum/round_event/meteor_wave/spooky + endWhen = 40 + +/datum/round_event/meteor_wave/spooky/tick() + if(IsMultiple(activeFor, 4)) + spawn_meteors(3, GLOB.meteorsSPOOKY) //meteor list types defined in gamemode/meteor/meteors.dm + +//Creepy clown invasion +/datum/round_event_control/creepy_clowns + name = "Clowns" + typepath = /datum/round_event/creepy_clowns + holidayID = HALLOWEEN + weight = 20 + earliest_start = 0 + +/datum/round_event/creepy_clowns + endWhen = 40 + +/datum/round_event/creepy_clowns/start() + for(var/mob/living/carbon/human/H in GLOB.living_mob_list) + if(!H.client || !istype(H)) + return + to_chat(H, "Honk...") +>>>>>>> 3358cbb... Cleans up some antag/event landmark checks (#31129) SEND_SOUND(H, sound('sound/spookoween/scary_clown_appear.ogg')) var/turf/T = get_turf(H) if(T) diff --git a/code/modules/events/operative.dm b/code/modules/events/operative.dm index 4db2029ce7..0841a2fdbb 100644 --- a/code/modules/events/operative.dm +++ b/code/modules/events/operative.dm @@ -16,9 +16,8 @@ var/mob/dead/selected = pick_n_take(candidates) var/list/spawn_locs = list() - for(var/obj/effect/landmark/L in GLOB.landmarks_list) - if(L.name in list("ninjaspawn","carpspawn")) - spawn_locs += L.loc + for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) + spawn_locs += L.loc if(!spawn_locs.len) return MAP_ERROR diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index cc632d9c87..5cebc55cbd 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -16,12 +16,11 @@ priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") /datum/round_event/wizard/magicarp/start() - for(var/obj/effect/landmark/C in GLOB.landmarks_list) - if(C.name == "carpspawn") - if(prob(5)) - new /mob/living/simple_animal/hostile/carp/ranged/chaos(C.loc) - else - new /mob/living/simple_animal/hostile/carp/ranged(C.loc) + for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) + if(prob(5)) + new /mob/living/simple_animal/hostile/carp/ranged/chaos(C.loc) + else + new /mob/living/simple_animal/hostile/carp/ranged(C.loc) /mob/living/simple_animal/hostile/carp/ranged name = "magicarp" diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index 1e3561c8a0..134a87e95a 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -20,15 +20,6 @@ sight |= SEE_TURFS -/* - var/list/watch_locations = list() - for(var/obj/effect/landmark/landmark in landmarks_list) - if(landmark.tag == "landmark*new_player") - watch_locations += landmark.loc - - if(watch_locations.len>0) - loc = pick(watch_locations) -*/ new_player_panel() client.playtitlemusic() if(SSticker.current_state < GAME_STATE_SETTING_UP) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index f9763cde7d..b6a2df6587 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -329,16 +329,14 @@ continue loc_landmark = sloc.loc if(!loc_landmark) - for(var/obj/effect/landmark/tripai in GLOB.landmarks_list) - if(tripai.name == "tripai") - if(locate(/mob/living/silicon/ai) in tripai.loc) - continue - loc_landmark = tripai.loc + for(var/obj/effect/landmark/tripai/L in GLOB.landmarks_list) + if(locate(/mob/living/silicon/ai) in L.loc) + continue + loc_landmark = L.loc if(!loc_landmark) to_chat(src, "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone.") - for(var/obj/effect/landmark/start/sloc in GLOB.landmarks_list) - if (sloc.name == "AI") - loc_landmark = sloc.loc + for(var/obj/effect/landmark/start/ai/sloc in GLOB.landmarks_list) + loc_landmark = sloc.loc if(!transfer_after) mind.active = FALSE diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm index a3184cbb20..1656a43505 100644 --- a/code/modules/ninja/ninja_event.dm +++ b/code/modules/ninja/ninja_event.dm @@ -39,11 +39,9 @@ Contents: //selecting a spawn_loc if(!spawn_loc) var/list/spawn_locs = list() - for(var/obj/effect/landmark/L in GLOB.landmarks_list) + for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) if(isturf(L.loc)) - switch(L.name) - if("ninjaspawn","carpspawn") - spawn_locs += L.loc + spawn_locs += L.loc if(!spawn_locs.len) return kill() spawn_loc = pick(spawn_locs) From 8636b0a9427adb6e2ccd93de1f28ac31a92e5270 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 1 Oct 2017 07:25:45 -0700 Subject: [PATCH 005/141] Fixes recyclers removing brainmobs from holders, removes direct loc setting and src.loc in playsound too --- code/game/machinery/recycler.dm | 201 ++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index fbe02dca37..961076886a 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD #define SAFETY_COOLDOWN 100 /obj/machinery/recycler @@ -195,3 +196,203 @@ info = "

New Assignment

You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect the said trash.

There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then deliver these minerals to cargo or engineering. You are our last hope for a clean station, do not screw this up!" #undef SAFETY_COOLDOWN +======= +#define SAFETY_COOLDOWN 100 + +/obj/machinery/recycler + name = "recycler" + desc = "A large crushing machine used to recycle small items inefficiently. There are lights on the side." + icon = 'icons/obj/recycling.dmi' + icon_state = "grinder-o0" + layer = ABOVE_ALL_MOB_LAYER // Overhead + anchored = TRUE + density = TRUE + circuit = /obj/item/circuitboard/machine/recycler + var/safety_mode = FALSE // Temporarily stops machine if it detects a mob + var/icon_name = "grinder-o" + var/blood = 0 + var/eat_dir = WEST + var/amount_produced = 50 + var/crush_damage = 1000 + var/eat_victim_items = TRUE + var/item_recycle_sound = 'sound/items/welder.ogg' + +/obj/machinery/recycler/Initialize() + AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM)) + . = ..() + update_icon() + +/obj/machinery/recycler/RefreshParts() + var/amt_made = 0 + var/mat_mod = 0 + for(var/obj/item/stock_parts/matter_bin/B in component_parts) + mat_mod = 2 * B.rating + mat_mod *= 50000 + for(var/obj/item/stock_parts/manipulator/M in component_parts) + amt_made = 12.5 * M.rating //% of materials salvaged + GET_COMPONENT(materials, /datum/component/material_container) + materials.max_amount = mat_mod + amount_produced = min(50, amt_made) + 50 + +/obj/machinery/recycler/examine(mob/user) + ..() + to_chat(user, "The power light is [(stat & NOPOWER) ? "off" : "on"].") + to_chat(user, "The safety-mode light is [safety_mode ? "on" : "off"].") + to_chat(user, "The safety-sensors status light is [emagged ? "off" : "on"].") + +/obj/machinery/recycler/power_change() + ..() + update_icon() + + +/obj/machinery/recycler/attackby(obj/item/I, mob/user, params) + if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I)) + return + + if(exchange_parts(user, I)) + return + + if(default_pry_open(I)) + return + + if(default_unfasten_wrench(user, I)) + return + + if(default_deconstruction_crowbar(I)) + return + return ..() + +/obj/machinery/recycler/emag_act(mob/user) + if(emagged) + return + emagged = TRUE + if(safety_mode) + safety_mode = FALSE + update_icon() + playsound(src, "sparks", 75, 1, -1) + to_chat(user, "You use the cryptographic sequencer on the [src].") + +/obj/machinery/recycler/update_icon() + ..() + var/is_powered = !(stat & (BROKEN|NOPOWER)) + if(safety_mode) + is_powered = FALSE + icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end + +/obj/machinery/recycler/CollidedWith(atom/movable/AM) + + if(stat & (BROKEN|NOPOWER)) + return + if(!anchored) + return + if(safety_mode) + return + + var/move_dir = get_dir(loc, AM.loc) + if(move_dir == eat_dir) + eat(AM) + +/obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE) + var/list/to_eat + if(istype(AM0, /obj/item)) + to_eat = AM0.GetAllContents() + else + to_eat = list(AM0) + + var/items_recycled = 0 + + for(var/i in to_eat) + var/atom/movable/AM = i + var/obj/item/bodypart/head/as_head = AM + var/obj/item/device/mmi/as_mmi = AM + var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /mob/living/brain) + if(brain_holder) + emergency_stop(AM) + else if(isliving(AM)) + if(emagged) + crush_living(AM) + else + emergency_stop(AM) + else if(istype(AM, /obj/item)) + recycle_item(AM) + items_recycled++ + else + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) + AM.forceMove(loc) + + if(items_recycled && sound) + playsound(src, item_recycle_sound, 50, 1) + +/obj/machinery/recycler/proc/recycle_item(obj/item/I) + I.forceMove(loc) + + GET_COMPONENT(materials, /datum/component/material_container) + var/material_amount = materials.get_item_material_amount(I) + if(!material_amount) + qdel(I) + return + materials.insert_item(I, multiplier = (amount_produced / 100)) + qdel(I) + materials.retrieve_all() + + +/obj/machinery/recycler/proc/emergency_stop(mob/living/L) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) + safety_mode = TRUE + update_icon() + L.forceMove(loc) + addtimer(CALLBACK(src, .proc/reboot), SAFETY_COOLDOWN) + +/obj/machinery/recycler/proc/reboot() + playsound(src, 'sound/machines/ping.ogg', 50, 0) + safety_mode = FALSE + update_icon() + +/obj/machinery/recycler/proc/crush_living(mob/living/L) + + L.forceMove(loc) + + if(issilicon(L)) + playsound(src, 'sound/items/welder.ogg', 50, 1) + else + playsound(src, 'sound/effects/splat.ogg', 50, 1) + + var/gib = TRUE + // By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count) + if(iscarbon(L)) + gib = FALSE + if(L.stat == CONSCIOUS) + L.say("ARRRRRRRRRRRGH!!!") + add_mob_blood(L) + + if(!blood && !issilicon(L)) + blood = TRUE + update_icon() + + // Remove and recycle the equipped items + if(eat_victim_items) + for(var/obj/item/I in L.get_equipped_items()) + if(L.dropItemToGround(I)) + eat(I, sound=FALSE) + + // Instantly lie down, also go unconscious from the pain, before you die. + L.Unconscious(100) + + // For admin fun, var edit emagged to 2. + if(gib || emagged == 2) + L.gib() + else if(emagged == 1) + L.adjustBruteLoss(crush_damage) + +/obj/machinery/recycler/deathtrap + name = "dangerous old crusher" + emagged = TRUE + crush_damage = 120 + flags_1 = NODECONSTRUCT_1 + +/obj/item/paper/guides/recycler + name = "paper - 'garbage duty instructions'" + info = "

New Assignment

You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect the said trash.

There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then deliver these minerals to cargo or engineering. You are our last hope for a clean station, do not screw this up!" + +#undef SAFETY_COOLDOWN +>>>>>>> f594e40... Fixes recyclers removing brainmobs from holders, removes direct loc setting and src.loc in playsound too (#31163) From c6aec36f67ba3735d3bbdcb84d9d6402b7b70aa0 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 1 Oct 2017 10:27:10 -0400 Subject: [PATCH 006/141] Merge pull request #31151 from Bawhoppen/122123 Removes random junk from Metastation evidence closets --- _maps/map_files/MetaStation/MetaStation.dmm | 40 --------------------- 1 file changed, 40 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 21180a53bd..5a1762e989 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -4354,13 +4354,6 @@ /obj/structure/closet{ name = "Evidence Closet 1" }, -/obj/item/storage/backpack{ - name = "Evidence Bag 1" - }, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, /turf/open/floor/plasteel/vault{ dir = 1 }, @@ -4387,11 +4380,6 @@ /area/security/warden) "aiz" = ( /obj/structure/closet/secure_closet/evidence, -/obj/item/storage/secure/briefcase{ - name = "Secure Evidence Briefcase"; - pixel_x = 3; - pixel_y = -3 - }, /turf/open/floor/plasteel/vault{ dir = 4 }, @@ -4758,17 +4746,10 @@ /obj/structure/closet{ name = "Evidence Closet 2" }, -/obj/item/storage/backpack{ - name = "Evidence Bag 2" - }, /obj/machinery/airalarm{ dir = 4; pixel_x = -23 }, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, /turf/open/floor/plasteel/vault{ dir = 1 }, @@ -4792,13 +4773,6 @@ /obj/structure/closet{ name = "Evidence Closet 5" }, -/obj/item/storage/backpack{ - name = "Evidence Bag 5" - }, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, /obj/machinery/firealarm{ dir = 4; pixel_x = 28 @@ -5363,13 +5337,6 @@ /obj/structure/closet{ name = "Evidence Closet 4" }, -/obj/item/storage/backpack{ - name = "Evidence Bag 4" - }, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, /turf/open/floor/plasteel/vault{ dir = 4 }, @@ -20485,13 +20452,6 @@ /obj/structure/closet{ name = "Evidence Closet 3" }, -/obj/item/storage/backpack{ - name = "Evidence Bag 3" - }, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, /turf/open/floor/plasteel/vault{ dir = 4 }, From 3a83b28bae941ccd0f62cc80c72a361e8e243ad2 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 1 Oct 2017 10:42:31 -0400 Subject: [PATCH 008/141] Adds the Cargo-Tech-of-the-Shift award --- code/game/objects/items/storage/lockbox.dm | 8 +++++++ .../crates_lockers/closets/secure/cargo.dm | 20 ++++++++++++++++++ code/modules/clothing/under/accessories.dm | 10 +++++++++ icons/mob/accessories.dmi | Bin 8682 -> 8763 bytes icons/obj/clothing/accessories.dmi | Bin 8441 -> 8758 bytes 5 files changed, 38 insertions(+) diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 385a069c00..50898e72e1 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -177,6 +177,14 @@ for(var/i in 1 to 3) new /obj/item/clothing/accessory/medal/silver/security(src) +/obj/item/storage/lockbox/medal/cargo + name = "cargo award box" + desc = "A locked box used to store awards to be given to members of the cargo department." + req_access = list(ACCESS_QM) + +/obj/item/storage/lockbox/medal/cargo/PopulateContents() + new /obj/item/clothing/accessory/medal/ribbon/cargo(src) + /obj/item/storage/lockbox/medal/sci name = "science medal box" desc = "A locked box used to store medals to be given to members of the science department." diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 77723e3e41..46067b293b 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -1,6 +1,7 @@ /obj/structure/closet/secure_closet/quartermaster name = "\proper quartermaster's locker" req_access = list(ACCESS_QM) +<<<<<<< HEAD icon_state = "qm" /obj/structure/closet/secure_closet/quartermaster/PopulateContents() @@ -17,3 +18,22 @@ new /obj/item/clothing/head/soft(src) new /obj/item/device/export_scanner(src) new /obj/item/door_remote/quartermaster(src) +======= + icon_state = "qm" + +/obj/structure/closet/secure_closet/quartermaster/PopulateContents() + ..() + new /obj/item/clothing/neck/cloak/qm(src) + new /obj/item/storage/lockbox/medal/cargo/(src) + new /obj/item/clothing/under/rank/cargo(src) + new /obj/item/clothing/shoes/sneakers/brown(src) + new /obj/item/device/radio/headset/headset_cargo(src) + new /obj/item/clothing/suit/fire/firefighter(src) + new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/device/megaphone/cargo(src) + new /obj/item/tank/internals/emergency_oxygen(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/head/soft(src) + new /obj/item/device/export_scanner(src) + new /obj/item/door_remote/quartermaster(src) +>>>>>>> bdec5d5... Merge pull request #31130 from MrDoomBringer/Doom diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 3e6a5ad371..c5e68ebcec 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -151,6 +151,16 @@ desc = "A bronze heart-shaped medal awarded for sacrifice. It is often awarded posthumously or for severe injury in the line of duty." icon_state = "bronze_heart" +/obj/item/clothing/accessory/medal/ribbon + name = "ribbon" + desc = "A ribbon" + icon_state = "cargo" + item_color = "cargo" + +/obj/item/clothing/accessory/medal/ribbon/cargo + name = "\"cargo tech of the shift\" award" + desc = "An award bestowed only upon those cargotechs who have exhibited devotion to their duty in keeping with the highest traditions of Cargonia." + /obj/item/clothing/accessory/medal/silver name = "silver medal" desc = "A silver medal." diff --git a/icons/mob/accessories.dmi b/icons/mob/accessories.dmi index 3e73083e3ed1e5ebea01eeb07a6b3916b500d411..8e3e48230f4df3db50651700122338b61d3e09e5 100644 GIT binary patch literal 8763 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 LD#MCpjD!9U0BVRG diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi index c0756a9f73df046a9b386f5252e45b7073ec93dd..4c3c0fe5ce35afc54ee9b83b3795d76b2424d513 100644 GIT binary patch literal 8758 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 From 82981339edadbef1fbfedb6ff63fb693180e3eed Mon Sep 17 00:00:00 2001 From: bawhoppen Date: Sun, 1 Oct 2017 15:07:10 -0500 Subject: [PATCH 009/141] Adds desc to things lacking them. --- code/game/machinery/_machinery.dm | 1 + .../embedded_controller/access_controller.dm | 2 + code/game/machinery/lightswitch.dm | 1 + code/game/machinery/pipe/pipe_dispenser.dm | 3 + .../machinery/porta_turret/portable_turret.dm | 3 + .../porta_turret/portable_turret_construct.dm | 1 + .../telecomms/computers/logbrowser.dm | 1 + .../telecomms/computers/telemonitor.dm | 1 + .../game/objects/items/devices/radio/radio.dm | 1 + code/game/objects/items/shooting_range.dm | 2 +- code/game/objects/items/signs.dm | 2 +- code/game/objects/items/storage/fancy.dm | 1 + code/game/objects/items/storage/secure.dm | 2 + code/game/objects/items/vending_items.dm | 1 + code/game/objects/structures/ai_core.dm | 1 + code/game/objects/structures/door_assembly.dm | 1 + code/game/objects/structures/flora.dm | 10 + code/game/objects/structures/girders.dm | 1 + .../structures/transit_tubes/station.dm | 1 + .../structures/transit_tubes/transit_tube.dm | 1 + .../transit_tube_construction.dm | 11 + .../objects/structures/windoor_assembly.dm | 20 ++ code/game/shuttle_engines.dm | 16 +- .../components/binary_devices/valve.dm | 2 +- .../components/trinary_devices/filter.dm | 1 + .../components/trinary_devices/mixer.dm | 1 + .../atmospherics/machinery/other/zvent.dm | 1 + code/modules/clothing/head/misc.dm | 2 +- code/modules/library/lib_items.dm | 328 +++++++++++++++++- code/modules/library/lib_machines.dm | 4 + code/modules/mining/machine_stacking.dm | 4 +- code/modules/research/message_server.dm | 1 + code/modules/shuttle/computer.dm | 1 + code/modules/shuttle/ferry.dm | 1 + code/modules/shuttle/syndicate.dm | 3 + 35 files changed, 423 insertions(+), 10 deletions(-) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 054bf07f70..23b398605c 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -95,6 +95,7 @@ Class Procs: /obj/machinery name = "machinery" icon = 'icons/obj/stationobjs.dmi' + desc = "Some kind of machine." verb_say = "beeps" verb_yell = "blares" pressure_resistance = 15 diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm index c23f4d0ba8..5e0d018554 100644 --- a/code/game/machinery/embedded_controller/access_controller.dm +++ b/code/game/machinery/embedded_controller/access_controller.dm @@ -42,6 +42,7 @@ icon = 'icons/obj/airlock_machines.dmi' icon_state = "access_button_standby" name = "access button" + desc = "A button used for the explicit purpose of opening an airlock." var/idDoor var/obj/machinery/door/airlock/door var/obj/machinery/doorButtons/airlock_controller/controller @@ -107,6 +108,7 @@ icon = 'icons/obj/airlock_machines.dmi' icon_state = "access_control_standby" name = "access console" + desc = "A small console that can cycle opening between two airlocks." var/obj/machinery/door/airlock/interiorAirlock var/obj/machinery/door/airlock/exteriorAirlock var/idInterior diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index a979ba6398..102be57f9b 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -6,6 +6,7 @@ icon = 'icons/obj/power.dmi' icon_state = "light1" anchored = TRUE + desc = "Make dark." var/on = TRUE var/area/area = null var/otherarea = null diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 39b3760f7e..cedb94b7b3 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -2,6 +2,7 @@ name = "pipe dispenser" icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" + desc = "Dispenses countless types of pipes. Very useful if you need pipes." density = TRUE anchored = TRUE var/wait = 0 @@ -108,6 +109,7 @@ name = "disposal pipe dispenser" icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" + desc = "Dispenses pipes that will ultimately be used to move trash around." density = TRUE anchored = TRUE @@ -183,6 +185,7 @@ Nah icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" density = TRUE + desc = "Dispenses pipes that will move beings around." anchored = TRUE /obj/machinery/pipedispenser/disposal/transit_tube/attack_hand(mob/user) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index b84de7cf18..e9f0f76bc9 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -12,6 +12,7 @@ layer = OBJ_LAYER invisibility = INVISIBILITY_OBSERVER //the turret is invisible if it's inside its cover density = TRUE + desc = "A covered turret that shoots at its enemies." use_power = IDLE_POWER_USE //this turret uses and requires power idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power @@ -552,6 +553,7 @@ base_icon_state = "syndie" faction = "syndicate" emp_vunerable = 0 + desc = "A ballistic machine gun auto-turret." /obj/machinery/porta_turret/syndicate/energy icon_state = "standard_stun" @@ -560,6 +562,7 @@ stun_projectile_sound = 'sound/weapons/taser.ogg' lethal_projectile = /obj/item/projectile/beam/laser/heavylaser lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg' + desc = "An energy blaster auto-turret." /obj/machinery/porta_turret/syndicate/setup() return diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index 1dbdc52b1e..7eace08636 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -12,6 +12,7 @@ name = "turret frame" icon = 'icons/obj/turrets.dmi' icon_state = "turret_frame" + desc = "An unfinished covered turret frame." density = TRUE var/build_step = PTURRET_UNSECURED //the current step in the building process var/finish_name = "turret" //the name applied to the product turret diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm index 92a4edfcd2..590c8d03a5 100644 --- a/code/game/machinery/telecomms/computers/logbrowser.dm +++ b/code/game/machinery/telecomms/computers/logbrowser.dm @@ -3,6 +3,7 @@ /obj/machinery/computer/telecomms/server name = "telecommunications server monitoring console" icon_screen = "comm_logs" + desc = "Has full access to all details and record of the telecommunications network it's monitoring." var/screen = 0 // the screen number: var/list/servers = list() // the servers located by the computer diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm index bccbfd96fd..cb3ae78e72 100644 --- a/code/game/machinery/telecomms/computers/telemonitor.dm +++ b/code/game/machinery/telecomms/computers/telemonitor.dm @@ -8,6 +8,7 @@ /obj/machinery/computer/telecomms/monitor name = "telecommunications monitoring console" icon_screen = "comm_monitor" + desc = "Monitors the details of the telecommunications network it's synced with." var/screen = 0 // the screen number: var/list/machinelist = list() // the machines located by the computer diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 0f59d00ab8..83d29457f6 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -4,6 +4,7 @@ suffix = "\[3\]" icon_state = "walkietalkie" item_state = "walkietalkie" + desc = "A basic handheld radio that communicates with local telecommunication networks." dog_fashion = /datum/dog_fashion/back var/on = TRUE // 0 for off var/last_transmission diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 28d4d13967..c8249024f8 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -41,7 +41,7 @@ /obj/item/target/syndicate icon_state = "target_s" - desc = "A shooting target that looks like a syndicate scum." + desc = "A shooting target that looks like syndicate scum." hp = 2600 /obj/item/target/alien diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm index c492b752f0..350daa0fc3 100644 --- a/code/game/objects/items/signs.dm +++ b/code/game/objects/items/signs.dm @@ -1,7 +1,7 @@ /obj/item/picket_sign icon_state = "picket" name = "blank picket sign" - desc = "It's blank" + desc = "It's blank." force = 5 w_class = WEIGHT_CLASS_BULKY attack_verb = list("bashed","smacked") diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index b5417e8f8e..435bc64c41 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -17,6 +17,7 @@ icon = 'icons/obj/food/containers.dmi' icon_state = "donutbox6" name = "donut box" + desc = "Mmm. Donuts." resistance_flags = FLAMMABLE var/icon_type = "donut" var/spawn_type = null diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index ef65f2dac3..4d56b6a8e8 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -25,6 +25,7 @@ w_class = WEIGHT_CLASS_NORMAL max_w_class = WEIGHT_CLASS_SMALL max_combined_w_class = 14 + desc = "This shouldn't exist. If it does, create an issue report." /obj/item/storage/secure/examine(mob/user) ..() @@ -177,6 +178,7 @@ icon_opened = "safe0" icon_locking = "safeb" icon_sparking = "safespark" + desc = "Excellent for securing things away from grubby hands." force = 8 w_class = WEIGHT_CLASS_GIGANTIC max_w_class = 8 diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm index b062c39ee5..e84295f8ed 100644 --- a/code/game/objects/items/vending_items.dm +++ b/code/game/objects/items/vending_items.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/vending_restock.dmi' icon_state = "refill_snack" item_state = "restock_unit" + desc = "A vending machine restock cart." lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' flags_1 = CONDUCT_1 diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 709d86d4d7..d01cd5a191 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -4,6 +4,7 @@ name = "\improper AI core" icon = 'icons/mob/ai.dmi' icon_state = "0" + desc = "The framework for an artificial intelligence core." max_integrity = 500 var/state = 0 var/datum/ai_laws/laws = new() diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 1183618d5a..0dee3b2191 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -6,6 +6,7 @@ anchored = FALSE density = TRUE max_integrity = 200 + desc = "The mechanical framework for an airlock." var/state = 0 var/mineral = null var/typetext = "" diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 6aa338f047..c1b6c56bf5 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -6,6 +6,7 @@ //trees /obj/structure/flora/tree name = "tree" + desc = "A large tree." density = TRUE pixel_x = -16 layer = FLY_LAYER @@ -40,6 +41,7 @@ /obj/structure/flora/tree/pine name = "pine tree" + desc = "A coniferous pine tree." icon = 'icons/obj/flora/pinetrees.dmi' icon_state = "pine_1" @@ -49,6 +51,7 @@ /obj/structure/flora/tree/pine/xmas name = "xmas tree" + desc = "A wondrous decorated Christmas tree." icon_state = "pine_c" /obj/structure/flora/tree/pine/xmas/Initialize() @@ -57,10 +60,12 @@ /obj/structure/flora/tree/dead icon = 'icons/obj/flora/deadtrees.dmi' + desc = "A dead tree. How it died, you know not." icon_state = "tree_1" /obj/structure/flora/tree/palm icon = 'icons/misc/beach2.dmi' + desc = "A tree straight from the tropics." icon_state = "palm1" /obj/structure/flora/tree/palm/Initialize() @@ -98,6 +103,7 @@ //grass /obj/structure/flora/grass name = "grass" + desc = "A patch of overgrown grass." icon = 'icons/obj/flora/snowflora.dmi' gender = PLURAL //"this is grass" not "this is a grass" @@ -127,6 +133,7 @@ //bushes /obj/structure/flora/bush name = "bush" + desc = "Some type of shrub." icon = 'icons/obj/flora/snowflora.dmi' icon_state = "snowbush1" anchored = TRUE @@ -139,6 +146,7 @@ /obj/structure/flora/ausbushes name = "bush" + desc = "Some kind of plant." icon = 'icons/obj/flora/ausflora.dmi' icon_state = "firstbush_1" @@ -256,6 +264,7 @@ name = "potted plant" icon = 'icons/obj/flora/plants.dmi' icon_state = "plant-01" + desc = "A little bit of nature contained in a pot." layer = ABOVE_MOB_LAYER w_class = WEIGHT_CLASS_HUGE force = 10 @@ -365,6 +374,7 @@ /obj/structure/flora/junglebush name = "bush" + desc = "A wild plant that is found in jungles." icon = 'icons/obj/flora/jungleflora.dmi' icon_state = "busha" diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 02f6d784df..3d7e9be21a 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -1,6 +1,7 @@ /obj/structure/girder name = "girder" icon_state = "girder" + desc = "A large structural assembly made out of metal; It requires a layer of metal before it can be considered a wall." anchored = TRUE density = TRUE layer = BELOW_OBJ_LAYER diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index ffc62ac127..1c2c0c326e 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -7,6 +7,7 @@ /obj/structure/transit_tube/station name = "station tube station" icon_state = "closed_station0" + desc = "The lynchpin of the transit system." exit_delay = 1 enter_delay = 2 tube_construction = /obj/structure/c_transit_tube/station diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index 10d883d392..e409eb533b 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -3,6 +3,7 @@ name = "transit tube" icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' icon_state = "straight" + desc = "A transit tube for moving things around." density = TRUE layer = LOW_ITEM_LAYER anchored = TRUE diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index a1f7bcc8de..746790a20f 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD // transit tube construction // normal transit tubes @@ -5,6 +6,16 @@ name = "unattached transit tube" icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' icon_state = "straight" +======= +// transit tube construction + +// normal transit tubes +/obj/structure/c_transit_tube + name = "unattached transit tube" + icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' + icon_state = "straight" + desc = "An unattached segment of transit tube." +>>>>>>> 3e4d747... Adds desc to things lacking them. (#31086) density = FALSE layer = LOW_ITEM_LAYER //same as the built tube anchored = FALSE diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 6503acf6d3..2dbc8f38a6 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /* Windoor (window door) assembly -Nodrak * Step 1: Create a windoor out of rglass * Step 2: Add r-glass to the assembly to make a secure windoor (Optional) @@ -14,6 +15,25 @@ name = "windoor Assembly" icon_state = "l_windoor_assembly01" +======= +/* Windoor (window door) assembly -Nodrak + * Step 1: Create a windoor out of rglass + * Step 2: Add r-glass to the assembly to make a secure windoor (Optional) + * Step 3: Rotate or Flip the assembly to face and open the way you want + * Step 4: Wrench the assembly in place + * Step 5: Add cables to the assembly + * Step 6: Set access for the door. + * Step 7: Screwdriver the door to complete + */ + + +/obj/structure/windoor_assembly + icon = 'icons/obj/doors/windoor.dmi' + + name = "windoor Assembly" + icon_state = "l_windoor_assembly01" + desc = "A small glass and wire assembly for windoors." +>>>>>>> 3e4d747... Adds desc to things lacking them. (#31086) anchored = FALSE density = FALSE dir = NORTH diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index 4722991309..80329f20a1 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -12,6 +12,7 @@ /obj/structure/shuttle/engine name = "engine" + desc = "A bluespace engine used to make shuttles move." density = TRUE anchored = TRUE var/engine_power = 1 @@ -81,18 +82,21 @@ M.alter_engines(mod) /obj/structure/shuttle/engine/heater - name = "heater" + name = "engine heater" icon_state = "heater" + desc = "Directs energy into compressed particles in order to power engines." engine_power = 0 // todo make these into 2x1 parts /obj/structure/shuttle/engine/platform - name = "platform" + name = "engine platform" icon_state = "platform" + desc = "A platform for engine components." engine_power = 0 /obj/structure/shuttle/engine/propulsion name = "propulsion engine" icon_state = "propulsion" + desc = "A standard reliable bluespace engine used by many forms of shuttles." opacity = 1 /obj/structure/shuttle/engine/propulsion/left @@ -105,6 +109,7 @@ /obj/structure/shuttle/engine/propulsion/burst name = "burst engine" + desc = "An engine that releases a large bluespace burst to propel it." /obj/structure/shuttle/engine/propulsion/burst/cargo state = ENGINE_UNWRENCHED @@ -119,14 +124,16 @@ icon_state = "burst_r" /obj/structure/shuttle/engine/router - name = "router" + name = "engine router" icon_state = "router" + desc = "Redirects around energized particles in engine structures." /obj/structure/shuttle/engine/large name = "engine" opacity = 1 icon = 'icons/obj/2x2.dmi' icon_state = "large_engine" + desc = "A very large bluespace engine used to propel very large ships." bound_width = 64 bound_height = 64 appearance_flags = 0 @@ -136,6 +143,7 @@ opacity = 1 icon = 'icons/obj/3x3.dmi' icon_state = "huge_engine" + desc = "An extremely large bluespace engine used to propel extremely large ships." bound_width = 96 bound_height = 96 - appearance_flags = 0 \ No newline at end of file + appearance_flags = 0 diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm index 7ef6cf2142..dbe1343667 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm @@ -5,7 +5,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off. /obj/machinery/atmospherics/components/binary/valve icon_state = "mvalve_map" name = "manual valve" - desc = "A pipe valve" + desc = "A pipe with a valve that can be used to disable flow of gas through it." can_unwrench = TRUE diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index c777e5fe17..2b5a94ef64 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -1,6 +1,7 @@ /obj/machinery/atmospherics/components/trinary/filter name = "gas filter" icon_state = "filter_off" + desc = "Very useful for filtering gasses." density = FALSE can_unwrench = TRUE var/on = FALSE diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index cb515ec75f..1fb8b072c6 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -4,6 +4,7 @@ name = "gas mixer" can_unwrench = TRUE + desc = "Very useful for mixing gasses." var/on = FALSE diff --git a/code/modules/atmospherics/machinery/other/zvent.dm b/code/modules/atmospherics/machinery/other/zvent.dm index 3490c972d9..d12c6196ec 100644 --- a/code/modules/atmospherics/machinery/other/zvent.dm +++ b/code/modules/atmospherics/machinery/other/zvent.dm @@ -5,6 +5,7 @@ icon_state = "vent_map" density = FALSE anchored=1 + desc = "This may be needed some day." var/on = FALSE var/volume_rate = 800 diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index db3bcd3538..87106d65b4 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -283,7 +283,7 @@ /obj/item/clothing/head/crown/fancy name = "magnificent crown" - desc = "A crown worn by only the highest emperors of the land." + desc = "A crown worn by only the highest emperors of the land space." icon_state = "fancycrown" /obj/item/clothing/head/scarecrow_hat diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 17d626b3a0..c55aa8d43f 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /* Library Items * * Contains: @@ -317,4 +318,329 @@ to_chat(user, "Computer has been associated with this unit.") else to_chat(user, "No associated computer found. Only local scans will function properly.") - to_chat(user, "\n") \ No newline at end of file + to_chat(user, "\n") +======= +/* Library Items + * + * Contains: + * Bookcase + * Book + * Barcode Scanner + */ + +/* + * Bookcase + */ + +/obj/structure/bookcase + name = "bookcase" + icon = 'icons/obj/library.dmi' + icon_state = "bookempty" + desc = "A great place for storing knowledge." + anchored = FALSE + density = TRUE + opacity = 0 + resistance_flags = FLAMMABLE + max_integrity = 200 + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0) + var/state = 0 + var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/book) //Things allowed in the bookcase + + +/obj/structure/bookcase/Initialize(mapload) + . = ..() + if(!mapload) + return + state = 2 + icon_state = "book-0" + anchored = TRUE + for(var/obj/item/I in loc) + if(istype(I, /obj/item/book)) + I.loc = src + update_icon() + + +/obj/structure/bookcase/attackby(obj/item/I, mob/user, params) + switch(state) + if(0) + if(istype(I, /obj/item/wrench)) + playsound(loc, I.usesound, 100, 1) + if(do_after(user, 20*I.toolspeed, target = src)) + to_chat(user, "You wrench the frame into place.") + anchored = TRUE + state = 1 + if(istype(I, /obj/item/crowbar)) + playsound(loc, I.usesound, 100, 1) + if(do_after(user, 20*I.toolspeed, target = src)) + to_chat(user, "You pry the frame apart.") + deconstruct(TRUE) + + if(1) + if(istype(I, /obj/item/stack/sheet/mineral/wood)) + var/obj/item/stack/sheet/mineral/wood/W = I + if(W.get_amount() >= 2) + W.use(2) + to_chat(user, "You add a shelf.") + state = 2 + icon_state = "book-0" + if(istype(I, /obj/item/wrench)) + playsound(loc, I.usesound, 100, 1) + to_chat(user, "You unwrench the frame.") + anchored = FALSE + state = 0 + + if(2) + if(is_type_in_list(I, allowed_books)) + if(!user.drop_item()) + return + I.loc = src + update_icon() + else if(istype(I, /obj/item/storage/bag/books)) + var/obj/item/storage/bag/books/B = I + for(var/obj/item/T in B.contents) + if(istype(T, /obj/item/book) || istype(T, /obj/item/spellbook)) + B.remove_from_storage(T, src) + to_chat(user, "You empty \the [I] into \the [src].") + update_icon() + else if(istype(I, /obj/item/pen)) + var/newname = stripped_input(user, "What would you like to title this bookshelf?") + if(!newname) + return + else + name = ("bookcase ([sanitize(newname)])") + else if(istype(I, /obj/item/crowbar)) + if(contents.len) + to_chat(user, "You need to remove the books first!") + else + playsound(loc, I.usesound, 100, 1) + to_chat(user, "You pry the shelf out.") + new /obj/item/stack/sheet/mineral/wood(loc, 2) + state = 1 + icon_state = "bookempty" + else + return ..() + + +/obj/structure/bookcase/attack_hand(mob/user) + if(contents.len) + var/obj/item/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents + if(choice) + if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + return + if(ishuman(user)) + if(!user.get_active_held_item()) + user.put_in_hands(choice) + else + choice.loc = get_turf(src) + update_icon() + + +/obj/structure/bookcase/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/mineral/wood(loc, 4) + for(var/obj/item/book/B in contents) + B.forceMove(get_turf(src)) + qdel(src) + + +/obj/structure/bookcase/update_icon() + if(contents.len < 5) + icon_state = "book-[contents.len]" + else + icon_state = "book-5" + + +/obj/structure/bookcase/manuals/medical + name = "medical manuals bookcase" + +/obj/structure/bookcase/manuals/medical/New() + ..() + new /obj/item/book/manual/medical_cloning(src) + update_icon() + + +/obj/structure/bookcase/manuals/engineering + name = "engineering manuals bookcase" + +/obj/structure/bookcase/manuals/engineering/New() + ..() + new /obj/item/book/manual/wiki/engineering_construction(src) + new /obj/item/book/manual/engineering_particle_accelerator(src) + new /obj/item/book/manual/wiki/engineering_hacking(src) + new /obj/item/book/manual/wiki/engineering_guide(src) + new /obj/item/book/manual/engineering_singularity_safety(src) + new /obj/item/book/manual/robotics_cyborgs(src) + update_icon() + + +/obj/structure/bookcase/manuals/research_and_development + name = "\improper R&D manuals bookcase" + +/obj/structure/bookcase/manuals/research_and_development/New() + ..() + new /obj/item/book/manual/research_and_development(src) + update_icon() + + +/* + * Book + */ +/obj/item/book + name = "book" + icon = 'icons/obj/library.dmi' + icon_state ="book" + desc = "Crack it open, inhale the musk of its pages, and learn something new." + throw_speed = 1 + throw_range = 5 + w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) + attack_verb = list("bashed", "whacked", "educated") + resistance_flags = FLAMMABLE + var/dat //Actual page content + var/due_date = 0 //Game time in 1/10th seconds + var/author //Who wrote the thing, can be changed by pen or PC. It is not automatically assigned + var/unique = 0 //0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified + var/title //The real name of the book. + var/window_size = null // Specific window size for the book, i.e: "1920x1080", Size x Width + +/obj/item/book/attack_self(mob/user) + if(is_blind(user)) + to_chat(user, "As you are trying to read, you suddenly feel very stupid!") + return + if(ismonkey(user)) + to_chat(user, "You skim through the book but can't comprehend any of it.") + return + if(dat) + user << browse("Penned by [author].
" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]") + user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.") + onclose(user, "book") + else + to_chat(user, "This book is completely blank!") + + +/obj/item/book/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/pen)) + if(is_blind(user)) + to_chat(user, " As you are trying to write on the book, you suddenly feel very stupid!") + return + if(unique) + to_chat(user, "These pages don't seem to take the ink well! Looks like you can't modify it.") + return + var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel") + switch(choice) + if("Title") + var/newtitle = reject_bad_text(stripped_input(usr, "Write a new title:")) + if (length(newtitle) > 20) + to_chat(usr, "That title won't fit on the cover!") + return + if(!newtitle) + to_chat(usr, "That title is invalid.") + return + else + name = newtitle + title = newtitle + if("Contents") + var/content = stripped_input(usr, "Write your book's contents (HTML NOT allowed):","","",8192) + if(!content) + to_chat(usr, "The content is invalid.") + return + else + dat += content + if("Author") + var/newauthor = stripped_input(usr, "Write the author's name:") + if(!newauthor) + to_chat(usr, "The name is invalid.") + return + else + author = newauthor + else + return + + else if(istype(I, /obj/item/barcodescanner)) + var/obj/item/barcodescanner/scanner = I + if(!scanner.computer) + to_chat(user, "[I]'s screen flashes: 'No associated computer found!'") + else + switch(scanner.mode) + if(0) + scanner.book = src + to_chat(user, "[I]'s screen flashes: 'Book stored in buffer.'") + if(1) + scanner.book = src + scanner.computer.buffer_book = name + to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'") + if(2) + scanner.book = src + for(var/datum/borrowbook/b in scanner.computer.checkouts) + if(b.bookname == name) + scanner.computer.checkouts.Remove(b) + to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Book has been checked in.'") + return + to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'") + if(3) + scanner.book = src + for(var/obj/item/book in scanner.computer.inventory) + if(book == src) + to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'") + return + scanner.computer.inventory.Add(src) + to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'") + + else if(istype(I, /obj/item/kitchen/knife) || istype(I, /obj/item/wirecutters)) + to_chat(user, "You begin to carve out [title]...") + if(do_after(user, 30, target = src)) + to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.") + var/obj/item/storage/book/B = new + B.name = src.name + B.title = src.title + B.icon_state = src.icon_state + if(user.is_holding(src)) + qdel(src) + user.put_in_hands(B) + return + else + B.loc = src.loc + qdel(src) + return + return + else + ..() + + +/* + * Barcode Scanner + */ +/obj/item/barcodescanner + name = "barcode scanner" + icon = 'icons/obj/library.dmi' + icon_state ="scanner" + desc = "A fabulous tool if you need to scan a barcode." + throw_speed = 3 + throw_range = 5 + w_class = WEIGHT_CLASS_TINY + var/obj/machinery/computer/libraryconsole/bookmanagement/computer //Associated computer - Modes 1 to 3 use this + var/obj/item/book/book //Currently scanned book + var/mode = 0 //0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory + +/obj/item/barcodescanner/attack_self(mob/user) + mode += 1 + if(mode > 3) + mode = 0 + to_chat(user, "[src] Status Display:") + var/modedesc + switch(mode) + if(0) + modedesc = "Scan book to local buffer." + if(1) + modedesc = "Scan book to local buffer and set associated computer buffer to match." + if(2) + modedesc = "Scan book to local buffer, attempt to check in scanned book." + if(3) + modedesc = "Scan book to local buffer, attempt to add book to general inventory." + else + modedesc = "ERROR" + to_chat(user, " - Mode [mode] : [modedesc]") + if(computer) + to_chat(user, "Computer has been associated with this unit.") + else + to_chat(user, "No associated computer found. Only local scans will function properly.") + to_chat(user, "\n") +>>>>>>> 3e4d747... Adds desc to things lacking them. (#31086) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 99127cd595..dc48bbae2d 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -20,6 +20,7 @@ icon_screen = "library" icon_keyboard = null circuit = /obj/item/circuitboard/computer/libraryconsole + desc = "Checked out books MUST be returned on time." var/screenstate = 0 var/title var/category = "Any" @@ -161,6 +162,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums // It's December 25th, 2014, and this is STILL here, and it's STILL relevant. Kill me /obj/machinery/computer/libraryconsole/bookmanagement name = "book inventory management console" + desc = "Librarian's command station." var/arcanecheckout = 0 screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book verb_say = "beeps" @@ -498,6 +500,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums name = "scanner control interface" icon = 'icons/obj/library.dmi' icon_state = "bigscanner" + desc = "It servers the purpose of scanning stuff." anchored = TRUE density = TRUE var/obj/item/book/cache // Last scanned book @@ -554,6 +557,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums name = "book binder" icon = 'icons/obj/library.dmi' icon_state = "binder" + desc = "Only intended for binding paper products." anchored = TRUE density = TRUE var/busy = FALSE diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 96589fb575..0c9bcdc170 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -4,6 +4,7 @@ name = "stacking machine console" icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "console" + desc = "Controls a stacking machine... in theory." density = FALSE anchored = TRUE var/obj/machinery/mineral/stacking_machine/machine = null @@ -60,6 +61,7 @@ name = "stacking machine" icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "stacker" + desc = "A machine that automatically stacks acquired materials. Controlled by a nearby console." density = TRUE anchored = TRUE var/obj/machinery/mineral/stacking_unit_console/CONSOLE @@ -90,4 +92,4 @@ var/obj/item/stack/sheet/out = new inp.type() out.amount = stack_amt unload_mineral(out) - storage.amount -= stack_amt \ No newline at end of file + storage.amount -= stack_amt diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 650eebba1a..0cef65c07c 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -67,6 +67,7 @@ GLOBAL_LIST_INIT(message_servers, list()) icon = 'icons/obj/machines/research.dmi' icon_state = "server" name = "Messaging Server" + desc = "A machine that attempts to gather the secret knowledge of the universe." density = TRUE anchored = TRUE use_power = IDLE_POWER_USE diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index 8384e978e5..47ceaef99e 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -1,5 +1,6 @@ /obj/machinery/computer/shuttle name = "shuttle console" + desc = "A shuttle control computer." icon_screen = "shuttle" icon_keyboard = "tech_key" light_color = LIGHT_COLOR_CYAN diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm index 5b27e562f3..07103088d1 100644 --- a/code/modules/shuttle/ferry.dm +++ b/code/modules/shuttle/ferry.dm @@ -1,5 +1,6 @@ /obj/machinery/computer/shuttle/ferry name = "transport ferry console" + desc = "A console that controls the transport ferry." circuit = /obj/item/circuitboard/computer/ferry shuttleId = "ferry" possible_destinations = "ferry_home;ferry_away" diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index ac1339d33e..4574e62bd1 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -2,6 +2,7 @@ /obj/machinery/computer/shuttle/syndicate name = "syndicate shuttle terminal" + desc = "The terminal used to control the syndicate transport shuttle." circuit = /obj/item/circuitboard/computer/syndicate_shuttle icon_screen = "syndishuttle" icon_keyboard = "syndie_key" @@ -13,6 +14,7 @@ /obj/machinery/computer/shuttle/syndicate/recall name = "syndicate shuttle recall terminal" + desc = "Use this if your friends left you behind." possible_destinations = "syndicate_away" @@ -27,6 +29,7 @@ /obj/machinery/computer/shuttle/syndicate/drop_pod name = "syndicate assault pod control" + desc = "Controls the drop pod's launch system." icon = 'icons/obj/terminals.dmi' icon_state = "dorm_available" light_color = LIGHT_COLOR_BLUE From eeeae1b855615646422cb57e5f4c5d361c99be6a Mon Sep 17 00:00:00 2001 From: oranges Date: Mon, 2 Oct 2017 09:19:21 +1300 Subject: [PATCH 010/141] Fixes grown runtime spam --- code/modules/hydroponics/grown.dm | 8 +-- code/modules/hydroponics/growninedible.dm | 67 +++++++++++++++++++++++ 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 5f5752deec..d5cac19f32 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -17,9 +17,9 @@ resistance_flags = FLAMMABLE origin_tech = "biotech=1" -/obj/item/reagent_containers/food/snacks/grown/New(newloc, var/obj/item/seeds/new_seed = null) - tastes = list(name = 1) // apples taste of apple, silly. - ..() +/obj/item/reagent_containers/food/snacks/grown/Initialize(mapload, obj/item/seeds/new_seed) + . = ..() + tastes = list("[name]" = 1) // apples taste of apple, silly. if(new_seed) seed = new_seed.Copy() else if(ispath(seed)) @@ -35,7 +35,7 @@ if(seed) for(var/datum/plant_gene/trait/T in seed.genes) - T.on_new(src, newloc) + T.on_new(src, loc) seed.prepare_result(src) transform *= TransformUsingVariable(seed.potency, 100, 0.5) //Makes the resulting produce's sprite larger or smaller based on potency! add_juice() diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 6058088f75..01be327caa 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD // ********************** // Other harvested materials from plants (that are not food) // ********************** @@ -62,3 +63,69 @@ /obj/item/grown/microwave_act(obj/machine/microwave/M) return +======= +// ********************** +// Other harvested materials from plants (that are not food) +// ********************** + +/obj/item/grown // Grown weapons + name = "grown_weapon" + icon = 'icons/obj/hydroponics/harvest.dmi' + resistance_flags = FLAMMABLE + var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item. + +/obj/item/grown/Initialize(newloc, obj/item/seeds/new_seed) + . = ..() + create_reagents(50) + + if(new_seed) + seed = new_seed.Copy() + else if(ispath(seed)) + // This is for adminspawn or map-placed growns. They get the default stats of their seed type. + seed = new seed() + seed.adjust_potency(50-seed.potency) + + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) + + if(seed) + for(var/datum/plant_gene/trait/T in seed.genes) + T.on_new(src, newloc) + + if(istype(src, seed.product)) // no adding reagents if it is just a trash item + seed.prepare_result(src) + transform *= TransformUsingVariable(seed.potency, 100, 0.5) + add_juice() + + +/obj/item/grown/attackby(obj/item/O, mob/user, params) + ..() + if (istype(O, /obj/item/device/plant_analyzer)) + var/msg = "*---------*\n This is \a [src]\n" + if(seed) + msg += seed.get_analyzer_text() + msg += "" + to_chat(usr, msg) + return + +/obj/item/grown/proc/add_juice() + if(reagents) + return 1 + return 0 + + +/obj/item/grown/Crossed(atom/movable/AM) + if(seed) + for(var/datum/plant_gene/trait/T in seed.genes) + T.on_cross(src, AM) + ..() + +/obj/item/grown/throw_impact(atom/hit_atom) + if(!..()) //was it caught by a mob? + if(seed) + for(var/datum/plant_gene/trait/T in seed.genes) + T.on_throw_impact(src, hit_atom) + +/obj/item/grown/microwave_act(obj/machine/microwave/M) + return +>>>>>>> 7477a55... Merge pull request #31201 from AnturK/grownspam From d27484395828a8a4c138d4c671abf0dbc1acaea4 Mon Sep 17 00:00:00 2001 From: XDTM Date: Sat, 30 Sep 2017 21:11:06 +0200 Subject: [PATCH 011/141] Fixes viruses not calling Start on their symptoms when spreading --- code/datums/diseases/_MobProcs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 1d3e7f2a12..a00d43ad8f 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -43,7 +43,7 @@ SSdisease.active_diseases += DD //Add it to the active diseases list, now that it's actually in a mob and being processed. //Copy properties over. This is so edited diseases persist. - var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed","symptoms") + var/list/skipped = list("affected_mob","holder","carrier","stage","type","parent_type","vars","transformed","symptoms","processing") for(var/V in DD.vars) if(V in skipped) continue From 4274a875db9275aa71a4518bc643bc9b6856f971 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Sun, 1 Oct 2017 13:21:23 -0700 Subject: [PATCH 013/141] Ashwalker tendrils now drop everything on victims before consuming (#31177) * Update ash_walker_den.dm * Update ash_walker_den.dm --- code/modules/ruins/objects_and_mobs/ash_walker_den.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm index 5e0f43c7a9..1cc5b482f0 100644 --- a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm +++ b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm @@ -25,6 +25,9 @@ if(H.stat) visible_message("Serrated tendrils eagerly pull [H] to [src], tearing the body apart as its blood seeps over the eggs.") playsound(get_turf(src),'sound/magic/demon_consume.ogg', 100, 1) + for(var/obj/item/W in H) + if(!H.dropItemToGround(W)) + qdel(W) if(ismegafauna(H)) meat_counter += 20 else From fef5c537916fc0f72ca0f367c0373302d15adcd7 Mon Sep 17 00:00:00 2001 From: oranges Date: Mon, 2 Oct 2017 09:25:35 +1300 Subject: [PATCH 015/141] Merge pull request #31173 from tgstation/Cyberboss-patch-3 Edits to code/controllers/configuration/entries autotag Config Update --- tools/WebhookProcessor/github_webhook_processor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php index a8b32c7a92..ede37e4428 100644 --- a/tools/WebhookProcessor/github_webhook_processor.php +++ b/tools/WebhookProcessor/github_webhook_processor.php @@ -209,7 +209,7 @@ function tag_pr($payload, $opened) { $tags[] = 'Merge Conflict'; $treetags = array('_maps' => 'Map Edit', 'tools' => 'Tools', 'SQL' => 'SQL'); - $addonlytags = array('icons' => 'Sprites', 'sounds' => 'Sound', 'config' => 'Config Update'); + $addonlytags = array('icons' => 'Sprites', 'sounds' => 'Sound', 'config' => 'Config Update', 'code/controllers/configuration/entries' => 'Config Update'); foreach($treetags as $tree => $tag) if(has_tree_been_edited($payload, $tree)) $tags[] = $tag; From 00aa312610352318c35650b249e619097864f526 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 1 Oct 2017 15:26:15 -0500 Subject: [PATCH 017/141] Update carp_migration.dm --- code/modules/events/carp_migration.dm | 33 --------------------------- 1 file changed, 33 deletions(-) diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index 6fc129bee1..ca6cd782fc 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -1,33 +1,3 @@ -<<<<<<< HEAD -/datum/round_event_control/carp_migration - name = "Carp Migration" - typepath = /datum/round_event/carp_migration - weight = 15 - min_players = 2 - earliest_start = 6000 - max_occurrences = 6 - -/datum/round_event/carp_migration - announceWhen = 3 - startWhen = 50 - -/datum/round_event/carp_migration/setup() - startWhen = rand(40, 60) - -/datum/round_event/carp_migration/announce() - priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") - - -/datum/round_event/carp_migration/start() - for(var/obj/effect/landmark/C in GLOB.landmarks_list) - if(C.name == "carpspawn") - if(prob(95)) - new /mob/living/simple_animal/hostile/carp(C.loc) - else - new /mob/living/simple_animal/hostile/carp/megacarp(C.loc) - - -======= /datum/round_event_control/carp_migration name = "Carp Migration" typepath = /datum/round_event/carp_migration @@ -53,6 +23,3 @@ new /mob/living/simple_animal/hostile/carp(C.loc) else new /mob/living/simple_animal/hostile/carp/megacarp(C.loc) - - ->>>>>>> 3358cbb... Cleans up some antag/event landmark checks (#31129) From f1f99fc26c27d04a19ad9c6ecc8f4e7095972082 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 1 Oct 2017 15:26:32 -0500 Subject: [PATCH 018/141] Update electrical_storm.dm --- code/modules/events/electrical_storm.dm | 39 ------------------------- 1 file changed, 39 deletions(-) diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index bf6017a9a0..a10e42d754 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -1,41 +1,3 @@ -<<<<<<< HEAD -/datum/round_event_control/electrical_storm - name = "Electrical Storm" - typepath = /datum/round_event/electrical_storm - earliest_start = 6000 - min_players = 5 - weight = 40 - alertadmins = 0 - -/datum/round_event/electrical_storm - var/lightsoutAmount = 1 - var/lightsoutRange = 25 - announceWhen = 1 - -/datum/round_event/electrical_storm/announce() - priority_announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert") - - -/datum/round_event/electrical_storm/start() - var/list/epicentreList = list() - - for(var/i=1, i <= lightsoutAmount, i++) - var/list/possibleEpicentres = list() - for(var/obj/effect/landmark/newEpicentre in GLOB.landmarks_list) - if(newEpicentre.name == "lightsout" && !(newEpicentre in epicentreList)) - possibleEpicentres += newEpicentre - if(possibleEpicentres.len) - epicentreList += pick(possibleEpicentres) - else - break - - if(!epicentreList.len) - return - - for(var/obj/effect/landmark/epicentre in epicentreList) - for(var/obj/machinery/power/apc/apc in urange(lightsoutRange, epicentre)) - apc.overload_lighting() -======= /datum/round_event_control/electrical_storm name = "Electrical Storm" typepath = /datum/round_event/electrical_storm @@ -72,4 +34,3 @@ for(var/obj/effect/landmark/epicentre in epicentreList) for(var/obj/machinery/power/apc/apc in urange(lightsoutRange, epicentre)) apc.overload_lighting() ->>>>>>> 3358cbb... Cleans up some antag/event landmark checks (#31129) From 676abb946cda4b16419431afb7c391df8ea13db7 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 1 Oct 2017 15:26:56 -0500 Subject: [PATCH 019/141] Update halloween.dm --- code/modules/events/holiday/halloween.dm | 205 +++++++---------------- 1 file changed, 65 insertions(+), 140 deletions(-) diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 4374ce9972..5415eab386 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -1,77 +1,3 @@ -<<<<<<< HEAD -/datum/round_event_control/spooky - name = "2 SPOOKY! (Halloween)" - holidayID = HALLOWEEN - typepath = /datum/round_event/spooky - weight = -1 //forces it to be called, regardless of weight - max_occurrences = 1 - earliest_start = 0 - -/datum/round_event/spooky/start() - ..() - for(var/mob/living/carbon/human/H in GLOB.mob_list) - var/obj/item/storage/backpack/b = locate() in H.contents - new /obj/item/storage/spooky(b) - if(ishuman(H) || islizard(H)) - if(prob(50)) - H.set_species(/datum/species/skeleton) - else - H.set_species(/datum/species/zombie) - - for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in GLOB.mob_list) - Ian.place_on_head(new /obj/item/bedsheet(Ian)) - for(var/mob/living/simple_animal/parrot/Poly/Poly in GLOB.mob_list) - new /mob/living/simple_animal/parrot/Poly/ghost(Poly.loc) - qdel(Poly) - -/datum/round_event/spooky/announce() - priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE") - -//Eyeball migration -/datum/round_event_control/carp_migration/eyeballs - name = "Eyeball Migration" - typepath = /datum/round_event/carp_migration/eyeballs - holidayID = HALLOWEEN - weight = 25 - earliest_start = 0 - -/datum/round_event/carp_migration/eyeballs/start() - for(var/obj/effect/landmark/C in GLOB.landmarks_list) - if(C.name == "carpspawn") - new /mob/living/simple_animal/hostile/carp/eyeball(C.loc) - -//Pumpking meteors waves -/datum/round_event_control/meteor_wave/spooky - name = "Pumpkin Wave" - typepath = /datum/round_event/meteor_wave/spooky - holidayID = HALLOWEEN - weight = 20 - max_occurrences = 2 - -/datum/round_event/meteor_wave/spooky - endWhen = 40 - -/datum/round_event/meteor_wave/spooky/tick() - if(IsMultiple(activeFor, 4)) - spawn_meteors(3, GLOB.meteorsSPOOKY) //meteor list types defined in gamemode/meteor/meteors.dm - -//Creepy clown invasion -/datum/round_event_control/creepy_clowns - name = "Clowns" - typepath = /datum/round_event/creepy_clowns - holidayID = HALLOWEEN - weight = 20 - earliest_start = 0 - -/datum/round_event/creepy_clowns - endWhen = 40 - -/datum/round_event/creepy_clowns/start() - for(var/mob/living/carbon/human/H in GLOB.living_mob_list) - if(!H.client || !istype(H)) - return - to_chat(H, "Honk...") -======= /datum/round_event_control/spooky name = "2 SPOOKY! (Halloween)" holidayID = HALLOWEEN @@ -143,70 +69,69 @@ if(!H.client || !istype(H)) return to_chat(H, "Honk...") ->>>>>>> 3358cbb... Cleans up some antag/event landmark checks (#31129) 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) - -/datum/round_event/creepy_clowns/tick() - if(IsMultiple(activeFor, 4)) - for(var/mob/living/carbon/human/H in GLOB.living_mob_list) - if (prob(66)) - playsound(H.loc, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 100, 1) - if (prob(33)) - var/turf/T = get_turf(H) - if(T) - new /obj/effect/hallucination/simple/clown(T, H, 25) - else if (prob(25)) - var/turf/T = get_turf(H) - if(T) - new /obj/effect/hallucination/simple/clown/scary(T, H, 25) - else if (prob(5)) - var/turf/T = get_turf(H) - if(T) - spawn_atom_to_turf(/obj/effect/mob_spawn/human/clown/corpse, H, 1) - else if (prob(1)) - spawn_atom_to_turf(/mob/living/simple_animal/hostile/retaliate/clown, H, 1) - -/datum/round_event/creepy_clowns/announce() - priority_announce("Honk... Honk... honk... HONK! HONK! HONKHONKHONKHONKHONK", "HONK!", 'sound/spookoween/scary_horn.ogg') - -//spooky foods (you can't actually make these when it's not halloween) -/obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull - name = "skull cookie" - desc = "Spooky! It's got delicious calcium flavouring!" - icon = 'icons/obj/halloween_items.dmi' - icon_state = "skeletoncookie" - -/obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin - name = "coffin cookie" - desc = "Spooky! It's got delicious coffee flavouring!" - icon = 'icons/obj/halloween_items.dmi' - icon_state = "coffincookie" - - -//spooky items - -/obj/item/storage/spooky - name = "trick-o-treat bag" - desc = "A pumpkin-shaped bag that holds all sorts of goodies!" - icon = 'icons/obj/halloween_items.dmi' - icon_state = "treatbag" - -/obj/item/storage/spooky/New() - ..() - for(var/distrobuteinbag=0 to 5) - var/type = pick(/obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull, - /obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin, - /obj/item/reagent_containers/food/snacks/candy_corn, - /obj/item/reagent_containers/food/snacks/candy, - /obj/item/reagent_containers/food/snacks/candiedapple, - /obj/item/reagent_containers/food/snacks/chocolatebar, - /obj/item/organ/brain ) // OH GOD THIS ISN'T CANDY! - new type(src) - -/obj/item/card/emag/halloween - name = "hack-o'-lantern" - desc = "It's a pumpkin with a cryptographic sequencer sticking out." - icon_state = "hack_o_lantern" + var/turf/T = get_turf(H) + if(T) + new /obj/effect/hallucination/simple/clown(T, H, 50) + +/datum/round_event/creepy_clowns/tick() + if(IsMultiple(activeFor, 4)) + for(var/mob/living/carbon/human/H in GLOB.living_mob_list) + if (prob(66)) + playsound(H.loc, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 100, 1) + if (prob(33)) + var/turf/T = get_turf(H) + if(T) + new /obj/effect/hallucination/simple/clown(T, H, 25) + else if (prob(25)) + var/turf/T = get_turf(H) + if(T) + new /obj/effect/hallucination/simple/clown/scary(T, H, 25) + else if (prob(5)) + var/turf/T = get_turf(H) + if(T) + spawn_atom_to_turf(/obj/effect/mob_spawn/human/clown/corpse, H, 1) + else if (prob(1)) + spawn_atom_to_turf(/mob/living/simple_animal/hostile/retaliate/clown, H, 1) + +/datum/round_event/creepy_clowns/announce() + priority_announce("Honk... Honk... honk... HONK! HONK! HONKHONKHONKHONKHONK", "HONK!", 'sound/spookoween/scary_horn.ogg') + +//spooky foods (you can't actually make these when it's not halloween) +/obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull + name = "skull cookie" + desc = "Spooky! It's got delicious calcium flavouring!" + icon = 'icons/obj/halloween_items.dmi' + icon_state = "skeletoncookie" + +/obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin + name = "coffin cookie" + desc = "Spooky! It's got delicious coffee flavouring!" + icon = 'icons/obj/halloween_items.dmi' + icon_state = "coffincookie" + + +//spooky items + +/obj/item/storage/spooky + name = "trick-o-treat bag" + desc = "A pumpkin-shaped bag that holds all sorts of goodies!" + icon = 'icons/obj/halloween_items.dmi' + icon_state = "treatbag" + +/obj/item/storage/spooky/New() + ..() + for(var/distrobuteinbag=0 to 5) + var/type = pick(/obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull, + /obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin, + /obj/item/reagent_containers/food/snacks/candy_corn, + /obj/item/reagent_containers/food/snacks/candy, + /obj/item/reagent_containers/food/snacks/candiedapple, + /obj/item/reagent_containers/food/snacks/chocolatebar, + /obj/item/organ/brain ) // OH GOD THIS ISN'T CANDY! + new type(src) + +/obj/item/card/emag/halloween + name = "hack-o'-lantern" + desc = "It's a pumpkin with a cryptographic sequencer sticking out." + icon_state = "hack_o_lantern" From 4d610b95bdfdb377f2ef7eb0f67eff02920f4595 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 1 Oct 2017 16:27:23 -0400 Subject: [PATCH 020/141] Maplist is loaded regardless of maprotation config setting (#31172) * Uncomments map rotation in default config * Maplist is loaded regardless of maprotation config setting Also logs loading of the map file --- code/controllers/configuration/configuration.dm | 4 ++-- config/config.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 8df012e5de..49ccb411fc 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -24,8 +24,7 @@ GLOBAL_PROTECT(config_dir) LoadModes() for(var/I in config_files) LoadEntries(I) - if(Get(/datum/config_entry/flag/maprotation)) - loadmaplist(CONFIG_MAPS_FILE) + loadmaplist(CONFIG_MAPS_FILE) /datum/controller/configuration/Destroy() entries_by_type.Cut() @@ -170,6 +169,7 @@ GLOBAL_PROTECT(config_dir) /datum/controller/configuration/proc/loadmaplist(filename) filename = "[GLOB.config_dir][filename]" + log_config("Loading config file [filename]...") var/list/Lines = world.file2list(filename) var/datum/map_config/currentmap = null diff --git a/config/config.txt b/config/config.txt index 079ec0d9c6..d5d2725714 100644 --- a/config/config.txt +++ b/config/config.txt @@ -286,7 +286,7 @@ ANNOUNCE_ADMIN_LOGOUT ## Map rotation ## You should edit maps.txt to match your configuration when you enable this. -#MAPROTATION +MAPROTATION ## Map voting ## Allows players to vote for their preffered map From f3ae038f6c9bb6dbb517e1fcdfbde876e72a5657 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 1 Oct 2017 15:35:27 -0500 Subject: [PATCH 022/141] Update cargo.dm --- .../crates_lockers/closets/secure/cargo.dm | 23 ++----------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 46067b293b..4e83a709b9 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -1,24 +1,6 @@ -/obj/structure/closet/secure_closet/quartermaster - name = "\proper quartermaster's locker" +/obj/structure/closet/secure_closet/quartermaster + name = "\proper quartermaster's locker" req_access = list(ACCESS_QM) -<<<<<<< HEAD - icon_state = "qm" - -/obj/structure/closet/secure_closet/quartermaster/PopulateContents() - ..() - new /obj/item/clothing/neck/cloak/qm(src) - new /obj/item/clothing/under/rank/cargo(src) - new /obj/item/clothing/shoes/sneakers/brown(src) - new /obj/item/device/radio/headset/headset_cargo(src) - new /obj/item/clothing/suit/fire/firefighter(src) - new /obj/item/clothing/gloves/fingerless(src) - new /obj/item/device/megaphone/cargo(src) - new /obj/item/tank/internals/emergency_oxygen(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/head/soft(src) - new /obj/item/device/export_scanner(src) - new /obj/item/door_remote/quartermaster(src) -======= icon_state = "qm" /obj/structure/closet/secure_closet/quartermaster/PopulateContents() @@ -36,4 +18,3 @@ new /obj/item/clothing/head/soft(src) new /obj/item/device/export_scanner(src) new /obj/item/door_remote/quartermaster(src) ->>>>>>> bdec5d5... Merge pull request #31130 from MrDoomBringer/Doom From 1c00a8ba291afa57699c6a28d2b8d8e81fec3845 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 1 Oct 2017 15:38:09 -0500 Subject: [PATCH 023/141] Update recycler.dm --- code/game/machinery/recycler.dm | 200 -------------------------------- 1 file changed, 200 deletions(-) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 961076886a..d2ea1a4fd6 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -1,202 +1,3 @@ -<<<<<<< HEAD -#define SAFETY_COOLDOWN 100 - -/obj/machinery/recycler - name = "recycler" - desc = "A large crushing machine used to recycle small items inefficiently. There are lights on the side." - icon = 'icons/obj/recycling.dmi' - icon_state = "grinder-o0" - layer = ABOVE_ALL_MOB_LAYER // Overhead - anchored = TRUE - density = TRUE - circuit = /obj/item/circuitboard/machine/recycler - var/safety_mode = FALSE // Temporarily stops machine if it detects a mob - var/icon_name = "grinder-o" - var/blood = 0 - var/eat_dir = WEST - var/amount_produced = 50 - var/crush_damage = 1000 - var/eat_victim_items = TRUE - var/item_recycle_sound = 'sound/items/welder.ogg' - -/obj/machinery/recycler/Initialize() - AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM)) - . = ..() - update_icon() - -/obj/machinery/recycler/RefreshParts() - var/amt_made = 0 - var/mat_mod = 0 - for(var/obj/item/stock_parts/matter_bin/B in component_parts) - mat_mod = 2 * B.rating - mat_mod *= 50000 - for(var/obj/item/stock_parts/manipulator/M in component_parts) - amt_made = 12.5 * M.rating //% of materials salvaged - GET_COMPONENT(materials, /datum/component/material_container) - materials.max_amount = mat_mod - amount_produced = min(50, amt_made) + 50 - -/obj/machinery/recycler/examine(mob/user) - ..() - to_chat(user, "The power light is [(stat & NOPOWER) ? "off" : "on"].") - to_chat(user, "The safety-mode light is [safety_mode ? "on" : "off"].") - to_chat(user, "The safety-sensors status light is [emagged ? "off" : "on"].") - -/obj/machinery/recycler/power_change() - ..() - update_icon() - - -/obj/machinery/recycler/attackby(obj/item/I, mob/user, params) - if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I)) - return - - if(exchange_parts(user, I)) - return - - if(default_pry_open(I)) - return - - if(default_unfasten_wrench(user, I)) - return - - if(default_deconstruction_crowbar(I)) - return - return ..() - -/obj/machinery/recycler/emag_act(mob/user) - if(emagged) - return - emagged = TRUE - if(safety_mode) - safety_mode = FALSE - update_icon() - playsound(src, "sparks", 75, 1, -1) - to_chat(user, "You use the cryptographic sequencer on the [src].") - -/obj/machinery/recycler/update_icon() - ..() - var/is_powered = !(stat & (BROKEN|NOPOWER)) - if(safety_mode) - is_powered = FALSE - icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end - -/obj/machinery/recycler/CollidedWith(atom/movable/AM) - - if(stat & (BROKEN|NOPOWER)) - return - if(!anchored) - return - if(safety_mode) - return - - var/move_dir = get_dir(loc, AM.loc) - if(move_dir == eat_dir) - eat(AM) - -/obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE) - var/list/to_eat - if(istype(AM0, /obj/item)) - to_eat = AM0.GetAllContents() - else - to_eat = list(AM0) - - var/items_recycled = 0 - - for(var/i in to_eat) - var/atom/movable/AM = i - var/obj/item/bodypart/head/as_head = AM - var/obj/item/device/mmi/as_mmi = AM - var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /mob/living/brain) - if(isliving(AM) || brain_holder) - if(emagged) - if(!brain_holder) - crush_living(AM) - else - emergency_stop(AM) - else if(istype(AM, /obj/item)) - recycle_item(AM) - items_recycled++ - else - playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) - AM.loc = src.loc - - if(items_recycled && sound) - playsound(src.loc, item_recycle_sound, 50, 1) - -/obj/machinery/recycler/proc/recycle_item(obj/item/I) - I.loc = src.loc - - GET_COMPONENT(materials, /datum/component/material_container) - var/material_amount = materials.get_item_material_amount(I) - if(!material_amount) - qdel(I) - return - materials.insert_item(I, multiplier = (amount_produced / 100)) - qdel(I) - materials.retrieve_all() - - -/obj/machinery/recycler/proc/emergency_stop(mob/living/L) - playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) - safety_mode = TRUE - update_icon() - L.loc = src.loc - addtimer(CALLBACK(src, .proc/reboot), SAFETY_COOLDOWN) - -/obj/machinery/recycler/proc/reboot() - playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) - safety_mode = FALSE - update_icon() - -/obj/machinery/recycler/proc/crush_living(mob/living/L) - - L.loc = src.loc - - if(issilicon(L)) - playsound(src.loc, 'sound/items/welder.ogg', 50, 1) - else - playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) - - var/gib = TRUE - // By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count) - if(iscarbon(L)) - gib = FALSE - if(L.stat == CONSCIOUS) - L.say("ARRRRRRRRRRRGH!!!") - add_mob_blood(L) - - if(!blood && !issilicon(L)) - blood = TRUE - update_icon() - - // Remove and recycle the equipped items - if(eat_victim_items) - for(var/obj/item/I in L.get_equipped_items()) - if(L.dropItemToGround(I)) - eat(I, sound=FALSE) - - // Instantly lie down, also go unconscious from the pain, before you die. - L.Unconscious(100) - - // For admin fun, var edit emagged to 2. - if(gib || emagged == 2) - L.gib() - else if(emagged == 1) - L.adjustBruteLoss(crush_damage) - -/obj/machinery/recycler/deathtrap - name = "dangerous old crusher" - emagged = TRUE - crush_damage = 120 - flags_1 = NODECONSTRUCT_1 - -/obj/item/paper/guides/recycler - name = "paper - 'garbage duty instructions'" - info = "

New Assignment

You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect the said trash.

There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then deliver these minerals to cargo or engineering. You are our last hope for a clean station, do not screw this up!" - -#undef SAFETY_COOLDOWN -======= #define SAFETY_COOLDOWN 100 /obj/machinery/recycler @@ -395,4 +196,3 @@ info = "

New Assignment

You have been assigned to collect garbage from trash bins, located around the station. The crewmembers will put their trash into it and you will collect the said trash.

There is a recycling machine near your closet, inside maintenance; use it to recycle the trash for a small chance to get useful minerals. Then deliver these minerals to cargo or engineering. You are our last hope for a clean station, do not screw this up!" #undef SAFETY_COOLDOWN ->>>>>>> f594e40... Fixes recyclers removing brainmobs from holders, removes direct loc setting and src.loc in playsound too (#31163) From 4a4ecdf2119ca41ce65d3d057407102a53d8fd76 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 1 Oct 2017 15:46:20 -0500 Subject: [PATCH 024/141] Update transit_tube_construction.dm --- .../transit_tube_construction.dm | 304 +++++++++--------- 1 file changed, 147 insertions(+), 157 deletions(-) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index 746790a20f..62e46e49dd 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -1,12 +1,3 @@ -<<<<<<< HEAD -// transit tube construction - -// normal transit tubes -/obj/structure/c_transit_tube - name = "unattached transit tube" - icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' - icon_state = "straight" -======= // transit tube construction // normal transit tubes @@ -15,155 +6,154 @@ icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' icon_state = "straight" desc = "An unattached segment of transit tube." ->>>>>>> 3e4d747... Adds desc to things lacking them. (#31086) density = FALSE - layer = LOW_ITEM_LAYER //same as the built tube + layer = LOW_ITEM_LAYER //same as the built tube anchored = FALSE - var/flipped = 0 - var/build_type = /obj/structure/transit_tube - var/flipped_build_type - var/base_icon - -/obj/structure/c_transit_tube/examine(mob/user) - ..() - to_chat(user, "Alt-click to rotate it clockwise.") - -/obj/structure/c_transit_tube/proc/tube_rotate() - setDir(turn(dir, -90)) - -/obj/structure/c_transit_tube/proc/tube_flip() - if(flipped_build_type) - flipped = !flipped - var/cur_flip = initial(flipped) ? !flipped : flipped - if(cur_flip) - build_type = flipped_build_type - else - build_type = initial(build_type) - icon_state = "[base_icon][flipped]" - else - setDir(turn(dir, 180)) - -// disposals-style flip and rotate verbs -/obj/structure/c_transit_tube/verb/rotate() - set name = "Rotate Tube" - set category = "Object" - set src in view(1) - - if(usr.incapacitated()) - return - - tube_rotate() - -/obj/structure/c_transit_tube/AltClick(mob/user) - ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) - return - tube_rotate() - -/obj/structure/c_transit_tube/verb/flip() - set name = "Flip" - set category = "Object" - set src in view(1) - - if(usr.incapacitated()) - return - tube_flip() - - -/obj/structure/c_transit_tube/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/wrench)) - to_chat(user, "You start attaching the [name]...") - add_fingerprint(user) - playsound(src.loc, I.usesound, 50, 1) - if(do_after(user, 40*I.toolspeed, target = src)) - if(QDELETED(src)) - return - to_chat(user, "You attach the [name].") - var/obj/structure/transit_tube/R = new build_type(loc, dir) - transfer_fingerprints_to(R) - qdel(src) - else - return ..() - -// transit tube station -/obj/structure/c_transit_tube/station - name = "unattached through station" - icon_state = "closed_station0" - build_type = /obj/structure/transit_tube/station - flipped_build_type = /obj/structure/transit_tube/station/flipped - base_icon = "closed_station" - -/obj/structure/c_transit_tube/station/flipped - icon_state = "closed_station1" - flipped = 1 - build_type = /obj/structure/transit_tube/station/flipped - flipped_build_type = /obj/structure/transit_tube/station - - -// reverser station, used for the terminus -/obj/structure/c_transit_tube/station/reverse - name = "unattached terminus station" - icon_state = "closed_terminus0" - build_type = /obj/structure/transit_tube/station/reverse - flipped_build_type = /obj/structure/transit_tube/station/reverse/flipped - base_icon = "closed_terminus" - -/obj/structure/c_transit_tube/station/reverse/flipped - icon_state = "closed_terminus1" - flipped = 1 - build_type = /obj/structure/transit_tube/station/reverse/flipped - flipped_build_type = /obj/structure/transit_tube/station/reverse - - -/obj/structure/c_transit_tube/crossing - icon_state = "crossing" - build_type = /obj/structure/transit_tube/crossing - - -/obj/structure/c_transit_tube/diagonal - icon_state = "diagonal" - build_type = /obj/structure/transit_tube/diagonal - -/obj/structure/c_transit_tube/diagonal/crossing - icon_state = "diagonal_crossing" - build_type = /obj/structure/transit_tube/diagonal/crossing - - -/obj/structure/c_transit_tube/curved - icon_state = "curved0" - build_type = /obj/structure/transit_tube/curved - flipped_build_type = /obj/structure/transit_tube/curved/flipped - base_icon = "curved" - -/obj/structure/c_transit_tube/curved/flipped - icon_state = "curved1" - build_type = /obj/structure/transit_tube/curved/flipped - flipped_build_type = /obj/structure/transit_tube/curved - flipped = 1 - - -/obj/structure/c_transit_tube/junction - icon_state = "junction0" - build_type = /obj/structure/transit_tube/junction - flipped_build_type = /obj/structure/transit_tube/junction/flipped - base_icon = "junction" - - -/obj/structure/c_transit_tube/junction/flipped - icon_state = "junction1" - flipped = 1 - build_type = /obj/structure/transit_tube/junction/flipped - flipped_build_type = /obj/structure/transit_tube/junction - - -//transit tube pod -//see station.dm for the logic -/obj/structure/c_transit_tube_pod - name = "unattached transit tube pod" - icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' - icon_state = "pod" + var/flipped = 0 + var/build_type = /obj/structure/transit_tube + var/flipped_build_type + var/base_icon + +/obj/structure/c_transit_tube/examine(mob/user) + ..() + to_chat(user, "Alt-click to rotate it clockwise.") + +/obj/structure/c_transit_tube/proc/tube_rotate() + setDir(turn(dir, -90)) + +/obj/structure/c_transit_tube/proc/tube_flip() + if(flipped_build_type) + flipped = !flipped + var/cur_flip = initial(flipped) ? !flipped : flipped + if(cur_flip) + build_type = flipped_build_type + else + build_type = initial(build_type) + icon_state = "[base_icon][flipped]" + else + setDir(turn(dir, 180)) + +// disposals-style flip and rotate verbs +/obj/structure/c_transit_tube/verb/rotate() + set name = "Rotate Tube" + set category = "Object" + set src in view(1) + + if(usr.incapacitated()) + return + + tube_rotate() + +/obj/structure/c_transit_tube/AltClick(mob/user) + ..() + if(user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user)) + return + tube_rotate() + +/obj/structure/c_transit_tube/verb/flip() + set name = "Flip" + set category = "Object" + set src in view(1) + + if(usr.incapacitated()) + return + tube_flip() + + +/obj/structure/c_transit_tube/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/wrench)) + to_chat(user, "You start attaching the [name]...") + add_fingerprint(user) + playsound(src.loc, I.usesound, 50, 1) + if(do_after(user, 40*I.toolspeed, target = src)) + if(QDELETED(src)) + return + to_chat(user, "You attach the [name].") + var/obj/structure/transit_tube/R = new build_type(loc, dir) + transfer_fingerprints_to(R) + qdel(src) + else + return ..() + +// transit tube station +/obj/structure/c_transit_tube/station + name = "unattached through station" + icon_state = "closed_station0" + build_type = /obj/structure/transit_tube/station + flipped_build_type = /obj/structure/transit_tube/station/flipped + base_icon = "closed_station" + +/obj/structure/c_transit_tube/station/flipped + icon_state = "closed_station1" + flipped = 1 + build_type = /obj/structure/transit_tube/station/flipped + flipped_build_type = /obj/structure/transit_tube/station + + +// reverser station, used for the terminus +/obj/structure/c_transit_tube/station/reverse + name = "unattached terminus station" + icon_state = "closed_terminus0" + build_type = /obj/structure/transit_tube/station/reverse + flipped_build_type = /obj/structure/transit_tube/station/reverse/flipped + base_icon = "closed_terminus" + +/obj/structure/c_transit_tube/station/reverse/flipped + icon_state = "closed_terminus1" + flipped = 1 + build_type = /obj/structure/transit_tube/station/reverse/flipped + flipped_build_type = /obj/structure/transit_tube/station/reverse + + +/obj/structure/c_transit_tube/crossing + icon_state = "crossing" + build_type = /obj/structure/transit_tube/crossing + + +/obj/structure/c_transit_tube/diagonal + icon_state = "diagonal" + build_type = /obj/structure/transit_tube/diagonal + +/obj/structure/c_transit_tube/diagonal/crossing + icon_state = "diagonal_crossing" + build_type = /obj/structure/transit_tube/diagonal/crossing + + +/obj/structure/c_transit_tube/curved + icon_state = "curved0" + build_type = /obj/structure/transit_tube/curved + flipped_build_type = /obj/structure/transit_tube/curved/flipped + base_icon = "curved" + +/obj/structure/c_transit_tube/curved/flipped + icon_state = "curved1" + build_type = /obj/structure/transit_tube/curved/flipped + flipped_build_type = /obj/structure/transit_tube/curved + flipped = 1 + + +/obj/structure/c_transit_tube/junction + icon_state = "junction0" + build_type = /obj/structure/transit_tube/junction + flipped_build_type = /obj/structure/transit_tube/junction/flipped + base_icon = "junction" + + +/obj/structure/c_transit_tube/junction/flipped + icon_state = "junction1" + flipped = 1 + build_type = /obj/structure/transit_tube/junction/flipped + flipped_build_type = /obj/structure/transit_tube/junction + + +//transit tube pod +//see station.dm for the logic +/obj/structure/c_transit_tube_pod + name = "unattached transit tube pod" + icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' + icon_state = "pod" anchored = FALSE density = FALSE From 76d6402a9d4d7309747866f9a2b82b058457f293 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 1 Oct 2017 15:46:31 -0500 Subject: [PATCH 025/141] Update windoor_assembly.dm --- .../objects/structures/windoor_assembly.dm | 705 +++++++++--------- 1 file changed, 343 insertions(+), 362 deletions(-) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 2dbc8f38a6..c4a0d48dde 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -1,21 +1,3 @@ -<<<<<<< HEAD -/* Windoor (window door) assembly -Nodrak - * Step 1: Create a windoor out of rglass - * Step 2: Add r-glass to the assembly to make a secure windoor (Optional) - * Step 3: Rotate or Flip the assembly to face and open the way you want - * Step 4: Wrench the assembly in place - * Step 5: Add cables to the assembly - * Step 6: Set access for the door. - * Step 7: Screwdriver the door to complete - */ - - -/obj/structure/windoor_assembly - icon = 'icons/obj/doors/windoor.dmi' - - name = "windoor Assembly" - icon_state = "l_windoor_assembly01" -======= /* Windoor (window door) assembly -Nodrak * Step 1: Create a windoor out of rglass * Step 2: Add r-glass to the assembly to make a secure windoor (Optional) @@ -33,358 +15,357 @@ name = "windoor Assembly" icon_state = "l_windoor_assembly01" desc = "A small glass and wire assembly for windoors." ->>>>>>> 3e4d747... Adds desc to things lacking them. (#31086) anchored = FALSE density = FALSE - dir = NORTH - - var/ini_dir - var/obj/item/electronics/airlock/electronics = null - var/created_name = null - - //Vars to help with the icon's name - var/facing = "l" //Does the windoor open to the left or right? + dir = NORTH + + var/ini_dir + var/obj/item/electronics/airlock/electronics = null + var/created_name = null + + //Vars to help with the icon's name + var/facing = "l" //Does the windoor open to the left or right? var/secure = FALSE //Whether or not this creates a secure windoor - var/state = "01" //How far the door assembly has progressed - CanAtmosPass = ATMOS_PASS_PROC - -/obj/structure/windoor_assembly/examine(mob/user) - ..() - to_chat(user, "Alt-click to rotate it clockwise.") - -/obj/structure/windoor_assembly/New(loc, set_dir) - ..() - if(set_dir) - dir = set_dir - ini_dir = dir - air_update_turf(1) - -/obj/structure/windoor_assembly/Destroy() + var/state = "01" //How far the door assembly has progressed + CanAtmosPass = ATMOS_PASS_PROC + +/obj/structure/windoor_assembly/examine(mob/user) + ..() + to_chat(user, "Alt-click to rotate it clockwise.") + +/obj/structure/windoor_assembly/New(loc, set_dir) + ..() + if(set_dir) + dir = set_dir + ini_dir = dir + air_update_turf(1) + +/obj/structure/windoor_assembly/Destroy() density = FALSE - air_update_turf(1) - return ..() - -/obj/structure/windoor_assembly/Move() - var/turf/T = loc - ..() - setDir(ini_dir) - move_update_air(T) - -/obj/structure/windoor_assembly/update_icon() - icon_state = "[facing]_[secure ? "secure_" : ""]windoor_assembly[state]" - + air_update_turf(1) + return ..() + +/obj/structure/windoor_assembly/Move() + var/turf/T = loc + ..() + setDir(ini_dir) + move_update_air(T) + +/obj/structure/windoor_assembly/update_icon() + icon_state = "[facing]_[secure ? "secure_" : ""]windoor_assembly[state]" + /obj/structure/windoor_assembly/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && mover.checkpass(PASSGLASS)) - return 1 - if(get_dir(loc, target) == dir) //Make sure looking at appropriate border - return !density - if(istype(mover, /obj/structure/window)) - var/obj/structure/window/W = mover - if(!valid_window_location(loc, W.ini_dir)) - return FALSE - else if(istype(mover, /obj/structure/windoor_assembly)) - var/obj/structure/windoor_assembly/W = mover - if(!valid_window_location(loc, W.ini_dir)) - return FALSE - else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir)) - return FALSE - return 1 - -/obj/structure/windoor_assembly/CanAtmosPass(turf/T) - if(get_dir(loc, T) == dir) - return !density - else - return 1 - -/obj/structure/windoor_assembly/CheckExit(atom/movable/mover as mob|obj, turf/target) - if(istype(mover) && mover.checkpass(PASSGLASS)) - return 1 - if(get_dir(loc, target) == dir) - return !density - else - return 1 - - -/obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, params) - //I really should have spread this out across more states but thin little windoors are hard to sprite. - add_fingerprint(user) - switch(state) - if("01") - if(istype(W, /obj/item/weldingtool) && !anchored ) - var/obj/item/weldingtool/WT = W - if (WT.remove_fuel(0,user)) - user.visible_message("[user] disassembles the windoor assembly.", "You start to disassemble the windoor assembly...") - playsound(loc, 'sound/items/welder2.ogg', 50, 1) - - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src || !WT.isOn()) return - to_chat(user, "You disassemble the windoor assembly.") - var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5) - RG.add_fingerprint(user) - if(secure) - var/obj/item/stack/rods/R = new (get_turf(src), 4) - R.add_fingerprint(user) - qdel(src) - else - return - - //Wrenching an unsecure assembly anchors it in place. Step 4 complete - if(istype(W, /obj/item/wrench) && !anchored) - for(var/obj/machinery/door/window/WD in loc) - if(WD.dir == dir) - to_chat(user, "There is already a windoor in that location!") - return - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor...") - - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src || anchored) - return - for(var/obj/machinery/door/window/WD in loc) - if(WD.dir == dir) - to_chat(user, "There is already a windoor in that location!") - return - to_chat(user, "You secure the windoor assembly.") + if(istype(mover) && mover.checkpass(PASSGLASS)) + return 1 + if(get_dir(loc, target) == dir) //Make sure looking at appropriate border + return !density + if(istype(mover, /obj/structure/window)) + var/obj/structure/window/W = mover + if(!valid_window_location(loc, W.ini_dir)) + return FALSE + else if(istype(mover, /obj/structure/windoor_assembly)) + var/obj/structure/windoor_assembly/W = mover + if(!valid_window_location(loc, W.ini_dir)) + return FALSE + else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir)) + return FALSE + return 1 + +/obj/structure/windoor_assembly/CanAtmosPass(turf/T) + if(get_dir(loc, T) == dir) + return !density + else + return 1 + +/obj/structure/windoor_assembly/CheckExit(atom/movable/mover as mob|obj, turf/target) + if(istype(mover) && mover.checkpass(PASSGLASS)) + return 1 + if(get_dir(loc, target) == dir) + return !density + else + return 1 + + +/obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, params) + //I really should have spread this out across more states but thin little windoors are hard to sprite. + add_fingerprint(user) + switch(state) + if("01") + if(istype(W, /obj/item/weldingtool) && !anchored ) + var/obj/item/weldingtool/WT = W + if (WT.remove_fuel(0,user)) + user.visible_message("[user] disassembles the windoor assembly.", "You start to disassemble the windoor assembly...") + playsound(loc, 'sound/items/welder2.ogg', 50, 1) + + if(do_after(user, 40*W.toolspeed, target = src)) + if(!src || !WT.isOn()) return + to_chat(user, "You disassemble the windoor assembly.") + var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5) + RG.add_fingerprint(user) + if(secure) + var/obj/item/stack/rods/R = new (get_turf(src), 4) + R.add_fingerprint(user) + qdel(src) + else + return + + //Wrenching an unsecure assembly anchors it in place. Step 4 complete + if(istype(W, /obj/item/wrench) && !anchored) + for(var/obj/machinery/door/window/WD in loc) + if(WD.dir == dir) + to_chat(user, "There is already a windoor in that location!") + return + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor...") + + if(do_after(user, 40*W.toolspeed, target = src)) + if(!src || anchored) + return + for(var/obj/machinery/door/window/WD in loc) + if(WD.dir == dir) + to_chat(user, "There is already a windoor in that location!") + return + to_chat(user, "You secure the windoor assembly.") anchored = TRUE - if(secure) - name = "secure anchored windoor assembly" - else - name = "anchored windoor assembly" - - //Unwrenching an unsecure assembly un-anchors it. Step 4 undone - else if(istype(W, /obj/item/wrench) && anchored) - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor...") - - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src || !anchored) - return - to_chat(user, "You unsecure the windoor assembly.") + if(secure) + name = "secure anchored windoor assembly" + else + name = "anchored windoor assembly" + + //Unwrenching an unsecure assembly un-anchors it. Step 4 undone + else if(istype(W, /obj/item/wrench) && anchored) + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor...") + + if(do_after(user, 40*W.toolspeed, target = src)) + if(!src || !anchored) + return + to_chat(user, "You unsecure the windoor assembly.") anchored = FALSE - if(secure) - name = "secure windoor assembly" - else - name = "windoor assembly" - - //Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete. - else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure) - var/obj/item/stack/sheet/plasteel/P = W - if(P.get_amount() < 2) - to_chat(user, "You need more plasteel to do this!") - return - to_chat(user, "You start to reinforce the windoor with plasteel...") - - if(do_after(user,40, target = src)) - if(!src || secure || P.get_amount() < 2) - return - - P.use(2) - to_chat(user, "You reinforce the windoor.") + if(secure) + name = "secure windoor assembly" + else + name = "windoor assembly" + + //Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete. + else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure) + var/obj/item/stack/sheet/plasteel/P = W + if(P.get_amount() < 2) + to_chat(user, "You need more plasteel to do this!") + return + to_chat(user, "You start to reinforce the windoor with plasteel...") + + if(do_after(user,40, target = src)) + if(!src || secure || P.get_amount() < 2) + return + + P.use(2) + to_chat(user, "You reinforce the windoor.") secure = TRUE - if(anchored) - name = "secure anchored windoor assembly" - else - name = "secure windoor assembly" - - //Adding cable to the assembly. Step 5 complete. - else if(istype(W, /obj/item/stack/cable_coil) && anchored) - user.visible_message("[user] wires the windoor assembly.", "You start to wire the windoor assembly...") - - if(do_after(user, 40, target = src)) - if(!src || !anchored || src.state != "01") - return - var/obj/item/stack/cable_coil/CC = W - if(!CC.use(1)) - to_chat(user, "You need more cable to do this!") - return - to_chat(user, "You wire the windoor.") - state = "02" - if(secure) - name = "secure wired windoor assembly" - else - name = "wired windoor assembly" - else - return ..() - - if("02") - - //Removing wire from the assembly. Step 5 undone. - if(istype(W, /obj/item/wirecutters)) - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly...") - - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src || state != "02") - return - - to_chat(user, "You cut the windoor wires.") - new/obj/item/stack/cable_coil(get_turf(user), 1) - state = "01" - if(secure) - name = "secure anchored windoor assembly" - else - name = "anchored windoor assembly" - - //Adding airlock electronics for access. Step 6 complete. - else if(istype(W, /obj/item/electronics/airlock)) - if(!user.drop_item()) - return - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly...") - W.loc = src - - if(do_after(user, 40, target = src)) - if(!src || electronics) - W.loc = src.loc - return - to_chat(user, "You install the airlock electronics.") - name = "near finished windoor assembly" - electronics = W - else - W.loc = loc - - //Screwdriver to remove airlock electronics. Step 6 undone. - else if(istype(W, /obj/item/screwdriver)) - if(!electronics) - return - - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly...") - - if(do_after(user, 40*W.toolspeed, target = src)) - if(!src || !electronics) - return - to_chat(user, "You remove the airlock electronics.") - name = "wired windoor assembly" - var/obj/item/electronics/airlock/ae - ae = electronics - electronics = null - ae.loc = loc - - else if(istype(W, /obj/item/pen)) - var/t = stripped_input(user, "Enter the name for the door.", name, created_name,MAX_NAME_LEN) - if(!t) - return - if(!in_range(src, usr) && loc != usr) - return - created_name = t - return - - - - //Crowbar to complete the assembly, Step 7 complete. - else if(istype(W, /obj/item/crowbar)) - if(!electronics) - to_chat(usr, "The assembly is missing electronics!") - return - usr << browse(null, "window=windoor_access") - playsound(loc, W.usesound, 100, 1) - user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame...") - - if(do_after(user, 40*W.toolspeed, target = src)) - - if(loc && electronics) - + if(anchored) + name = "secure anchored windoor assembly" + else + name = "secure windoor assembly" + + //Adding cable to the assembly. Step 5 complete. + else if(istype(W, /obj/item/stack/cable_coil) && anchored) + user.visible_message("[user] wires the windoor assembly.", "You start to wire the windoor assembly...") + + if(do_after(user, 40, target = src)) + if(!src || !anchored || src.state != "01") + return + var/obj/item/stack/cable_coil/CC = W + if(!CC.use(1)) + to_chat(user, "You need more cable to do this!") + return + to_chat(user, "You wire the windoor.") + state = "02" + if(secure) + name = "secure wired windoor assembly" + else + name = "wired windoor assembly" + else + return ..() + + if("02") + + //Removing wire from the assembly. Step 5 undone. + if(istype(W, /obj/item/wirecutters)) + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly...") + + if(do_after(user, 40*W.toolspeed, target = src)) + if(!src || state != "02") + return + + to_chat(user, "You cut the windoor wires.") + new/obj/item/stack/cable_coil(get_turf(user), 1) + state = "01" + if(secure) + name = "secure anchored windoor assembly" + else + name = "anchored windoor assembly" + + //Adding airlock electronics for access. Step 6 complete. + else if(istype(W, /obj/item/electronics/airlock)) + if(!user.drop_item()) + return + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly...") + W.loc = src + + if(do_after(user, 40, target = src)) + if(!src || electronics) + W.loc = src.loc + return + to_chat(user, "You install the airlock electronics.") + name = "near finished windoor assembly" + electronics = W + else + W.loc = loc + + //Screwdriver to remove airlock electronics. Step 6 undone. + else if(istype(W, /obj/item/screwdriver)) + if(!electronics) + return + + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly...") + + if(do_after(user, 40*W.toolspeed, target = src)) + if(!src || !electronics) + return + to_chat(user, "You remove the airlock electronics.") + name = "wired windoor assembly" + var/obj/item/electronics/airlock/ae + ae = electronics + electronics = null + ae.loc = loc + + else if(istype(W, /obj/item/pen)) + var/t = stripped_input(user, "Enter the name for the door.", name, created_name,MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && loc != usr) + return + created_name = t + return + + + + //Crowbar to complete the assembly, Step 7 complete. + else if(istype(W, /obj/item/crowbar)) + if(!electronics) + to_chat(usr, "The assembly is missing electronics!") + return + usr << browse(null, "window=windoor_access") + playsound(loc, W.usesound, 100, 1) + user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame...") + + if(do_after(user, 40*W.toolspeed, target = src)) + + if(loc && electronics) + density = TRUE //Shouldn't matter but just incase - to_chat(user, "You finish the windoor.") - - if(secure) - var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(loc) - if(facing == "l") - windoor.icon_state = "leftsecureopen" - windoor.base_state = "leftsecure" - else - windoor.icon_state = "rightsecureopen" - windoor.base_state = "rightsecure" - windoor.setDir(dir) + to_chat(user, "You finish the windoor.") + + if(secure) + var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(loc) + if(facing == "l") + windoor.icon_state = "leftsecureopen" + windoor.base_state = "leftsecure" + else + windoor.icon_state = "rightsecureopen" + windoor.base_state = "rightsecure" + windoor.setDir(dir) windoor.density = FALSE - - if(electronics.one_access) - windoor.req_one_access = electronics.accesses - else - windoor.req_access = electronics.accesses - windoor.electronics = electronics - electronics.loc = windoor - if(created_name) - windoor.name = created_name - qdel(src) - windoor.close() - - - else - var/obj/machinery/door/window/windoor = new /obj/machinery/door/window(loc) - if(facing == "l") - windoor.icon_state = "leftopen" - windoor.base_state = "left" - else - windoor.icon_state = "rightopen" - windoor.base_state = "right" - windoor.setDir(dir) + + if(electronics.one_access) + windoor.req_one_access = electronics.accesses + else + windoor.req_access = electronics.accesses + windoor.electronics = electronics + electronics.loc = windoor + if(created_name) + windoor.name = created_name + qdel(src) + windoor.close() + + + else + var/obj/machinery/door/window/windoor = new /obj/machinery/door/window(loc) + if(facing == "l") + windoor.icon_state = "leftopen" + windoor.base_state = "left" + else + windoor.icon_state = "rightopen" + windoor.base_state = "right" + windoor.setDir(dir) windoor.density = FALSE - - windoor.req_access = electronics.accesses - windoor.electronics = electronics - electronics.loc = windoor - if(created_name) - windoor.name = created_name - qdel(src) - windoor.close() - - - else - return ..() - - //Update to reflect changes(if applicable) - update_icon() - - -//Rotates the windoor assembly clockwise -/obj/structure/windoor_assembly/verb/revrotate() - set name = "Rotate Windoor Assembly" - set category = "Object" - set src in oview(1) - if(usr.stat || !usr.canmove || usr.restrained()) - return - if(anchored) - to_chat(usr, "[src] cannot be rotated while it is fastened to the floor!") - return FALSE - - var/target_dir = turn(dir, 270) - - if(!valid_window_location(loc, target_dir)) - to_chat(usr, "[src] cannot be rotated in that direction!") - return FALSE - - setDir(target_dir) - - ini_dir = dir - update_icon() - return TRUE - -/obj/structure/windoor_assembly/AltClick(mob/user) - ..() - if(user.incapacitated()) - to_chat(user, "You can't do that right now!") - return - if(!in_range(src, user)) - return - else - revrotate() - -//Flips the windoor assembly, determines whather the door opens to the left or the right -/obj/structure/windoor_assembly/verb/flip() - set name = "Flip Windoor Assembly" - set category = "Object" - set src in oview(1) - if(usr.stat || !usr.canmove || usr.restrained()) - return - - if(facing == "l") - to_chat(usr, "The windoor will now slide to the right.") - facing = "r" - else - facing = "l" - to_chat(usr, "The windoor will now slide to the left.") - - update_icon() - return + + windoor.req_access = electronics.accesses + windoor.electronics = electronics + electronics.loc = windoor + if(created_name) + windoor.name = created_name + qdel(src) + windoor.close() + + + else + return ..() + + //Update to reflect changes(if applicable) + update_icon() + + +//Rotates the windoor assembly clockwise +/obj/structure/windoor_assembly/verb/revrotate() + set name = "Rotate Windoor Assembly" + set category = "Object" + set src in oview(1) + if(usr.stat || !usr.canmove || usr.restrained()) + return + if(anchored) + to_chat(usr, "[src] cannot be rotated while it is fastened to the floor!") + return FALSE + + var/target_dir = turn(dir, 270) + + if(!valid_window_location(loc, target_dir)) + to_chat(usr, "[src] cannot be rotated in that direction!") + return FALSE + + setDir(target_dir) + + ini_dir = dir + update_icon() + return TRUE + +/obj/structure/windoor_assembly/AltClick(mob/user) + ..() + if(user.incapacitated()) + to_chat(user, "You can't do that right now!") + return + if(!in_range(src, user)) + return + else + revrotate() + +//Flips the windoor assembly, determines whather the door opens to the left or the right +/obj/structure/windoor_assembly/verb/flip() + set name = "Flip Windoor Assembly" + set category = "Object" + set src in oview(1) + if(usr.stat || !usr.canmove || usr.restrained()) + return + + if(facing == "l") + to_chat(usr, "The windoor will now slide to the right.") + facing = "r" + else + facing = "l" + to_chat(usr, "The windoor will now slide to the left.") + + update_icon() + return From 353739071f97c06433ff217de6e65cf6b322d781 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 1 Oct 2017 15:46:53 -0500 Subject: [PATCH 026/141] Update lib_items.dm --- code/modules/library/lib_items.dm | 323 ------------------------------ 1 file changed, 323 deletions(-) diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index c55aa8d43f..ae5f5c2fbb 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -1,325 +1,3 @@ -<<<<<<< HEAD -/* Library Items - * - * Contains: - * Bookcase - * Book - * Barcode Scanner - */ - -/* - * Bookcase - */ - -/obj/structure/bookcase - name = "bookcase" - icon = 'icons/obj/library.dmi' - icon_state = "bookempty" - anchored = FALSE - density = TRUE - opacity = 0 - resistance_flags = FLAMMABLE - max_integrity = 200 - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0) - var/state = 0 - var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/book) //Things allowed in the bookcase - - -/obj/structure/bookcase/Initialize(mapload) - . = ..() - if(!mapload) - return - state = 2 - icon_state = "book-0" - anchored = TRUE - for(var/obj/item/I in loc) - if(istype(I, /obj/item/book)) - I.loc = src - update_icon() - - -/obj/structure/bookcase/attackby(obj/item/I, mob/user, params) - switch(state) - if(0) - if(istype(I, /obj/item/wrench)) - playsound(loc, I.usesound, 100, 1) - if(do_after(user, 20*I.toolspeed, target = src)) - to_chat(user, "You wrench the frame into place.") - anchored = TRUE - state = 1 - if(istype(I, /obj/item/crowbar)) - playsound(loc, I.usesound, 100, 1) - if(do_after(user, 20*I.toolspeed, target = src)) - to_chat(user, "You pry the frame apart.") - deconstruct(TRUE) - - if(1) - if(istype(I, /obj/item/stack/sheet/mineral/wood)) - var/obj/item/stack/sheet/mineral/wood/W = I - if(W.get_amount() >= 2) - W.use(2) - to_chat(user, "You add a shelf.") - state = 2 - icon_state = "book-0" - if(istype(I, /obj/item/wrench)) - playsound(loc, I.usesound, 100, 1) - to_chat(user, "You unwrench the frame.") - anchored = FALSE - state = 0 - - if(2) - if(is_type_in_list(I, allowed_books)) - if(!user.drop_item()) - return - I.loc = src - update_icon() - else if(istype(I, /obj/item/storage/bag/books)) - var/obj/item/storage/bag/books/B = I - for(var/obj/item/T in B.contents) - if(istype(T, /obj/item/book) || istype(T, /obj/item/spellbook)) - B.remove_from_storage(T, src) - to_chat(user, "You empty \the [I] into \the [src].") - update_icon() - else if(istype(I, /obj/item/pen)) - var/newname = stripped_input(user, "What would you like to title this bookshelf?") - if(!newname) - return - else - name = ("bookcase ([sanitize(newname)])") - else if(istype(I, /obj/item/crowbar)) - if(contents.len) - to_chat(user, "You need to remove the books first!") - else - playsound(loc, I.usesound, 100, 1) - to_chat(user, "You pry the shelf out.") - new /obj/item/stack/sheet/mineral/wood(loc, 2) - state = 1 - icon_state = "bookempty" - else - return ..() - - -/obj/structure/bookcase/attack_hand(mob/user) - if(contents.len) - var/obj/item/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents - if(choice) - if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) - return - if(ishuman(user)) - if(!user.get_active_held_item()) - user.put_in_hands(choice) - else - choice.loc = get_turf(src) - update_icon() - - -/obj/structure/bookcase/deconstruct(disassembled = TRUE) - new /obj/item/stack/sheet/mineral/wood(loc, 4) - for(var/obj/item/book/B in contents) - B.forceMove(get_turf(src)) - qdel(src) - - -/obj/structure/bookcase/update_icon() - if(contents.len < 5) - icon_state = "book-[contents.len]" - else - icon_state = "book-5" - - -/obj/structure/bookcase/manuals/medical - name = "medical manuals bookcase" - -/obj/structure/bookcase/manuals/medical/New() - ..() - new /obj/item/book/manual/medical_cloning(src) - update_icon() - - -/obj/structure/bookcase/manuals/engineering - name = "engineering manuals bookcase" - -/obj/structure/bookcase/manuals/engineering/New() - ..() - new /obj/item/book/manual/wiki/engineering_construction(src) - new /obj/item/book/manual/engineering_particle_accelerator(src) - new /obj/item/book/manual/wiki/engineering_hacking(src) - new /obj/item/book/manual/wiki/engineering_guide(src) - new /obj/item/book/manual/engineering_singularity_safety(src) - new /obj/item/book/manual/robotics_cyborgs(src) - update_icon() - - -/obj/structure/bookcase/manuals/research_and_development - name = "\improper R&D manuals bookcase" - -/obj/structure/bookcase/manuals/research_and_development/New() - ..() - new /obj/item/book/manual/research_and_development(src) - update_icon() - - -/* - * Book - */ -/obj/item/book - name = "book" - icon = 'icons/obj/library.dmi' - icon_state ="book" - throw_speed = 1 - throw_range = 5 - w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) - attack_verb = list("bashed", "whacked", "educated") - resistance_flags = FLAMMABLE - var/dat //Actual page content - var/due_date = 0 //Game time in 1/10th seconds - var/author //Who wrote the thing, can be changed by pen or PC. It is not automatically assigned - var/unique = 0 //0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified - var/title //The real name of the book. - var/window_size = null // Specific window size for the book, i.e: "1920x1080", Size x Width - -/obj/item/book/attack_self(mob/user) - if(is_blind(user)) - to_chat(user, "As you are trying to read, you suddenly feel very stupid!") - return - if(ismonkey(user)) - to_chat(user, "You skim through the book but can't comprehend any of it.") - return - if(dat) - user << browse("Penned by [author].
" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]") - user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.") - onclose(user, "book") - else - to_chat(user, "This book is completely blank!") - - -/obj/item/book/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/pen)) - if(is_blind(user)) - to_chat(user, " As you are trying to write on the book, you suddenly feel very stupid!") - return - if(unique) - to_chat(user, "These pages don't seem to take the ink well! Looks like you can't modify it.") - return - var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel") - switch(choice) - if("Title") - var/newtitle = reject_bad_text(stripped_input(usr, "Write a new title:")) - if (length(newtitle) > 20) - to_chat(usr, "That title won't fit on the cover!") - return - if(!newtitle) - to_chat(usr, "That title is invalid.") - return - else - name = newtitle - title = newtitle - if("Contents") - var/content = stripped_input(usr, "Write your book's contents (HTML NOT allowed):","","",8192) - if(!content) - to_chat(usr, "The content is invalid.") - return - else - dat += content - if("Author") - var/newauthor = stripped_input(usr, "Write the author's name:") - if(!newauthor) - to_chat(usr, "The name is invalid.") - return - else - author = newauthor - else - return - - else if(istype(I, /obj/item/barcodescanner)) - var/obj/item/barcodescanner/scanner = I - if(!scanner.computer) - to_chat(user, "[I]'s screen flashes: 'No associated computer found!'") - else - switch(scanner.mode) - if(0) - scanner.book = src - to_chat(user, "[I]'s screen flashes: 'Book stored in buffer.'") - if(1) - scanner.book = src - scanner.computer.buffer_book = name - to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'") - if(2) - scanner.book = src - for(var/datum/borrowbook/b in scanner.computer.checkouts) - if(b.bookname == name) - scanner.computer.checkouts.Remove(b) - to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Book has been checked in.'") - return - to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'") - if(3) - scanner.book = src - for(var/obj/item/book in scanner.computer.inventory) - if(book == src) - to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'") - return - scanner.computer.inventory.Add(src) - to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'") - - else if(istype(I, /obj/item/kitchen/knife) || istype(I, /obj/item/wirecutters)) - to_chat(user, "You begin to carve out [title]...") - if(do_after(user, 30, target = src)) - to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.") - var/obj/item/storage/book/B = new - B.name = src.name - B.title = src.title - B.icon_state = src.icon_state - if(user.is_holding(src)) - qdel(src) - user.put_in_hands(B) - return - else - B.loc = src.loc - qdel(src) - return - return - else - ..() - - -/* - * Barcode Scanner - */ -/obj/item/barcodescanner - name = "barcode scanner" - icon = 'icons/obj/library.dmi' - icon_state ="scanner" - throw_speed = 3 - throw_range = 5 - w_class = WEIGHT_CLASS_TINY - var/obj/machinery/computer/libraryconsole/bookmanagement/computer //Associated computer - Modes 1 to 3 use this - var/obj/item/book/book //Currently scanned book - var/mode = 0 //0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory - -/obj/item/barcodescanner/attack_self(mob/user) - mode += 1 - if(mode > 3) - mode = 0 - to_chat(user, "[src] Status Display:") - var/modedesc - switch(mode) - if(0) - modedesc = "Scan book to local buffer." - if(1) - modedesc = "Scan book to local buffer and set associated computer buffer to match." - if(2) - modedesc = "Scan book to local buffer, attempt to check in scanned book." - if(3) - modedesc = "Scan book to local buffer, attempt to add book to general inventory." - else - modedesc = "ERROR" - to_chat(user, " - Mode [mode] : [modedesc]") - if(computer) - to_chat(user, "Computer has been associated with this unit.") - else - to_chat(user, "No associated computer found. Only local scans will function properly.") - to_chat(user, "\n") -======= /* Library Items * * Contains: @@ -643,4 +321,3 @@ else to_chat(user, "No associated computer found. Only local scans will function properly.") to_chat(user, "\n") ->>>>>>> 3e4d747... Adds desc to things lacking them. (#31086) From e2dd424fb0b2dc067600c2aeb1805d715f703bb2 Mon Sep 17 00:00:00 2001 From: oranges Date: Mon, 2 Oct 2017 09:35:15 +1300 Subject: [PATCH 027/141] Revert "Prompt for observer confirmation now happens when you click it initially" --- .../modules/mob/dead/new_player/new_player.dm | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 01a5b166d3..aca1d9b63f 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -115,15 +115,6 @@ //no longer is required if(SSticker.current_state <= GAME_STATE_PREGAME) ready = tready - - var/this_is_like_playing_right = alert(src,"Are you sure you wish to observe? You will not be able to play this round!","Player Setup","Yes","No") - - if(QDELETED(src) || !src.client || this_is_like_playing_right != "Yes") - ready = PLAYER_NOT_READY - src << browse(null, "window=playersetup") //closes the player setup window - new_player_panel() - return FALSE - //if it's post initialisation and they're trying to observe we do the needful if(!SSticker.current_state < GAME_STATE_PREGAME && tready == PLAYER_READY_TO_OBSERVE) ready = tready @@ -268,7 +259,15 @@ if(QDELETED(src) || !src.client) ready = PLAYER_NOT_READY return FALSE - + + var/this_is_like_playing_right = alert(src,"Are you sure you wish to observe? You will not be able to play this round!","Player Setup","Yes","No") + + if(QDELETED(src) || !src.client || this_is_like_playing_right != "Yes") + ready = PLAYER_NOT_READY + src << browse(null, "window=playersetup") //closes the player setup window + new_player_panel() + return FALSE + var/mob/dead/observer/observer = new() spawning = TRUE From d9c77f628d45d784c7b5657b9f4c4455b751240f Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Sat, 30 Sep 2017 19:21:13 -0400 Subject: [PATCH 029/141] Fixes gen scanner timer --- code/game/machinery/computer/dna_console.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 5f2324f236..cfc3c13cfc 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -168,7 +168,7 @@ if("working") temp_html += status temp_html += "

System Busy

" - temp_html += "Working ... Please wait ([DisplayTimeText(radduration)])" + temp_html += "Working ... Please wait ([DisplayTimeText(radduration*10)])" if("buffer") temp_html += status temp_html += buttons From d3ae434b563ef9693c9f3bfd13ff4c910e993162 Mon Sep 17 00:00:00 2001 From: Daniel0Mclovin <31661882+Daniel0Mclovin@users.noreply.github.com> Date: Sun, 1 Oct 2017 17:20:44 -0500 Subject: [PATCH 031/141] Changed a few stats Darkness now does oxy damage and slight toxin, added a bit more heat mod, no longer heals toxin damage, oxygen loss healing nerfed. Can eat in the dark to try to combat starvation, added slight toxin damage to make it harder to stay in the dark with a shit ton of food. --- .../mob/living/carbon/human/species_types/podpeople.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index bc5a875d48..5cf48bf0a5 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -8,7 +8,7 @@ attack_sound = 'sound/weapons/slice.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' burnmod = 1.25 - heatmod = 1.5 + heatmod = 1.55 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/plant disliked_food = NONE liked_food = NONE @@ -38,11 +38,11 @@ H.nutrition = NUTRITION_LEVEL_FULL if(light_amount > 0.2) //if there's enough light, heal H.heal_overall_damage(1,1) - H.adjustToxLoss(-1) - H.adjustOxyLoss(-1) + H.adjustOxyLoss(-0.5) if(H.nutrition < NUTRITION_LEVEL_STARVING + 55) - H.take_overall_damage(2,5) + H.adjustOxyLoss(5,5) //can eat to negate this unfortunately + H.adjustToxLoss(3,0) /datum/species/pod/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) From 2d835e1d732d7dfd015a087d475132ac18b7c43e Mon Sep 17 00:00:00 2001 From: Daniel0Mclovin <31661882+Daniel0Mclovin@users.noreply.github.com> Date: Sun, 1 Oct 2017 17:25:20 -0500 Subject: [PATCH 032/141] Nerfed overall healing dialed down to 0.7 --- code/modules/mob/living/carbon/human/species_types/podpeople.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 5cf48bf0a5..36cb95f755 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -37,7 +37,7 @@ if(H.nutrition > NUTRITION_LEVEL_FULL) H.nutrition = NUTRITION_LEVEL_FULL if(light_amount > 0.2) //if there's enough light, heal - H.heal_overall_damage(1,1) + H.heal_overall_damage(0,7) H.adjustOxyLoss(-0.5) if(H.nutrition < NUTRITION_LEVEL_STARVING + 55) From d4321ac0b56cdc33e264aee14fe26d326938e8b5 Mon Sep 17 00:00:00 2001 From: Daniel0Mclovin <31661882+Daniel0Mclovin@users.noreply.github.com> Date: Sun, 1 Oct 2017 17:26:45 -0500 Subject: [PATCH 033/141] Accidentally put a comma --- code/modules/mob/living/carbon/human/species_types/podpeople.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 36cb95f755..4c86a0f74f 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -37,7 +37,7 @@ if(H.nutrition > NUTRITION_LEVEL_FULL) H.nutrition = NUTRITION_LEVEL_FULL if(light_amount > 0.2) //if there's enough light, heal - H.heal_overall_damage(0,7) + H.heal_overall_damage(0.7) H.adjustOxyLoss(-0.5) if(H.nutrition < NUTRITION_LEVEL_STARVING + 55) From 02987715b09b8b6bbe17c9ccfb6c1dd684dc51bc Mon Sep 17 00:00:00 2001 From: Joan Lung <3886584+ChangelingRain@users.noreply.github.com> Date: Sat, 30 Sep 2017 22:38:36 -0400 Subject: [PATCH 034/141] Fixes Vanguard never stunning for more than 2 seconds --- code/datums/status_effects/buffs.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 69749475cd..25b04b4312 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -71,7 +71,7 @@ /datum/status_effect/vanguard_shield/on_apply() owner.log_message("gained Vanguard stun immunity", INDIVIDUAL_ATTACK_LOG) - owner.add_stun_absorption("vanguard", 200, 1, "'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!", " radiating with a soft yellow light!") + owner.add_stun_absorption("vanguard", INFINITY, 1, "'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!", " radiating with a soft yellow light!") owner.visible_message("[owner] begins to faintly glow!", "You will absorb all stuns for the next twenty seconds.") owner.SetStun(0, FALSE) owner.SetKnockdown(0) @@ -87,7 +87,8 @@ var/vanguard = owner.stun_absorption["vanguard"] var/stuns_blocked = 0 if(vanguard) - stuns_blocked = round(min(vanguard["stuns_absorbed"] * 0.25, 20)) + stuns_blocked = Floor(min(vanguard["stuns_absorbed"] * 0.25, 400)) + vanguard["end_time"] = 0 //so it doesn't absorb the stuns we're about to apply if(owner.stat != DEAD) var/message_to_owner = "You feel your Vanguard quietly fade..." var/otheractiveabsorptions = FALSE @@ -95,7 +96,6 @@ if(owner.stun_absorption[i]["end_time"] > world.time && owner.stun_absorption[i]["priority"] > vanguard["priority"]) otheractiveabsorptions = TRUE if(!GLOB.ratvar_awakens && stuns_blocked && !otheractiveabsorptions) - vanguard["end_time"] = 0 //so it doesn't absorb the stuns we're about to apply owner.Knockdown(stuns_blocked) message_to_owner = "The weight of the Vanguard's protection crashes down upon you!" if(stuns_blocked >= 300) From 7c88f10db09403f4976ee70cf2326b8907de8655 Mon Sep 17 00:00:00 2001 From: JJRcop Date: Sat, 30 Sep 2017 23:18:54 -0400 Subject: [PATCH 036/141] played_url now includes ckey --- code/modules/admin/verbs/playsound.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index d63d0d712f..3b982fe13e 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -93,7 +93,11 @@ pitch = pick(0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 1.1, 1.2, 1.4, 1.6, 2.0, 2.5) to_chat(src, "You feel the Honkmother messing with your song...") +<<<<<<< HEAD SSblackbox.add_details("played_url", web_sound_input) +======= + SSblackbox.add_details("played_url", "[web_sound_input]|[ckey]") +>>>>>>> a6460ce... played_url key_name() to ckey log_admin("[key_name(src)] played web sound: [web_sound_input]") message_admins("[key_name(src)] played web sound: [web_sound_input]") else From b9f71e9e15c23648e79c0f1ef16ee76b8a29786b Mon Sep 17 00:00:00 2001 From: oranges Date: Mon, 2 Oct 2017 15:12:13 +1300 Subject: [PATCH 037/141] Merge pull request #31127 from Cyberboss/notify_command Chat command to notify admins when the round ends --- code/controllers/subsystem/ticker.dm | 2 ++ code/modules/admin/chat_commands.dm | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index e41b848134..060fe93219 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -335,6 +335,8 @@ SUBSYSTEM_DEF(ticker) var/num_shuttle_escapees = 0 to_chat(world, "


The round has ended.") + if(LAZYLEN(GLOB.round_end_notifiees)) + send2irc("Notice", "[GLOB.round_end_notifiees.Join(", ")] the round has ended.") /* var/nocredits = config.no_credits_round_end for(var/client/C in GLOB.clients) diff --git a/code/modules/admin/chat_commands.dm b/code/modules/admin/chat_commands.dm index 1553c31204..f24e03aabc 100644 --- a/code/modules/admin/chat_commands.dm +++ b/code/modules/admin/chat_commands.dm @@ -60,3 +60,17 @@ /datum/server_tools_command/adminwho/Run(sender, params) return ircadminwho() + +GLOBAL_LIST(round_end_notifiees) + +/datum/server_tools_command/notify + name = "notify" + help_text = "Pings the invoker when the round ends" + admin_only = TRUE + +/datum/server_tools_command/notify/Run(sender, params) + if(!SSticker.IsRoundInProgress() && SSticker.HasRoundStarted()) + return "[sender], the round has already ended!" + LAZYINITLIST(GLOB.round_end_notifiees) + GLOB.round_end_notifiees[sender] = TRUE + return "I will notify [sender] when the round ends." \ No newline at end of file From 85639dda35e97f874882870e3e116ed153dc3c8a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Oct 2017 22:37:28 -0500 Subject: [PATCH 039/141] Automatic changelog generation for PR #3056 [ci skip] --- html/changelogs/AutoChangeLog-pr-3056.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3056.yml diff --git a/html/changelogs/AutoChangeLog-pr-3056.yml b/html/changelogs/AutoChangeLog-pr-3056.yml new file mode 100644 index 0000000000..7963eca536 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3056.yml @@ -0,0 +1,4 @@ +author: "MrDoomBringer" +delete-after: True +changes: + - rscadd: "Nanotrasen, as part of their new Employee Retention program, has encouraged more station point-makery by adding the \"Cargo Tech of the Shift\"! The award is located in a lockbox in the Quartermaster's locker." From 021b0a2bee408ef185034ef2244ce2a0ca0f8ace Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 1 Oct 2017 22:38:55 -0500 Subject: [PATCH 040/141] Update growninedible.dm --- code/modules/hydroponics/growninedible.dm | 67 ----------------------- 1 file changed, 67 deletions(-) diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 01be327caa..a77808f006 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -1,69 +1,3 @@ -<<<<<<< HEAD -// ********************** -// Other harvested materials from plants (that are not food) -// ********************** - -/obj/item/grown // Grown weapons - name = "grown_weapon" - icon = 'icons/obj/hydroponics/harvest.dmi' - resistance_flags = FLAMMABLE - var/obj/item/seeds/seed = null // type path, gets converted to item on New(). It's safe to assume it's always a seed item. - -/obj/item/grown/New(newloc, var/obj/item/seeds/new_seed = null) - ..() - create_reagents(50) - - if(new_seed) - seed = new_seed.Copy() - else if(ispath(seed)) - // This is for adminspawn or map-placed growns. They get the default stats of their seed type. - seed = new seed() - seed.adjust_potency(50-seed.potency) - - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) - - if(seed) - for(var/datum/plant_gene/trait/T in seed.genes) - T.on_new(src, newloc) - - if(istype(src, seed.product)) // no adding reagents if it is just a trash item - seed.prepare_result(src) - transform *= TransformUsingVariable(seed.potency, 100, 0.5) - add_juice() - - -/obj/item/grown/attackby(obj/item/O, mob/user, params) - ..() - if (istype(O, /obj/item/device/plant_analyzer)) - var/msg = "*---------*\n This is \a [src]\n" - if(seed) - msg += seed.get_analyzer_text() - msg += "" - to_chat(usr, msg) - return - -/obj/item/grown/proc/add_juice() - if(reagents) - return 1 - return 0 - - -/obj/item/grown/Crossed(atom/movable/AM) - if(seed) - for(var/datum/plant_gene/trait/T in seed.genes) - T.on_cross(src, AM) - ..() - -/obj/item/grown/throw_impact(atom/hit_atom) - if(!..()) //was it caught by a mob? - if(seed) - for(var/datum/plant_gene/trait/T in seed.genes) - T.on_throw_impact(src, hit_atom) - -/obj/item/grown/microwave_act(obj/machine/microwave/M) - return -======= // ********************** // Other harvested materials from plants (that are not food) // ********************** @@ -128,4 +62,3 @@ /obj/item/grown/microwave_act(obj/machine/microwave/M) return ->>>>>>> 7477a55... Merge pull request #31201 from AnturK/grownspam From 8101b1e67ffec1dde4f2812efc3061ed65456ec6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Oct 2017 22:39:42 -0500 Subject: [PATCH 041/141] Automatic changelog generation for PR #3063 [ci skip] --- html/changelogs/AutoChangeLog-pr-3063.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3063.yml diff --git a/html/changelogs/AutoChangeLog-pr-3063.yml b/html/changelogs/AutoChangeLog-pr-3063.yml new file mode 100644 index 0000000000..a8c291e06f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3063.yml @@ -0,0 +1,5 @@ +author: "XDTM" +delete-after: True +changes: + - bugfix: "Fixed a bug where Viral Aggressive Metabolism caused viruses to be cured instantly." + - bugfix: "Fixed a bug where viruses' symptoms would all instantly activate on infection." From 183974214a30b8630db89f051a5bc320872d3d0d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 1 Oct 2017 22:40:51 -0500 Subject: [PATCH 042/141] Automatic changelog generation for PR #3071 [ci skip] --- html/changelogs/AutoChangeLog-pr-3071.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3071.yml diff --git a/html/changelogs/AutoChangeLog-pr-3071.yml b/html/changelogs/AutoChangeLog-pr-3071.yml new file mode 100644 index 0000000000..924aea5179 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3071.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - bugfix: "Fixes Vanguard never stunning for more than 2 seconds." From 684d888366448817471cc9512a3d6e0f8f151950 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 1 Oct 2017 22:51:34 -0500 Subject: [PATCH 043/141] Update playsound.dm --- code/modules/admin/verbs/playsound.dm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 3b982fe13e..0cc1f72256 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -92,12 +92,7 @@ if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) pitch = pick(0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 1.1, 1.2, 1.4, 1.6, 2.0, 2.5) to_chat(src, "You feel the Honkmother messing with your song...") - -<<<<<<< HEAD - SSblackbox.add_details("played_url", web_sound_input) -======= SSblackbox.add_details("played_url", "[web_sound_input]|[ckey]") ->>>>>>> a6460ce... played_url key_name() to ckey log_admin("[key_name(src)] played web sound: [web_sound_input]") message_admins("[key_name(src)] played web sound: [web_sound_input]") else From 06b30d3e735415ee4e1261977ab300d589ef995a Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 1 Oct 2017 22:52:58 -0500 Subject: [PATCH 044/141] [MIRROR] Fixes krav maga working while stunned closes #3073 --- code/_onclick/click.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 2bc6e144dd..aa43592c64 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -327,7 +327,7 @@ ML.pulled(src) /mob/living/carbon/human/CtrlClick(mob/user) - if(ishuman(user) && Adjacent(user)) + if(ishuman(user) && Adjacent(user) && !user.incapacitated()) if(world.time < user.next_move) return FALSE var/mob/living/carbon/human/H = user From 3e26e09db8b496fa1425867274db819c02e79496 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Mon, 2 Oct 2017 01:03:40 -0500 Subject: [PATCH 045/141] ismecha define --- code/__DEFINES/is_helpers.dm | 2 + code/_onclick/click.dm | 2 +- code/_onclick/hud/human.dm | 2 +- code/_onclick/hud/screen_objects.dm | 416 ++++++++++++++++++ .../datums/weather/weather_types/ash_storm.dm | 2 +- .../clock_structures/ocular_warden.dm | 4 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/machinery/mass_driver.dm | 2 +- .../machinery/porta_turret/portable_turret.dm | 2 +- code/game/mecha/mecha_control_console.dm | 134 ++++++ code/game/objects/effects/portals.dm | 159 +++++++ code/game/objects/items/storage/storage.dm | 2 +- code/game/objects/structures/mineral_doors.dm | 36 ++ code/game/objects/structures/plasticflaps.dm | 2 +- code/game/turfs/simulated/minerals.dm | 6 - code/modules/clothing/clothing.dm | 2 +- code/modules/events/wormholes.dm | 2 +- .../mining/equipment/wormhole_jaunter.dm | 2 +- .../mining/lavaland/necropolis_chests.dm | 2 +- code/modules/mob/living/carbon/human/death.dm | 2 +- .../living/simple_animal/hostile/hostile.dm | 4 +- .../simple_animal/hostile/mecha_pilot.dm | 4 +- .../hostile/retaliate/retaliate.dm | 50 +++ .../mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/mob/mob.dm | 2 +- code/modules/power/power.dm | 2 +- .../power/singularity/containment_field.dm | 6 +- code/modules/projectiles/projectile.dm | 2 +- .../modules/projectiles/projectile/special.dm | 2 +- 30 files changed, 825 insertions(+), 34 deletions(-) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index b3016e3926..4376ba9c03 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -140,6 +140,8 @@ #define isstructure(A) (istype(A, /obj/structure)) +#define ismecha(A) (istype(A, /obj/mecha)) + #define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable #define isorgan(A) (istype(A, /obj/item/organ)) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 2bc6e144dd..0536d60a33 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -96,7 +96,7 @@ if(!modifiers["catcher"] && A.IsObscured()) return - if(istype(loc, /obj/mecha)) + if(ismecha(loc)) var/obj/mecha/M = loc return M.click_action(A,src,params) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 07c17b891f..1d36f7d31e 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -28,7 +28,7 @@ icon_state = "act_equip" /obj/screen/human/equip/Click() - if(istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech + if(ismecha(usr.loc)) // stops inventory actions in a mech return 1 var/mob/living/carbon/human/H = usr H.quick_equip() diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 2d94f41ba9..7bf73bb297 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -34,6 +34,7 @@ icon = null icon_state = null mouse_opacity = MOUSE_OPACITY_TRANSPARENT +<<<<<<< HEAD screen_loc = "CENTER-7,CENTER-7" maptext_height = 480 maptext_width = 480 @@ -258,6 +259,232 @@ var/obj/item/clothing/mask/M = C.wear_mask if(M.mask_adjusted) // if mask on face but pushed down M.adjustmask(C) // adjust it back +======= + screen_loc = "CENTER-7,CENTER-7" + maptext_height = 480 + maptext_width = 480 + +/obj/screen/swap_hand + layer = HUD_LAYER + plane = HUD_PLANE + name = "swap hand" + +/obj/screen/swap_hand/Click() + // At this point in client Click() code we have passed the 1/10 sec check and little else + // We don't even know if it's a middle click + if(world.time <= usr.next_move) + return 1 + + if(usr.incapacitated()) + return 1 + + if(ismob(usr)) + var/mob/M = usr + M.swap_hand() + return 1 + +/obj/screen/craft + name = "crafting menu" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "craft" + screen_loc = ui_crafting + +/obj/screen/craft/Click() + var/mob/living/M = usr + if(isobserver(usr)) + return + M.OpenCraftingMenu() + +/obj/screen/area_creator + name = "create new area" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "area_edit" + screen_loc = ui_building + +/obj/screen/area_creator/Click() + if(usr.incapacitated()) + return 1 + var/area/A = get_area(usr) + if(!A.outdoors) + to_chat(usr, "There is already a defined structure here.") + return 1 + create_area(usr) + +/obj/screen/language_menu + name = "language menu" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "talk_wheel" + screen_loc = ui_language_menu + +/obj/screen/language_menu/Click() + var/mob/M = usr + var/datum/language_holder/H = M.get_language_holder() + H.open_language_menu(usr) + +/obj/screen/inventory + var/slot_id // The indentifier for the slot. It has nothing to do with ID cards. + var/icon_empty // Icon when empty. For now used only by humans. + var/icon_full // Icon when contains an item. For now used only by humans. + layer = HUD_LAYER + plane = HUD_PLANE + +/obj/screen/inventory/Click(location, control, params) + // At this point in client Click() code we have passed the 1/10 sec check and little else + // We don't even know if it's a middle click + if(world.time <= usr.next_move) + return 1 + + if(usr.incapacitated()) + return 1 + if(ismecha(usr.loc)) // stops inventory actions in a mech + return 1 + + if(hud && hud.mymob && slot_id) + var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id) + if(inv_item) + return inv_item.Click(location, control, params) + + if(usr.attack_ui(slot_id)) + usr.update_inv_hands() + return 1 + +/obj/screen/inventory/update_icon() + if(!icon_empty) + icon_empty = icon_state + + if(hud && hud.mymob && slot_id && icon_full) + if(hud.mymob.get_item_by_slot(slot_id)) + icon_state = icon_full + else + icon_state = icon_empty + +/obj/screen/inventory/hand + var/mutable_appearance/handcuff_overlay + var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked") + var/held_index = 0 + +/obj/screen/inventory/hand/update_icon() + ..() + + if(!handcuff_overlay) + var/state = (!(held_index % 2)) ? "markus" : "gabrielle" + handcuff_overlay = mutable_appearance('icons/mob/screen_gen.dmi', state) + + cut_overlays() + + if(hud && hud.mymob) + if(iscarbon(hud.mymob)) + var/mob/living/carbon/C = hud.mymob + if(C.handcuffed) + add_overlay(handcuff_overlay) + + if(held_index) + if(!C.has_hand_for_held_index(held_index)) + add_overlay(blocked_overlay) + + if(held_index == hud.mymob.active_hand_index) + add_overlay("hand_active") + + +/obj/screen/inventory/hand/Click(location, control, params) + // At this point in client Click() code we have passed the 1/10 sec check and little else + // We don't even know if it's a middle click + if(world.time <= usr.next_move) + return 1 + if(usr.incapacitated() || isobserver(usr)) + return 1 + if (ismecha(usr.loc)) // stops inventory actions in a mech + return 1 + + if(hud.mymob.active_hand_index == held_index) + var/obj/item/I = hud.mymob.get_active_held_item() + if(I) + I.Click(location, control, params) + else + hud.mymob.swap_hand(held_index) + return 1 + +/obj/screen/close + name = "close" + +/obj/screen/close/Click() + if(istype(master, /obj/item/storage)) + var/obj/item/storage/S = master + S.close(usr) + return 1 + + +/obj/screen/drop + name = "drop" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "act_drop" + layer = HUD_LAYER + plane = HUD_PLANE + +/obj/screen/drop/Click() + usr.drop_item_v() + +/obj/screen/act_intent + name = "intent" + icon_state = "help" + screen_loc = ui_acti + +/obj/screen/act_intent/Click(location, control, params) + usr.a_intent_change(INTENT_HOTKEY_RIGHT) + +/obj/screen/act_intent/segmented/Click(location, control, params) + if(usr.client.prefs.toggles & INTENT_STYLE) + var/_x = text2num(params2list(params)["icon-x"]) + var/_y = text2num(params2list(params)["icon-y"]) + + if(_x<=16 && _y<=16) + usr.a_intent_change(INTENT_HARM) + + else if(_x<=16 && _y>=17) + usr.a_intent_change(INTENT_HELP) + + else if(_x>=17 && _y<=16) + usr.a_intent_change(INTENT_GRAB) + + else if(_x>=17 && _y>=17) + usr.a_intent_change(INTENT_DISARM) + else + return ..() + +/obj/screen/act_intent/alien + icon = 'icons/mob/screen_alien.dmi' + screen_loc = ui_movi + +/obj/screen/act_intent/robot + icon = 'icons/mob/screen_cyborg.dmi' + screen_loc = ui_borg_intents + +/obj/screen/internals + name = "toggle internals" + icon_state = "internal0" + screen_loc = ui_internal + +/obj/screen/internals/Click() + if(!iscarbon(usr)) + return + var/mob/living/carbon/C = usr + if(C.incapacitated()) + return + + if(C.internal) + C.internal = null + to_chat(C, "You are no longer running on internals.") + icon_state = "internal0" + else + if(!C.getorganslot("breathing_tube")) + if(!istype(C.wear_mask, /obj/item/clothing/mask)) + to_chat(C, "You are not wearing an internals mask!") + return 1 + else + var/obj/item/clothing/mask/M = C.wear_mask + if(M.mask_adjusted) // if mask on face but pushed down + M.adjustmask(C) // adjust it back +>>>>>>> cc30923... ismecha define (#31192) if( !(M.flags_1 & MASKINTERNALS_1) ) to_chat(C, "You are not wearing an internals mask!") return @@ -282,6 +509,7 @@ H.internal = H.r_store //Separate so CO2 jetpacks are a little less cumbersome. +<<<<<<< HEAD if(!C.internal && istype(C.back, /obj/item/tank)) to_chat(C, "You are now running on internals from the [C.back] on your back.") C.internal = C.back @@ -468,6 +696,194 @@ name = "dmg" blend_mode = BLEND_MULTIPLY screen_loc = "CENTER-7,CENTER-7" +======= + if(!C.internal && istype(C.back, /obj/item/tank)) + to_chat(C, "You are now running on internals from the [C.back] on your back.") + C.internal = C.back + + if(C.internal) + icon_state = "internal1" + else + to_chat(C, "You don't have an oxygen tank!") + return + C.update_action_buttons_icon() + +/obj/screen/mov_intent + name = "run/walk toggle" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "running" + +/obj/screen/mov_intent/Click() + toggle(usr) + +/obj/screen/mov_intent/proc/toggle(mob/user) + if(isobserver(user)) + return + switch(user.m_intent) + if("run") + user.m_intent = MOVE_INTENT_WALK + icon_state = "walking" + if("walk") + user.m_intent = MOVE_INTENT_RUN + icon_state = "running" + user.update_icons() + +/obj/screen/pull + name = "stop pulling" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "pull" + +/obj/screen/pull/Click() + if(isobserver(usr)) + return + usr.stop_pulling() + +/obj/screen/pull/update_icon(mob/mymob) + if(!mymob) return + if(mymob.pulling) + icon_state = "pull" + else + icon_state = "pull0" + +/obj/screen/resist + name = "resist" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "act_resist" + layer = HUD_LAYER + plane = HUD_PLANE + +/obj/screen/resist/Click() + if(isliving(usr)) + var/mob/living/L = usr + L.resist() + +/obj/screen/storage + name = "storage" + +/obj/screen/storage/Click(location, control, params) + if(world.time <= usr.next_move) + return 1 + if(usr.stat || usr.IsUnconscious() || usr.IsKnockdown() || usr.IsStun()) + return 1 + if (ismecha(usr.loc)) // stops inventory actions in a mech + return 1 + if(master) + var/obj/item/I = usr.get_active_held_item() + if(I) + master.attackby(I, usr, params) + return 1 + +/obj/screen/throw_catch + name = "throw/catch" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "act_throw_off" + +/obj/screen/throw_catch/Click() + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + C.toggle_throw_mode() + +/obj/screen/zone_sel + name = "damage zone" + icon_state = "zone_sel" + screen_loc = ui_zonesel + var/selecting = "chest" + +/obj/screen/zone_sel/Click(location, control,params) + if(isobserver(usr)) + return + + var/list/PL = params2list(params) + var/icon_x = text2num(PL["icon-x"]) + var/icon_y = text2num(PL["icon-y"]) + var/choice + + switch(icon_y) + if(1 to 9) //Legs + switch(icon_x) + if(10 to 15) + choice = "r_leg" + if(17 to 22) + choice = "l_leg" + else + return 1 + if(10 to 13) //Hands and groin + switch(icon_x) + if(8 to 11) + choice = "r_arm" + if(12 to 20) + choice = "groin" + if(21 to 24) + choice = "l_arm" + else + return 1 + if(14 to 22) //Chest and arms to shoulders + switch(icon_x) + if(8 to 11) + choice = "r_arm" + if(12 to 20) + choice = "chest" + if(21 to 24) + choice = "l_arm" + else + return 1 + if(23 to 30) //Head, but we need to check for eye or mouth + if(icon_x in 12 to 20) + choice = "head" + switch(icon_y) + if(23 to 24) + if(icon_x in 15 to 17) + choice = "mouth" + if(26) //Eyeline, eyes are on 15 and 17 + if(icon_x in 14 to 18) + choice = "eyes" + if(25 to 27) + if(icon_x in 15 to 17) + choice = "eyes" + + return set_selected_zone(choice, usr) + +/obj/screen/zone_sel/proc/set_selected_zone(choice, mob/user) + if(isobserver(user)) + return + + if(choice != selecting) + selecting = choice + update_icon(usr) + return 1 + +/obj/screen/zone_sel/update_icon(mob/user) + cut_overlays() + add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[selecting]")) + user.zone_selected = selecting + +/obj/screen/zone_sel/alien + icon = 'icons/mob/screen_alien.dmi' + +/obj/screen/zone_sel/alien/update_icon(mob/user) + cut_overlays() + add_overlay(mutable_appearance('icons/mob/screen_alien.dmi', "[selecting]")) + user.zone_selected = selecting + +/obj/screen/zone_sel/robot + icon = 'icons/mob/screen_cyborg.dmi' + + +/obj/screen/flash + name = "flash" + icon_state = "blank" + blend_mode = BLEND_ADD + screen_loc = "WEST,SOUTH to EAST,NORTH" + layer = FLASH_LAYER + plane = FULLSCREEN_PLANE + +/obj/screen/damageoverlay + icon = 'icons/mob/screen_full.dmi' + icon_state = "oxydamageoverlay0" + name = "dmg" + blend_mode = BLEND_MULTIPLY + screen_loc = "CENTER-7,CENTER-7" +>>>>>>> cc30923... ismecha define (#31192) mouse_opacity = MOUSE_OPACITY_TRANSPARENT layer = UI_DAMAGE_LAYER plane = FULLSCREEN_PLANE diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm index 2c2212fde5..a1dc9ece69 100644 --- a/code/datums/weather/weather_types/ash_storm.dm +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -27,7 +27,7 @@ probability = 90 /datum/weather/ash_storm/proc/is_ash_immune(mob/living/L) - if(istype(L.loc, /obj/mecha)) //Mechs are immune + if(ismecha(L.loc)) //Mechs are immune return TRUE if(ishuman(L)) //Are you immune? var/mob/living/carbon/human/H = L diff --git a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm index 0a7a1b53b0..cdff486eea 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm @@ -75,7 +75,7 @@ if(GLOB.ratvar_awakens && L) L.adjust_fire_stacks(damage_per_tick) L.IgniteMob() - else if(istype(target, /obj/mecha)) + else if(ismecha(target)) var/obj/mecha/M = target M.take_damage(damage_per_tick * get_efficiency_mod(), BURN, "melee", 1, get_dir(src, M)) @@ -90,7 +90,7 @@ if(isliving(target)) var/mob/living/L = target to_chat(L, "\"I SEE YOU!\"\n[src]'s gaze [GLOB.ratvar_awakens ? "melts you alive" : "burns you"]!") - else if(istype(target, /obj/mecha)) + else if(ismecha(target)) var/obj/mecha/M = target to_chat(M.occupant, "\"I SEE YOU!\"" ) else if(prob(0.5)) //Extremely low chance because of how fast the subsystem it uses processes diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 25bbe1bc1d..883cc3986f 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -83,7 +83,7 @@ bumpopen(M) return - if(istype(AM, /obj/mecha)) + if(ismecha(AM)) var/obj/mecha/mecha = AM if(density) if(mecha.occupant) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index f76412199c..4809f3ff49 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -62,7 +62,7 @@ if( operating || !src.density ) return if (!( ismob(AM) )) - if(istype(AM, /obj/mecha)) + if(ismecha(AM)) var/obj/mecha/mecha = AM if(mecha.occupant && src.allowed(mecha.occupant)) open_and_close() diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 17f573fe6d..9acd4730d8 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -20,7 +20,7 @@ var/O_limit var/atom/target = get_edge_target_turf(src, dir) for(var/atom/movable/O in loc) - if(!O.anchored || istype(O, /obj/mecha)) //Mechs need their launch platforms. + if(!O.anchored || ismecha(O)) //Mechs need their launch platforms. O_limit++ if(O_limit >= 20) audible_message("[src] lets out a screech, it doesn't seem to be able to handle the load.") diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index e9f0f76bc9..8f8202fe19 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -390,7 +390,7 @@ if(!in_faction(C)) targets += C - if(istype(A, /obj/mecha)) + if(ismecha(A)) var/obj/mecha/M = A //If there is a user and they're not in our faction if(M.occupant && !in_faction(M.occupant)) diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 6f1348c741..d4b79a0163 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -4,6 +4,7 @@ icon_screen = "mecha" icon_keyboard = "tech_key" req_access = list(ACCESS_ROBOTICS) +<<<<<<< HEAD circuit = /obj/item/circuitboard/computer/mecha_control var/list/located = list() var/screen = 0 @@ -135,3 +136,136 @@ new /obj/item/mecha_parts/mecha_tracking(src) new /obj/item/mecha_parts/mecha_tracking(src) new /obj/item/mecha_parts/mecha_tracking(src) +======= + circuit = /obj/item/circuitboard/computer/mecha_control + var/list/located = list() + var/screen = 0 + var/stored_data + +/obj/machinery/computer/mecha/attack_hand(mob/user) + if(..()) + return + user.set_machine(src) + var/dat = "[src.name]" + if(screen == 0) + dat += "

Tracking beacons data

" + var/list/trackerlist = list() + for(var/obj/mecha/MC in GLOB.mechas_list) + trackerlist += MC.trackers + for(var/obj/item/mecha_parts/mecha_tracking/TR in trackerlist) + var/answer = TR.get_mecha_info() + if(answer) + dat += {"
[answer]
+ Send message
+ Show exosuit log | (EMP pulse)
"} + + if(screen==1) + dat += "

Log contents

" + dat += "Return
" + dat += "[stored_data]" + + dat += "(Refresh)
" + dat += "" + + user << browse(dat, "window=computer;size=400x500") + onclose(user, "computer") + return + +/obj/machinery/computer/mecha/Topic(href, href_list) + if(..()) + return + var/datum/topic_input/filter = new /datum/topic_input(href,href_list) + if(href_list["send_message"]) + var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("send_message") + var/message = stripped_input(usr,"Input message","Transmit message") + var/obj/mecha/M = MT.in_mecha() + if(trim(message) && M) + M.occupant_message(message) + return + if(href_list["shock"]) + var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("shock") + MT.shock() + if(href_list["get_log"]) + var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("get_log") + stored_data = MT.get_mecha_log() + screen = 1 + if(href_list["return"]) + screen = 0 + updateUsrDialog() + return + +/obj/item/mecha_parts/mecha_tracking + name = "exosuit tracking beacon" + desc = "Device used to transmit exosuit data." + icon = 'icons/obj/device.dmi' + icon_state = "motion2" + w_class = WEIGHT_CLASS_SMALL + origin_tech = "programming=2;magnets=2" + var/ai_beacon = FALSE //If this beacon allows for AI control. Exists to avoid using istype() on checking. + +/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info() + if(!in_mecha()) + return 0 + var/obj/mecha/M = src.loc + var/cell_charge = M.get_charge() + var/answer = {"Name: [M.name] +Integrity: [M.obj_integrity/M.max_integrity*100]% +Cell charge: [isnull(cell_charge)?"Not found":"[M.cell.percent()]%"] +Airtank: [M.return_pressure()]kPa +Pilot: [M.occupant||"None"] +Location: [get_area(M)||"Unknown"] +Active equipment: [M.selected||"None"] "} + if(istype(M, /obj/mecha/working/ripley)) + var/obj/mecha/working/ripley/RM = M + answer += "Used cargo space: [RM.cargo.len/RM.cargo_capacity*100]%
" + + return answer + +/obj/item/mecha_parts/mecha_tracking/emp_act() + qdel(src) + +/obj/item/mecha_parts/mecha_tracking/Destroy() + if(ismecha(loc)) + var/obj/mecha/M = loc + if(src in M.trackers) + M.trackers -= src + return ..() + +/obj/item/mecha_parts/mecha_tracking/proc/in_mecha() + if(ismecha(loc)) + return loc + return 0 + +/obj/item/mecha_parts/mecha_tracking/proc/shock() + var/obj/mecha/M = in_mecha() + if(M) + M.emp_act(EMP_LIGHT) + qdel(src) + +/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log() + if(!ismecha(loc)) + return 0 + var/obj/mecha/M = src.loc + return M.get_log_html() + + +/obj/item/mecha_parts/mecha_tracking/ai_control + name = "exosuit AI control beacon" + desc = "A device used to transmit exosuit data. Also allows active AI units to take control of said exosuit." + origin_tech = "programming=3;magnets=2;engineering=2" + ai_beacon = TRUE + + +/obj/item/storage/box/mechabeacons + name = "exosuit tracking beacons" + +/obj/item/storage/box/mechabeacons/New() + ..() + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) +>>>>>>> cc30923... ismecha define (#31192) diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 97d00c339f..0e77d3f28f 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /proc/create_portal_pair(turf/source, turf/destination, _creator = null, _lifespan = 300, accuracy = 0, newtype = /obj/effect/portal) if(!istype(source) || !istype(destination)) @@ -154,3 +155,161 @@ real_target = get_turf(linked) return real_target +======= + +/proc/create_portal_pair(turf/source, turf/destination, _creator = null, _lifespan = 300, accuracy = 0, newtype = /obj/effect/portal) + if(!istype(source) || !istype(destination)) + return + var/turf/actual_destination = get_teleport_turf(destination, accuracy) + var/obj/effect/portal/P1 = new newtype(source, _creator, _lifespan, null, FALSE) + var/obj/effect/portal/P2 = new newtype(actual_destination, _creator, _lifespan, P1, TRUE) + if(!istype(P1)||!istype(P2)) + return + P1.link_portal(P2) + P1.hardlinked = TRUE + return list(P1, P2) + +/obj/effect/portal + name = "portal" + desc = "Looks unstable. Best to test it with the clown." + icon = 'icons/obj/stationobjs.dmi' + icon_state = "portal" + anchored = TRUE + var/mech_sized = FALSE + var/obj/effect/portal/linked + var/hardlinked = TRUE //Requires a linked portal at all times. Destroy if there's no linked portal, if there is destroy it when this one is deleted. + var/creator + var/turf/hard_target //For when a portal needs a hard target and isn't to be linked. + var/atmos_link = FALSE //Link source/destination atmos. + var/turf/open/atmos_source //Atmos link source + var/turf/open/atmos_destination //Atmos link destination + +/obj/effect/portal/anom + name = "wormhole" + icon = 'icons/obj/objects.dmi' + icon_state = "anom" + mech_sized = TRUE + +/obj/effect/portal/Move(newloc) + for(var/T in newloc) + if(istype(T, /obj/effect/portal)) + return FALSE + return ..() + +/obj/effect/portal/attackby(obj/item/W, mob/user, params) + if(user && Adjacent(user)) + teleport(user) + +/obj/effect/portal/Crossed(atom/movable/AM, oldloc) + if(get_turf(oldloc) == get_turf(linked)) + return ..() + if(!teleport(AM)) + return ..() + +/obj/effect/portal/attack_tk(mob/user) + return + +/obj/effect/portal/attack_hand(mob/user) + if(Adjacent(user)) + teleport(user) + +/obj/effect/portal/Initialize(mapload, _creator, _lifespan = 0, obj/effect/portal/_linked, automatic_link = FALSE, turf/hard_target_override, atmos_link_override) + . = ..() + GLOB.portals += src + if(!istype(_linked) && automatic_link) + . = INITIALIZE_HINT_QDEL + CRASH("Somebody fucked up.") + if(_lifespan > 0) + QDEL_IN(src, _lifespan) + if(!isnull(atmos_link_override)) + atmos_link = atmos_link_override + link_portal(_linked) + hardlinked = automatic_link + creator = _creator + if(isturf(hard_target_override)) + hard_target = hard_target_override + +/obj/effect/portal/proc/link_portal(obj/effect/portal/newlink) + linked = newlink + if(atmos_link) + link_atmos() + +/obj/effect/portal/proc/link_atmos() + if(atmos_source || atmos_destination) + unlink_atmos() + if(!isopenturf(get_turf(src))) + return FALSE + if(linked) + if(isopenturf(get_turf(linked))) + atmos_source = get_turf(src) + atmos_destination = get_turf(linked) + else if(hard_target) + if(isopenturf(hard_target)) + atmos_source = get_turf(src) + atmos_destination = hard_target + else + return FALSE + if(!istype(atmos_source) || !istype(atmos_destination)) + return FALSE + LAZYINITLIST(atmos_source.atmos_adjacent_turfs) + LAZYINITLIST(atmos_destination.atmos_adjacent_turfs) + if(atmos_source.atmos_adjacent_turfs[atmos_destination] || atmos_destination.atmos_adjacent_turfs[atmos_source]) //Already linked! + return FALSE + atmos_source.atmos_adjacent_turfs[atmos_destination] = TRUE + atmos_destination.atmos_adjacent_turfs[atmos_source] = TRUE + atmos_source.air_update_turf(FALSE) + atmos_destination.air_update_turf(FALSE) + +/obj/effect/portal/proc/unlink_atmos() + if(istype(atmos_source)) + if(istype(atmos_destination) && !atmos_source.Adjacent(atmos_destination) && !CANATMOSPASS(atmos_destination, atmos_source)) + LAZYREMOVE(atmos_source.atmos_adjacent_turfs, atmos_destination) + atmos_source = null + if(istype(atmos_destination)) + if(istype(atmos_source) && !atmos_destination.Adjacent(atmos_source) && !CANATMOSPASS(atmos_source, atmos_destination)) + LAZYREMOVE(atmos_destination.atmos_adjacent_turfs, atmos_source) + atmos_destination = null + +/obj/effect/portal/Destroy() //Calls on_portal_destroy(destroyed portal, location of destroyed portal) on creator if creator has such call. + if(creator && hascall(creator, "on_portal_destroy")) + call(creator, "on_portal_destroy")(src, src.loc) + creator = null + GLOB.portals -= src + unlink_atmos() + if(hardlinked && !QDELETED(linked)) + QDEL_NULL(linked) + else + linked = null + return ..() + +/obj/effect/portal/proc/teleport(atom/movable/M) + if(!istype(M) || istype(M, /obj/effect) || (ismecha(M) && !mech_sized) || (!isobj(M) && !ismob(M))) //Things that shouldn't teleport. + return + var/turf/real_target = get_link_target_turf() + if(!istype(real_target)) + return FALSE + if(ismegafauna(M)) + message_admins("[M] has used a portal at [ADMIN_COORDJMP(src)] made by [usr].") + if(do_teleport(M, real_target, 0)) + if(istype(M, /obj/item/projectile)) + var/obj/item/projectile/P = M + P.ignore_source_check = TRUE + return TRUE + return FALSE + +/obj/effect/portal/proc/get_link_target_turf() + var/turf/real_target + if(!istype(linked) || QDELETED(linked)) + if(hardlinked) + qdel(src) + if(!istype(hard_target) || QDELETED(hard_target)) + hard_target = null + return + else + real_target = hard_target + linked = null + else + real_target = get_turf(linked) + return real_target + +>>>>>>> cc30923... ismecha define (#31192) diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index 5a2b52184a..9a3769206c 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -34,7 +34,7 @@ if(!over_object) return - if (istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech + if (ismecha(M.loc)) // stops inventory actions in a mech return // this must come before the screen objects only block, dunno why it wasn't before diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 2e1f0af991..949da6db09 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -56,6 +56,7 @@ return TryToSwitchState(user) /obj/structure/mineral_door/CanPass(atom/movable/mover, turf/target) +<<<<<<< HEAD if(istype(mover, /obj/effect/beam)) return !opacity return !density @@ -89,6 +90,41 @@ set_opacity(FALSE) flick("[initial_state]opening",src) sleep(10) +======= + if(istype(mover, /obj/effect/beam)) + return !opacity + return !density + +/obj/structure/mineral_door/proc/TryToSwitchState(atom/user) + if(isSwitchingStates) + return + if(isliving(user)) + var/mob/living/M = user + if(world.time - M.last_bumped <= 60) + return //NOTE do we really need that? + if(M.client) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(!C.handcuffed) + SwitchState() + else + SwitchState() + else if(ismecha(user)) + SwitchState() + +/obj/structure/mineral_door/proc/SwitchState() + if(state) + Close() + else + Open() + +/obj/structure/mineral_door/proc/Open() + isSwitchingStates = 1 + playsound(src, openSound, 100, 1) + set_opacity(FALSE) + flick("[initial_state]opening",src) + sleep(10) +>>>>>>> cc30923... ismecha define (#31192) density = FALSE state = 1 air_update_turf(1) diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index aa9e8364c4..16e77c1141 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -76,7 +76,7 @@ if(C.move_delay) return 0 - if(istype(A, /obj/mecha)) + if(ismecha(A)) return 0 diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 630ded7daa..a597022448 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -111,12 +111,6 @@ if(istype(R.module_active, /obj/item/pickaxe)) src.attackby(R.module_active,R) return -/* else if(istype(AM, /obj/mecha)) - var/obj/mecha/M = AM - if(istype(M.selected, /obj/item/mecha_parts/mecha_equipment/drill)) - src.attackby(M.selected,M) - return*/ -//Aparantly mechs are just TOO COOL to call Collide()) else return diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 9d8b25cebf..237714eb8e 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -48,7 +48,7 @@ if(pockets && over_object == M) return pockets.MouseDrop(over_object) - if(istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech + if(ismecha(M.loc)) // stops inventory actions in a mech return if(!M.incapacitated() && loc == M && istype(over_object, /obj/screen/inventory/hand)) diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index 6404307d34..00b4ce4e98 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -58,7 +58,7 @@ if(istype(M, /obj/effect)) //sparks don't teleport return if(M.anchored) - if(!(istype(M, /obj/mecha) && mech_sized)) + if(!(ismecha(M) && mech_sized)) return if(ismovableatom(M)) diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index e0197cc4e3..d72d0e5f73 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -94,7 +94,7 @@ if(!ismob(M) && !isobj(M)) //No don't teleport lighting and effects! return - if(M.anchored && (!ismob(M) || (istype(M, /obj/mecha) && !mech_sized))) + if(M.anchored && (!ismob(M) || (ismecha(M) && !mech_sized))) return if(do_teleport(M, hard_target, 6)) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 58c971024f..e16077fec1 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -435,7 +435,7 @@ if(!over_object) return - if (istype(usr.loc, /obj/mecha)) + if(ismecha(usr.loc)) return if(!M.incapacitated()) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index a1b67fbee1..282de04ede 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -29,7 +29,7 @@ dizziness = 0 jitteriness = 0 - if(istype(loc, /obj/mecha)) + if(ismecha(loc)) var/obj/mecha/M = loc if(M.occupant == src) M.go_out() diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 9ab6f783f5..2b29283c28 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -165,7 +165,7 @@ return chosen_target // Please do not add one-off mob AIs here, but override this function for your mob -/mob/living/simple_animal/hostile/CanAttack(atom/the_target)//Can we actually attack a possible target? +/mob/living/simple_animal/hostile/CanAttack(atom/the_target)//Can we actually attack a possible target? if(isturf(the_target) || !the_target || the_target.type == /atom/movable/lighting_object) // bail out on invalids return FALSE @@ -187,7 +187,7 @@ return FALSE return TRUE - if(istype(the_target, /obj/mecha)) + if(ismecha(the_target)) var/obj/mecha/M = the_target if(M.occupant)//Just so we don't attack empty mechs if(CanAttack(M.occupant)) diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index b84f3c8682..378b5d9b8e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -184,7 +184,7 @@ mecha_face_target(target) target.mech_melee_attack(mecha) else - if(istype(target, /obj/mecha)) + if(ismecha(target)) var/obj/mecha/M = target if(is_valid_mecha(M)) enter_mecha(M) @@ -259,7 +259,7 @@ //Yes they actually try and pull this shit //~simple animals~ /mob/living/simple_animal/hostile/syndicate/mecha_pilot/CanAttack(atom/the_target) - if(istype(the_target, /obj/mecha)) + if(ismecha(the_target)) var/obj/mecha/M = the_target if(mecha) if(M == mecha || !CanAttack(M.occupant)) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index 4aa067c9ab..c024cf5556 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /mob/living/simple_animal/hostile/retaliate var/list/enemies = list() @@ -45,3 +46,52 @@ . = ..() if(. > 0 && stat == CONSCIOUS) Retaliate() +======= +/mob/living/simple_animal/hostile/retaliate + var/list/enemies = list() + +/mob/living/simple_animal/hostile/retaliate/Found(atom/A) + if(isliving(A)) + var/mob/living/L = A + if(!L.stat) + return L + else + enemies -= L + else if(ismecha(A)) + var/obj/mecha/M = A + if(M.occupant) + return A + +/mob/living/simple_animal/hostile/retaliate/ListTargets() + if(!enemies.len) + return list() + var/list/see = ..() + see &= enemies // Remove all entries that aren't in enemies + return see + +/mob/living/simple_animal/hostile/retaliate/proc/Retaliate() + var/list/around = view(src, vision_range) + + for(var/atom/movable/A in around) + if(A == src) + continue + if(isliving(A)) + var/mob/living/M = A + if(faction_check_mob(M) && attack_same || !faction_check_mob(M)) + enemies |= M + else if(ismecha(A)) + var/obj/mecha/M = A + if(M.occupant) + enemies |= M + enemies |= M.occupant + + for(var/mob/living/simple_animal/hostile/retaliate/H in around) + if(faction_check_mob(H) && !attack_same && !H.attack_same) + H.enemies |= enemies + return 0 + +/mob/living/simple_animal/hostile/retaliate/adjustHealth(amount, updating_health = TRUE, forced = FALSE) + . = ..() + if(. > 0 && stat == CONSCIOUS) + Retaliate() +>>>>>>> cc30923... ismecha define (#31192) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 4e988c482c..4edf7a6dcb 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -317,7 +317,7 @@ var/mob/living/L = the_target if(L.stat != CONSCIOUS) return 0 - if (istype(the_target, /obj/mecha)) + if (ismecha(the_target)) var/obj/mecha/M = the_target if (M.occupant) return 0 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4f4b99e1e1..c75e0a27fb 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -386,7 +386,7 @@ set category = "Object" set src = usr - if(istype(loc, /obj/mecha)) + if(ismecha(loc)) return if(incapacitated()) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index c64cb4f4ef..3d87de4e62 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -278,7 +278,7 @@ //dist_check - set to only shock mobs within 1 of source (vendors, airlocks, etc.) //No animations will be performed by this proc. /proc/electrocute_mob(mob/living/carbon/M, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE) - if(istype(M.loc, /obj/mecha)) + if(ismecha(M.loc)) return 0 //feckin mechs are dumb if(dist_check) if(!in_range(source,M)) diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 32967e2537..f2610f97b0 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -58,7 +58,7 @@ if(isliving(mover)) shock(mover) - if(istype(mover, /obj/machinery) || isstructure(mover) || istype(mover, /obj/mecha)) + if(istype(mover, /obj/machinery) || isstructure(mover) || ismecha(mover)) bump_field(mover) /obj/machinery/field/containment/proc/set_master(master1,master2) @@ -90,13 +90,13 @@ if(isliving(mover)) shock(mover) return - if(istype(mover, /obj/machinery) || isstructure(mover) || istype(mover, /obj/mecha)) + if(istype(mover, /obj/machinery) || isstructure(mover) || ismecha(mover)) bump_field(mover) return /obj/machinery/field/CanPass(atom/movable/mover, turf/target) - if(hasShocked || isliving(mover) || istype(mover, /obj/machinery) || isstructure(mover) || istype(mover, /obj/mecha)) + if(hasShocked || isliving(mover) || istype(mover, /obj/machinery) || isstructure(mover) || ismecha(mover)) return FALSE return ..() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 84db583282..3aba80fe64 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -144,7 +144,7 @@ ignore_source_check = TRUE return FALSE if(firer && !ignore_source_check) - if(A == firer || (A == firer.loc && istype(A, /obj/mecha))) //cannot shoot yourself or your mech + if(A == firer || (A == firer.loc && ismecha(A))) //cannot shoot yourself or your mech loc = A.loc return FALSE diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 79a3d51eec..a5ba7c15a4 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -45,7 +45,7 @@ ..() explosion(target, -1, 1, 3, 1, 0, flame_range = 4) - if(istype(target, /obj/mecha)) + if(ismecha(target)) var/obj/mecha/M = target M.take_damage(anti_armour_damage) if(issilicon(target)) From bd76e658b09dfea1efa57e91e9cb5e4b095a6c6d Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 2 Oct 2017 02:14:08 -0400 Subject: [PATCH 046/141] Makes the reply link for ahelps use the global token (#31191) --- code/modules/admin/verbs/adminhelp.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 3a343b7f06..c9784dcf18 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -242,7 +242,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) /datum/admin_help/proc/LinkedReplyName(ref_src) if(!ref_src) ref_src = "\ref[src]" - return "[initiator_key_name]" + return "[initiator_key_name]" //private /datum/admin_help/proc/TicketHref(msg, ref_src, action = "ticket") From e402c4350c2dfa8aadebe81245c4a94847431377 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Mon, 2 Oct 2017 03:48:42 -0400 Subject: [PATCH 048/141] Refactor quick create antag panel code, fixed AFK revs not properly ending the round. (#31103) * Refactor quick create antag, fixed AFK revs not ending * More cleanup * Simplified one of the checks The other half was covered by considered_alive already. * Reordered check Eliminate current antags sooner before running them through the rest of the checks. * removed switch --- code/__HELPERS/game.dm | 14 ++++ code/game/gamemodes/objective.dm | 26 +++---- code/game/gamemodes/revolution/revolution.dm | 2 +- code/modules/admin/verbs/one_click_antag.dm | 72 ++++++++++---------- 4 files changed, 59 insertions(+), 55 deletions(-) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index e38a6826f9..a16f91b317 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -331,6 +331,20 @@ afk_bracket += 600 // Add a minute to the bracket, for every attempt return candidates +/proc/considered_alive(datum/mind/M, enforce_human = TRUE) + if(M && M.current) + if(enforce_human) + var/mob/living/carbon/human/H + if(ishuman(M.current)) + H = M.current + return M.current.stat != DEAD && !issilicon(M.current) && !isbrain(M.current) && (!H || H.dna.species.id != "memezombies") + else if(isliving(M.current)) + return M.current.stat != DEAD + return FALSE + +/proc/considered_afk(datum/mind/M) + return !M || !M.current || !M.current.client || M.current.client.is_afk() + /proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480) if(!isobj(O)) O = new /obj/screen/text() diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 1646996cf5..effe2212a7 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -17,14 +17,6 @@ if(owner) . += owner -/datum/objective/proc/considered_alive(var/datum/mind/M) - if(M && M.current) - var/mob/living/carbon/human/H - if(ishuman(M.current)) - H = M.current - return M.current.stat != DEAD && !issilicon(M.current) && !isbrain(M.current) && (!H || H.dna.species.id != "memezombies") - return FALSE - /datum/objective/proc/considered_escaped(datum/mind/M) if(!considered_alive(M)) return FALSE @@ -37,9 +29,6 @@ return FALSE return location.onCentCom() || location.onSyndieBase() -/datum/objective/proc/considered_afk(datum/mind/M) - return !M || !M.current || !M.current.client || M.current.client.is_afk() - /datum/objective/proc/check_completion() return completed @@ -348,13 +337,14 @@ return FALSE return TRUE -//Like survive, but works for silicons and zombies and such. -/datum/objective/survive/exist/considered_alive(var/datum/mind/M) - if(M && M.current) - if(isliving(M.current)) - var/mob/living/L = M.current - return L.stat != DEAD - return FALSE +/datum/objective/survive/exist //Like survive, but works for silicons and zombies and such. + +/datum/objective/survive/exist/check_completion() + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!considered_alive(M, FALSE)) + return FALSE + return TRUE /datum/objective/martyr explanation_text = "Die a glorious death." diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index ecfe8cfc44..add016dd8f 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -329,7 +329,7 @@ /datum/game_mode/revolution/proc/check_heads_victory() for(var/datum/mind/rev_mind in head_revolutionaries) var/turf/T = get_turf(rev_mind.current) - if((rev_mind) && (rev_mind.current) && (rev_mind.current.stat != DEAD) && T && (T.z in GLOB.station_z_levels)) + if(!considered_afk(rev_mind) && considered_alive(rev_mind) && (T.z in GLOB.station_z_levels)) if(ishuman(rev_mind.current)) return 0 return 1 diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index d14fb1f167..3021f9badd 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -28,6 +28,22 @@ popup.set_content(dat) popup.open() +/datum/admins/proc/isReadytoRumble(mob/living/carbon/human/applicant, targetrole, onstation = TRUE, conscious = TRUE) + if(applicant.mind.special_role) + return FALSE + if(!(targetrole in applicant.client.prefs.be_special)) + return FALSE + if(onstation) + var/turf/T = get_turf(applicant) + if(!(T.z in GLOB.station_z_levels)) + return FALSE + if(conscious && applicant.stat) //incase you don't care about a certain antag being unconcious when made, ie if they have selfhealing abilities. + return FALSE + if(!considered_alive(applicant.mind) || considered_afk(applicant.mind)) //makes sure the player isn't a zombie, brain, or just afk all together + return FALSE + return (!jobban_isbanned(applicant, targetrole) && !jobban_isbanned(applicant, "Syndicate")) + + /datum/admins/proc/makeTraitors() var/datum/game_mode/traitor/temp = new @@ -41,14 +57,10 @@ var/mob/living/carbon/human/H = null for(var/mob/living/carbon/human/applicant in GLOB.player_list) - if(ROLE_TRAITOR in applicant.client.prefs.be_special) - if(!applicant.stat) - if(applicant.mind) - if (!applicant.mind.special_role) - if(!jobban_isbanned(applicant, ROLE_TRAITOR) && !jobban_isbanned(applicant, "Syndicate")) - if(temp.age_check(applicant.client)) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant + if(isReadytoRumble(applicant, ROLE_TRAITOR, FALSE)) + if(temp.age_check(applicant.client)) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant if(candidates.len) var/numTraitors = min(candidates.len, 3) @@ -77,13 +89,10 @@ var/mob/living/carbon/human/H = null for(var/mob/living/carbon/human/applicant in GLOB.player_list) - if(ROLE_CHANGELING in applicant.client.prefs.be_special) - var/turf/T = get_turf(applicant) - if(applicant.stat == CONSCIOUS && applicant.mind && !applicant.mind.special_role && (T.z in GLOB.station_z_levels)) - if(!jobban_isbanned(applicant, ROLE_CHANGELING) && !jobban_isbanned(applicant, "Syndicate")) - if(temp.age_check(applicant.client)) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant + if(isReadytoRumble(applicant, ROLE_CHANGELING)) + if(temp.age_check(applicant.client)) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant if(candidates.len) var/numChanglings = min(candidates.len, 3) @@ -110,13 +119,10 @@ var/mob/living/carbon/human/H = null for(var/mob/living/carbon/human/applicant in GLOB.player_list) - if(ROLE_REV in applicant.client.prefs.be_special) - var/turf/T = get_turf(applicant) - if(applicant.stat == CONSCIOUS && applicant.mind && !applicant.mind.special_role && (T.z in GLOB.station_z_levels)) - if(!jobban_isbanned(applicant, ROLE_REV) && !jobban_isbanned(applicant, "Syndicate")) - if(temp.age_check(applicant.client)) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant + if(isReadytoRumble(applicant, ROLE_REV)) + if(temp.age_check(applicant.client)) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant if(candidates.len) var/numRevs = min(candidates.len, 3) @@ -152,13 +158,10 @@ var/mob/living/carbon/human/H = null for(var/mob/living/carbon/human/applicant in GLOB.player_list) - if(ROLE_CULTIST in applicant.client.prefs.be_special) - var/turf/T = get_turf(applicant) - if(applicant.stat == CONSCIOUS && applicant.mind && !applicant.mind.special_role && (T.z in GLOB.station_z_levels)) - if(!jobban_isbanned(applicant, ROLE_CULTIST) && !jobban_isbanned(applicant, "Syndicate")) - if(temp.age_check(applicant.client)) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant + if(isReadytoRumble(applicant, ROLE_CULTIST)) + if(temp.age_check(applicant.client)) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant if(candidates.len) var/numCultists = min(candidates.len, 4) @@ -185,13 +188,10 @@ var/mob/living/carbon/human/H = null for(var/mob/living/carbon/human/applicant in GLOB.player_list) - if(ROLE_SERVANT_OF_RATVAR in applicant.client.prefs.be_special) - var/turf/T = get_turf(applicant) - if(applicant.stat == CONSCIOUS && applicant.mind && !applicant.mind.special_role && (T.z in GLOB.station_z_levels)) - if(!jobban_isbanned(applicant, ROLE_SERVANT_OF_RATVAR) && !jobban_isbanned(applicant, "Syndicate")) - if(temp.age_check(applicant.client)) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant + if(isReadytoRumble(applicant, ROLE_SERVANT_OF_RATVAR)) + if(temp.age_check(applicant.client)) + if(!(applicant.job in temp.restricted_jobs)) + candidates += applicant if(candidates.len) var/numCultists = min(candidates.len, 4) From 891f89e49ac6458c102371f54e4517684115e0ce Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 2 Oct 2017 15:34:36 -0500 Subject: [PATCH 050/141] Update custom_items.dm --- code/citadel/custom_loadout/custom_items.dm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/code/citadel/custom_loadout/custom_items.dm b/code/citadel/custom_loadout/custom_items.dm index c100f0013c..9777d564e1 100644 --- a/code/citadel/custom_loadout/custom_items.dm +++ b/code/citadel/custom_loadout/custom_items.dm @@ -117,4 +117,13 @@ desc = "You would swear this was in your nightmares after eating too many veggies." icon_state = "hos-g" item_state = "hos-g" - body_parts_covered = CHEST|GROIN|ARMS|LEGS \ No newline at end of file + body_parts_covered = CHEST|GROIN|ARMS|LEGS + + +/*Slomek*/ +/*Slomek*/ +/obj/item/reagent_containers/food/drinks/flask/russian + name = "russian flask" + desc = "Every good russian spaceman knows it's a good idea to bring along a couple of pints of whiskey wherever they go." + icon_state = "russianflask" + volume = 60 From 139ebadc5286989bf714ac6a7d210d8421441bce Mon Sep 17 00:00:00 2001 From: oranges Date: Tue, 3 Oct 2017 09:51:34 +1300 Subject: [PATCH 051/141] Merge pull request #31196 from kevinz000/patch-303 Fixes check antagonists for blood brothers --- code/modules/admin/player_panel.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 9e43ef92f8..95f4bd55c7 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -530,7 +530,7 @@ else dat += "[brother.name]([brother.key])Brother body destroyed!" dat += "PM" - dat += "" + dat += "" if(SSticker.mode.abductors.len) dat += "
" From 865f057d7b8e95f1ddce64a93e6de12d68da7f55 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 2 Oct 2017 17:32:11 -0500 Subject: [PATCH 053/141] Update mecha_control_console.dm --- code/game/mecha/mecha_control_console.dm | 144 +---------------------- 1 file changed, 5 insertions(+), 139 deletions(-) diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index d4b79a0163..431768500e 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -1,142 +1,9 @@ -/obj/machinery/computer/mecha - name = "exosuit control console" - desc = "Used to remotely locate or lockdown exosuits." - icon_screen = "mecha" - icon_keyboard = "tech_key" +/obj/machinery/computer/mecha + name = "exosuit control console" + desc = "Used to remotely locate or lockdown exosuits." + icon_screen = "mecha" + icon_keyboard = "tech_key" req_access = list(ACCESS_ROBOTICS) -<<<<<<< HEAD - circuit = /obj/item/circuitboard/computer/mecha_control - var/list/located = list() - var/screen = 0 - var/stored_data - -/obj/machinery/computer/mecha/attack_hand(mob/user) - if(..()) - return - user.set_machine(src) - var/dat = "[src.name]" - if(screen == 0) - dat += "

Tracking beacons data

" - var/list/trackerlist = list() - for(var/obj/mecha/MC in GLOB.mechas_list) - trackerlist += MC.trackers - for(var/obj/item/mecha_parts/mecha_tracking/TR in trackerlist) - var/answer = TR.get_mecha_info() - if(answer) - dat += {"
[answer]
- Send message
- Show exosuit log | (EMP pulse)
"} - - if(screen==1) - dat += "

Log contents

" - dat += "Return
" - dat += "[stored_data]" - - dat += "(Refresh)
" - dat += "" - - user << browse(dat, "window=computer;size=400x500") - onclose(user, "computer") - return - -/obj/machinery/computer/mecha/Topic(href, href_list) - if(..()) - return - var/datum/topic_input/filter = new /datum/topic_input(href,href_list) - if(href_list["send_message"]) - var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("send_message") - var/message = stripped_input(usr,"Input message","Transmit message") - var/obj/mecha/M = MT.in_mecha() - if(trim(message) && M) - M.occupant_message(message) - return - if(href_list["shock"]) - var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("shock") - MT.shock() - if(href_list["get_log"]) - var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("get_log") - stored_data = MT.get_mecha_log() - screen = 1 - if(href_list["return"]) - screen = 0 - updateUsrDialog() - return - -/obj/item/mecha_parts/mecha_tracking - name = "exosuit tracking beacon" - desc = "Device used to transmit exosuit data." - icon = 'icons/obj/device.dmi' - icon_state = "motion2" - w_class = WEIGHT_CLASS_SMALL - origin_tech = "programming=2;magnets=2" - var/ai_beacon = FALSE //If this beacon allows for AI control. Exists to avoid using istype() on checking. - -/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info() - if(!in_mecha()) - return 0 - var/obj/mecha/M = src.loc - var/cell_charge = M.get_charge() - var/answer = {"Name: [M.name] -Integrity: [M.obj_integrity/M.max_integrity*100]% -Cell charge: [isnull(cell_charge)?"Not found":"[M.cell.percent()]%"] -Airtank: [M.return_pressure()]kPa -Pilot: [M.occupant||"None"] -Location: [get_area(M)||"Unknown"] -Active equipment: [M.selected||"None"] "} - if(istype(M, /obj/mecha/working/ripley)) - var/obj/mecha/working/ripley/RM = M - answer += "Used cargo space: [RM.cargo.len/RM.cargo_capacity*100]%
" - - return answer - -/obj/item/mecha_parts/mecha_tracking/emp_act() - qdel(src) - -/obj/item/mecha_parts/mecha_tracking/Destroy() - if(istype(loc, /obj/mecha)) - var/obj/mecha/M = loc - if(src in M.trackers) - M.trackers -= src - return ..() - -/obj/item/mecha_parts/mecha_tracking/proc/in_mecha() - if(istype(src.loc, /obj/mecha)) - return src.loc - return 0 - -/obj/item/mecha_parts/mecha_tracking/proc/shock() - var/obj/mecha/M = in_mecha() - if(M) - M.emp_act(EMP_LIGHT) - qdel(src) - -/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log() - if(!istype(loc, /obj/mecha)) - return 0 - var/obj/mecha/M = src.loc - return M.get_log_html() - - -/obj/item/mecha_parts/mecha_tracking/ai_control - name = "exosuit AI control beacon" - desc = "A device used to transmit exosuit data. Also allows active AI units to take control of said exosuit." - origin_tech = "programming=3;magnets=2;engineering=2" - ai_beacon = TRUE - - -/obj/item/storage/box/mechabeacons - name = "exosuit tracking beacons" - -/obj/item/storage/box/mechabeacons/New() - ..() - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) -======= circuit = /obj/item/circuitboard/computer/mecha_control var/list/located = list() var/screen = 0 @@ -268,4 +135,3 @@ new /obj/item/mecha_parts/mecha_tracking(src) new /obj/item/mecha_parts/mecha_tracking(src) new /obj/item/mecha_parts/mecha_tracking(src) ->>>>>>> cc30923... ismecha define (#31192) From a9116b36489f1bb23905bd8a1abcbfaa0bcacab8 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 2 Oct 2017 17:32:27 -0500 Subject: [PATCH 054/141] Update portals.dm --- code/game/objects/effects/portals.dm | 161 --------------------------- 1 file changed, 161 deletions(-) diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 0e77d3f28f..7b53b6c531 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -1,162 +1,3 @@ -<<<<<<< HEAD - -/proc/create_portal_pair(turf/source, turf/destination, _creator = null, _lifespan = 300, accuracy = 0, newtype = /obj/effect/portal) - if(!istype(source) || !istype(destination)) - return - var/turf/actual_destination = get_teleport_turf(destination, accuracy) - var/obj/effect/portal/P1 = new newtype(source, _creator, _lifespan, null, FALSE) - var/obj/effect/portal/P2 = new newtype(actual_destination, _creator, _lifespan, P1, TRUE) - if(!istype(P1)||!istype(P2)) - return - P1.link_portal(P2) - P1.hardlinked = TRUE - return list(P1, P2) - -/obj/effect/portal - name = "portal" - desc = "Looks unstable. Best to test it with the clown." - icon = 'icons/obj/stationobjs.dmi' - icon_state = "portal" - anchored = TRUE - var/mech_sized = FALSE - var/obj/effect/portal/linked - var/hardlinked = TRUE //Requires a linked portal at all times. Destroy if there's no linked portal, if there is destroy it when this one is deleted. - var/creator - var/turf/hard_target //For when a portal needs a hard target and isn't to be linked. - var/atmos_link = FALSE //Link source/destination atmos. - var/turf/open/atmos_source //Atmos link source - var/turf/open/atmos_destination //Atmos link destination - -/obj/effect/portal/anom - name = "wormhole" - icon = 'icons/obj/objects.dmi' - icon_state = "anom" - mech_sized = TRUE - -/obj/effect/portal/Move(newloc) - for(var/T in newloc) - if(istype(T, /obj/effect/portal)) - return FALSE - return ..() - -/obj/effect/portal/attackby(obj/item/W, mob/user, params) - if(user && Adjacent(user)) - teleport(user) - -/obj/effect/portal/Crossed(atom/movable/AM, oldloc) - if(get_turf(oldloc) == get_turf(linked)) - return ..() - if(!teleport(AM)) - return ..() - -/obj/effect/portal/attack_tk(mob/user) - return - -/obj/effect/portal/attack_hand(mob/user) - if(Adjacent(user)) - teleport(user) - -/obj/effect/portal/Initialize(mapload, _creator, _lifespan = 0, obj/effect/portal/_linked, automatic_link = FALSE, turf/hard_target_override, atmos_link_override) - . = ..() - GLOB.portals += src - if(!istype(_linked) && automatic_link) - . = INITIALIZE_HINT_QDEL - CRASH("Somebody fucked up.") - if(_lifespan > 0) - QDEL_IN(src, _lifespan) - if(!isnull(atmos_link_override)) - atmos_link = atmos_link_override - link_portal(_linked) - hardlinked = automatic_link - creator = _creator - if(isturf(hard_target_override)) - hard_target = hard_target_override - -/obj/effect/portal/proc/link_portal(obj/effect/portal/newlink) - linked = newlink - if(atmos_link) - link_atmos() - -/obj/effect/portal/proc/link_atmos() - if(atmos_source || atmos_destination) - unlink_atmos() - if(!isopenturf(get_turf(src))) - return FALSE - if(linked) - if(isopenturf(get_turf(linked))) - atmos_source = get_turf(src) - atmos_destination = get_turf(linked) - else if(hard_target) - if(isopenturf(hard_target)) - atmos_source = get_turf(src) - atmos_destination = hard_target - else - return FALSE - if(!istype(atmos_source) || !istype(atmos_destination)) - return FALSE - LAZYINITLIST(atmos_source.atmos_adjacent_turfs) - LAZYINITLIST(atmos_destination.atmos_adjacent_turfs) - if(atmos_source.atmos_adjacent_turfs[atmos_destination] || atmos_destination.atmos_adjacent_turfs[atmos_source]) //Already linked! - return FALSE - atmos_source.atmos_adjacent_turfs[atmos_destination] = TRUE - atmos_destination.atmos_adjacent_turfs[atmos_source] = TRUE - atmos_source.air_update_turf(FALSE) - atmos_destination.air_update_turf(FALSE) - -/obj/effect/portal/proc/unlink_atmos() - if(istype(atmos_source)) - if(istype(atmos_destination) && !atmos_source.Adjacent(atmos_destination) && !CANATMOSPASS(atmos_destination, atmos_source)) - LAZYREMOVE(atmos_source.atmos_adjacent_turfs, atmos_destination) - atmos_source = null - if(istype(atmos_destination)) - if(istype(atmos_source) && !atmos_destination.Adjacent(atmos_source) && !CANATMOSPASS(atmos_source, atmos_destination)) - LAZYREMOVE(atmos_destination.atmos_adjacent_turfs, atmos_source) - atmos_destination = null - -/obj/effect/portal/Destroy() //Calls on_portal_destroy(destroyed portal, location of destroyed portal) on creator if creator has such call. - if(creator && hascall(creator, "on_portal_destroy")) - call(creator, "on_portal_destroy")(src, src.loc) - creator = null - GLOB.portals -= src - unlink_atmos() - if(hardlinked && !QDELETED(linked)) - QDEL_NULL(linked) - else - linked = null - return ..() - -/obj/effect/portal/proc/teleport(atom/movable/M) - if(!istype(M) || istype(M, /obj/effect) || (istype(M, /obj/mecha) && !mech_sized) || (!isobj(M) && !ismob(M))) //Things that shouldn't teleport. - return - var/turf/real_target = get_link_target_turf() - if(!istype(real_target)) - return FALSE - if(ismegafauna(M)) - message_admins("[M] has used a portal at [ADMIN_COORDJMP(src)] made by [usr].") - if(do_teleport(M, real_target, 0)) - if(istype(M, /obj/item/projectile)) - var/obj/item/projectile/P = M - P.ignore_source_check = TRUE - return TRUE - return FALSE - -/obj/effect/portal/proc/get_link_target_turf() - var/turf/real_target - if(!istype(linked) || QDELETED(linked)) - if(hardlinked) - qdel(src) - if(!istype(hard_target) || QDELETED(hard_target)) - hard_target = null - return - else - real_target = hard_target - linked = null - else - real_target = get_turf(linked) - return real_target - -======= - /proc/create_portal_pair(turf/source, turf/destination, _creator = null, _lifespan = 300, accuracy = 0, newtype = /obj/effect/portal) if(!istype(source) || !istype(destination)) return @@ -311,5 +152,3 @@ else real_target = get_turf(linked) return real_target - ->>>>>>> cc30923... ismecha define (#31192) From b19f88c2dcf036dbdf36f17dea7b585ee133d883 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 2 Oct 2017 17:32:42 -0500 Subject: [PATCH 055/141] Update mineral_doors.dm --- code/game/objects/structures/mineral_doors.dm | 416 ++++++++---------- 1 file changed, 190 insertions(+), 226 deletions(-) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 949da6db09..c767dd1c68 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -1,96 +1,61 @@ -//NOT using the existing /obj/machinery/door type, since that has some complications on its own, mainly based on its -//machineryness - -/obj/structure/mineral_door - name = "metal door" +//NOT using the existing /obj/machinery/door type, since that has some complications on its own, mainly based on its +//machineryness + +/obj/structure/mineral_door + name = "metal door" density = TRUE anchored = TRUE - opacity = TRUE - - icon = 'icons/obj/doors/mineral_doors.dmi' - icon_state = "metal" - - var/initial_state - var/state = 0 //closed, 1 == open - var/isSwitchingStates = 0 - var/close_delay = -1 //-1 if does not auto close. - max_integrity = 200 - armor = list(melee = 10, bullet = 0, laser = 0, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 50, acid = 50) - var/sheetType = /obj/item/stack/sheet/metal - var/sheetAmount = 7 - var/openSound = 'sound/effects/stonedoor_openclose.ogg' - var/closeSound = 'sound/effects/stonedoor_openclose.ogg' - CanAtmosPass = ATMOS_PASS_DENSITY - -/obj/structure/mineral_door/New(location) - ..() - initial_state = icon_state - air_update_turf(1) - -/obj/structure/mineral_door/Destroy() + opacity = TRUE + + icon = 'icons/obj/doors/mineral_doors.dmi' + icon_state = "metal" + + var/initial_state + var/state = 0 //closed, 1 == open + var/isSwitchingStates = 0 + var/close_delay = -1 //-1 if does not auto close. + max_integrity = 200 + armor = list(melee = 10, bullet = 0, laser = 0, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 50, acid = 50) + var/sheetType = /obj/item/stack/sheet/metal + var/sheetAmount = 7 + var/openSound = 'sound/effects/stonedoor_openclose.ogg' + var/closeSound = 'sound/effects/stonedoor_openclose.ogg' + CanAtmosPass = ATMOS_PASS_DENSITY + +/obj/structure/mineral_door/New(location) + ..() + initial_state = icon_state + air_update_turf(1) + +/obj/structure/mineral_door/Destroy() density = FALSE - air_update_turf(1) - return ..() - -/obj/structure/mineral_door/Move() - var/turf/T = loc - ..() - move_update_air(T) - + air_update_turf(1) + return ..() + +/obj/structure/mineral_door/Move() + var/turf/T = loc + ..() + move_update_air(T) + /obj/structure/mineral_door/CollidedWith(atom/movable/AM) - ..() - if(!state) + ..() + if(!state) return TryToSwitchState(AM) - -/obj/structure/mineral_door/attack_ai(mob/user) //those aren't machinery, they're just big fucking slabs of a mineral - if(isAI(user)) //so the AI can't open it - return - else if(iscyborg(user)) //but cyborgs can - if(get_dist(user,src) <= 1) //not remotely though - return TryToSwitchState(user) - -/obj/structure/mineral_door/attack_paw(mob/user) - return TryToSwitchState(user) - -/obj/structure/mineral_door/attack_hand(mob/user) - return TryToSwitchState(user) - + +/obj/structure/mineral_door/attack_ai(mob/user) //those aren't machinery, they're just big fucking slabs of a mineral + if(isAI(user)) //so the AI can't open it + return + else if(iscyborg(user)) //but cyborgs can + if(get_dist(user,src) <= 1) //not remotely though + return TryToSwitchState(user) + +/obj/structure/mineral_door/attack_paw(mob/user) + return TryToSwitchState(user) + +/obj/structure/mineral_door/attack_hand(mob/user) + return TryToSwitchState(user) + /obj/structure/mineral_door/CanPass(atom/movable/mover, turf/target) -<<<<<<< HEAD - if(istype(mover, /obj/effect/beam)) - return !opacity - return !density - -/obj/structure/mineral_door/proc/TryToSwitchState(atom/user) - if(isSwitchingStates) - return - if(isliving(user)) - var/mob/living/M = user - if(world.time - M.last_bumped <= 60) - return //NOTE do we really need that? - if(M.client) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(!C.handcuffed) - SwitchState() - else - SwitchState() - else if(istype(user, /obj/mecha)) - SwitchState() - -/obj/structure/mineral_door/proc/SwitchState() - if(state) - Close() - else - Open() - -/obj/structure/mineral_door/proc/Open() - isSwitchingStates = 1 - playsound(src, openSound, 100, 1) - set_opacity(FALSE) - flick("[initial_state]opening",src) - sleep(10) -======= if(istype(mover, /obj/effect/beam)) return !opacity return !density @@ -124,145 +89,144 @@ set_opacity(FALSE) flick("[initial_state]opening",src) sleep(10) ->>>>>>> cc30923... ismecha define (#31192) density = FALSE - state = 1 - air_update_turf(1) - update_icon() - isSwitchingStates = 0 - - if(close_delay != -1) - addtimer(CALLBACK(src, .proc/Close), close_delay) - -/obj/structure/mineral_door/proc/Close() - if(isSwitchingStates || state != 1) - return - var/turf/T = get_turf(src) - for(var/mob/living/L in T) - return - isSwitchingStates = 1 - playsound(loc, closeSound, 100, 1) - flick("[initial_state]closing",src) - sleep(10) + state = 1 + air_update_turf(1) + update_icon() + isSwitchingStates = 0 + + if(close_delay != -1) + addtimer(CALLBACK(src, .proc/Close), close_delay) + +/obj/structure/mineral_door/proc/Close() + if(isSwitchingStates || state != 1) + return + var/turf/T = get_turf(src) + for(var/mob/living/L in T) + return + isSwitchingStates = 1 + playsound(loc, closeSound, 100, 1) + flick("[initial_state]closing",src) + sleep(10) density = TRUE - set_opacity(TRUE) - state = 0 - air_update_turf(1) - update_icon() - isSwitchingStates = 0 - -/obj/structure/mineral_door/update_icon() - if(state) - icon_state = "[initial_state]open" - else - icon_state = initial_state - -/obj/structure/mineral_door/attackby(obj/item/W, mob/user, params) + set_opacity(TRUE) + state = 0 + air_update_turf(1) + update_icon() + isSwitchingStates = 0 + +/obj/structure/mineral_door/update_icon() + if(state) + icon_state = "[initial_state]open" + else + icon_state = initial_state + +/obj/structure/mineral_door/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/pickaxe)) - var/obj/item/pickaxe/digTool = W - to_chat(user, "You start digging the [name]...") - if(do_after(user,digTool.digspeed*(1+round(max_integrity*0.01)), target = src) && src) - to_chat(user, "You finish digging.") - deconstruct(TRUE) - else if(user.a_intent != INTENT_HARM) - attack_hand(user) - else - return ..() - -/obj/structure/mineral_door/deconstruct(disassembled = TRUE) - var/turf/T = get_turf(src) - if(disassembled) - new sheetType(T, sheetAmount) - else - new sheetType(T, max(sheetAmount - 2, 1)) - qdel(src) - -/obj/structure/mineral_door/iron - name = "iron door" - max_integrity = 300 - -/obj/structure/mineral_door/silver - name = "silver door" - icon_state = "silver" - sheetType = /obj/item/stack/sheet/mineral/silver - max_integrity = 300 - -/obj/structure/mineral_door/gold - name = "gold door" - icon_state = "gold" - sheetType = /obj/item/stack/sheet/mineral/gold - -/obj/structure/mineral_door/uranium - name = "uranium door" - icon_state = "uranium" - sheetType = /obj/item/stack/sheet/mineral/uranium - max_integrity = 300 - light_range = 2 - -/obj/structure/mineral_door/sandstone - name = "sandstone door" - icon_state = "sandstone" - sheetType = /obj/item/stack/sheet/mineral/sandstone - max_integrity = 100 - -/obj/structure/mineral_door/transparent - opacity = FALSE - -/obj/structure/mineral_door/transparent/Close() - ..() - set_opacity(FALSE) - -/obj/structure/mineral_door/transparent/plasma - name = "plasma door" - icon_state = "plasma" - sheetType = /obj/item/stack/sheet/mineral/plasma - -/obj/structure/mineral_door/transparent/plasma/attackby(obj/item/W, mob/user, params) - if(W.is_hot()) - var/turf/T = get_turf(src) - message_admins("Plasma mineral door ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1) - log_game("Plasma mineral door ignited by [key_name(user)] in [COORD(T)]") - TemperatureAct() - else - return ..() - -/obj/structure/mineral_door/transparent/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - TemperatureAct() - -/obj/structure/mineral_door/transparent/plasma/proc/TemperatureAct() - atmos_spawn_air("plasma=500;TEMP=1000") - deconstruct(FALSE) - -/obj/structure/mineral_door/transparent/diamond - name = "diamond door" - icon_state = "diamond" - sheetType = /obj/item/stack/sheet/mineral/diamond - max_integrity = 1000 - -/obj/structure/mineral_door/wood - name = "wood door" - icon_state = "wood" - openSound = 'sound/effects/doorcreaky.ogg' - closeSound = 'sound/effects/doorcreaky.ogg' - sheetType = /obj/item/stack/sheet/mineral/wood - resistance_flags = FLAMMABLE - max_integrity = 200 - -/obj/structure/mineral_door/paperframe - name = "paper frame door" - icon_state = "paperframe" - openSound = 'sound/effects/doorcreaky.ogg' - closeSound = 'sound/effects/doorcreaky.ogg' - sheetType = /obj/item/stack/sheet/paperframes - sheetAmount = 3 - resistance_flags = FLAMMABLE - max_integrity = 20 - -/obj/structure/mineral_door/paperframe/Initialize() - . = ..() - queue_smooth_neighbors(src) - -/obj/structure/mineral_door/paperframe/Destroy() - queue_smooth_neighbors(src) - return ..() + var/obj/item/pickaxe/digTool = W + to_chat(user, "You start digging the [name]...") + if(do_after(user,digTool.digspeed*(1+round(max_integrity*0.01)), target = src) && src) + to_chat(user, "You finish digging.") + deconstruct(TRUE) + else if(user.a_intent != INTENT_HARM) + attack_hand(user) + else + return ..() + +/obj/structure/mineral_door/deconstruct(disassembled = TRUE) + var/turf/T = get_turf(src) + if(disassembled) + new sheetType(T, sheetAmount) + else + new sheetType(T, max(sheetAmount - 2, 1)) + qdel(src) + +/obj/structure/mineral_door/iron + name = "iron door" + max_integrity = 300 + +/obj/structure/mineral_door/silver + name = "silver door" + icon_state = "silver" + sheetType = /obj/item/stack/sheet/mineral/silver + max_integrity = 300 + +/obj/structure/mineral_door/gold + name = "gold door" + icon_state = "gold" + sheetType = /obj/item/stack/sheet/mineral/gold + +/obj/structure/mineral_door/uranium + name = "uranium door" + icon_state = "uranium" + sheetType = /obj/item/stack/sheet/mineral/uranium + max_integrity = 300 + light_range = 2 + +/obj/structure/mineral_door/sandstone + name = "sandstone door" + icon_state = "sandstone" + sheetType = /obj/item/stack/sheet/mineral/sandstone + max_integrity = 100 + +/obj/structure/mineral_door/transparent + opacity = FALSE + +/obj/structure/mineral_door/transparent/Close() + ..() + set_opacity(FALSE) + +/obj/structure/mineral_door/transparent/plasma + name = "plasma door" + icon_state = "plasma" + sheetType = /obj/item/stack/sheet/mineral/plasma + +/obj/structure/mineral_door/transparent/plasma/attackby(obj/item/W, mob/user, params) + if(W.is_hot()) + var/turf/T = get_turf(src) + message_admins("Plasma mineral door ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1) + log_game("Plasma mineral door ignited by [key_name(user)] in [COORD(T)]") + TemperatureAct() + else + return ..() + +/obj/structure/mineral_door/transparent/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 300) + TemperatureAct() + +/obj/structure/mineral_door/transparent/plasma/proc/TemperatureAct() + atmos_spawn_air("plasma=500;TEMP=1000") + deconstruct(FALSE) + +/obj/structure/mineral_door/transparent/diamond + name = "diamond door" + icon_state = "diamond" + sheetType = /obj/item/stack/sheet/mineral/diamond + max_integrity = 1000 + +/obj/structure/mineral_door/wood + name = "wood door" + icon_state = "wood" + openSound = 'sound/effects/doorcreaky.ogg' + closeSound = 'sound/effects/doorcreaky.ogg' + sheetType = /obj/item/stack/sheet/mineral/wood + resistance_flags = FLAMMABLE + max_integrity = 200 + +/obj/structure/mineral_door/paperframe + name = "paper frame door" + icon_state = "paperframe" + openSound = 'sound/effects/doorcreaky.ogg' + closeSound = 'sound/effects/doorcreaky.ogg' + sheetType = /obj/item/stack/sheet/paperframes + sheetAmount = 3 + resistance_flags = FLAMMABLE + max_integrity = 20 + +/obj/structure/mineral_door/paperframe/Initialize() + . = ..() + queue_smooth_neighbors(src) + +/obj/structure/mineral_door/paperframe/Destroy() + queue_smooth_neighbors(src) + return ..() From 08b9a11536d522d3b44b769fcc08b9554ff878e0 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 2 Oct 2017 17:32:54 -0500 Subject: [PATCH 056/141] Update retaliate.dm --- .../hostile/retaliate/retaliate.dm | 50 ------------------- 1 file changed, 50 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index c024cf5556..57df489d4e 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -1,52 +1,3 @@ -<<<<<<< HEAD -/mob/living/simple_animal/hostile/retaliate - var/list/enemies = list() - -/mob/living/simple_animal/hostile/retaliate/Found(atom/A) - if(isliving(A)) - var/mob/living/L = A - if(!L.stat) - return L - else - enemies -= L - else if(istype(A, /obj/mecha)) - var/obj/mecha/M = A - if(M.occupant) - return A - -/mob/living/simple_animal/hostile/retaliate/ListTargets() - if(!enemies.len) - return list() - var/list/see = ..() - see &= enemies // Remove all entries that aren't in enemies - return see - -/mob/living/simple_animal/hostile/retaliate/proc/Retaliate() - var/list/around = view(src, vision_range) - - for(var/atom/movable/A in around) - if(A == src) - continue - if(isliving(A)) - var/mob/living/M = A - if(faction_check_mob(M) && attack_same || !faction_check_mob(M)) - enemies |= M - else if(istype(A, /obj/mecha)) - var/obj/mecha/M = A - if(M.occupant) - enemies |= M - enemies |= M.occupant - - for(var/mob/living/simple_animal/hostile/retaliate/H in around) - if(faction_check_mob(H) && !attack_same && !H.attack_same) - H.enemies |= enemies - return 0 - -/mob/living/simple_animal/hostile/retaliate/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(. > 0 && stat == CONSCIOUS) - Retaliate() -======= /mob/living/simple_animal/hostile/retaliate var/list/enemies = list() @@ -94,4 +45,3 @@ . = ..() if(. > 0 && stat == CONSCIOUS) Retaliate() ->>>>>>> cc30923... ismecha define (#31192) From 3a72023532b020af5422fb6db88b17a9b42bf82c Mon Sep 17 00:00:00 2001 From: ktccd Date: Tue, 3 Oct 2017 02:25:53 +0200 Subject: [PATCH 057/141] Fixes flavor_text and changeling genitals flavor_text is now, again, set from DNA once cloned/podded/whatever. Changelings should do the same, and also get appropriate genitals. Thanks TG, for overwriting this code. But really, thanks Byond, for making extending this functionality so fucking hard. --- code/datums/dna.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 64a1d4ff07..12555ee038 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -28,6 +28,10 @@ destination.dna.temporary_mutations = temporary_mutations.Copy() if(transfer_SE) destination.dna.struc_enzymes = struc_enzymes + if(ishuman(destination)) + var/mob/living/carbon/human/H = destination + H.give_genitals(TRUE)//This gives the body the genitals of this DNA. Used for any transformations based on DNA + destination.flavor_text = destination.dna.features["flavor_text"] //Update the flavor_text to use new dna text /datum/dna/proc/copy_dna(datum/dna/new_dna) new_dna.unique_enzymes = unique_enzymes @@ -227,6 +231,7 @@ if(newfeatures) dna.features = newfeatures + flavor_text = dna.features["flavor_text"] //Update the flavor_text to use new dna text if(mrace) var/datum/species/newrace = new mrace.type From 39ef6130767710a3c53eaf68a1c92cdb8c86257b Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 2 Oct 2017 19:37:03 -0500 Subject: [PATCH 058/141] Update screen_objects.dm --- code/_onclick/hud/screen_objects.dm | 750 +++++++--------------------- 1 file changed, 167 insertions(+), 583 deletions(-) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 7bf73bb297..0906a099a0 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -1,265 +1,39 @@ -/* - Screen objects - Todo: improve/re-implement - - Screen objects are only used for the hud and should not appear anywhere "in-game". - They are used with the client/screen list and the screen_loc var. - For more information, see the byond documentation on the screen_loc and screen vars. -*/ -/obj/screen - name = "" - icon = 'icons/mob/screen_gen.dmi' - layer = ABOVE_HUD_LAYER - plane = ABOVE_HUD_PLANE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - appearance_flags = APPEARANCE_UI - var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. - var/datum/hud/hud = null // A reference to the owner HUD, if any. - -/obj/screen/take_damage() - return - -/obj/screen/Destroy() - master = null - hud = null - return ..() - -/obj/screen/examine(mob/user) - return - -/obj/screen/orbit() - return - -/obj/screen/text - icon = null - icon_state = null +/* + Screen objects + Todo: improve/re-implement + + Screen objects are only used for the hud and should not appear anywhere "in-game". + They are used with the client/screen list and the screen_loc var. + For more information, see the byond documentation on the screen_loc and screen vars. +*/ +/obj/screen + name = "" + icon = 'icons/mob/screen_gen.dmi' + layer = ABOVE_HUD_LAYER + plane = ABOVE_HUD_PLANE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + appearance_flags = APPEARANCE_UI + var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. + var/datum/hud/hud = null // A reference to the owner HUD, if any. + +/obj/screen/take_damage() + return + +/obj/screen/Destroy() + master = null + hud = null + return ..() + +/obj/screen/examine(mob/user) + return + +/obj/screen/orbit() + return + +/obj/screen/text + icon = null + icon_state = null mouse_opacity = MOUSE_OPACITY_TRANSPARENT -<<<<<<< HEAD - screen_loc = "CENTER-7,CENTER-7" - maptext_height = 480 - maptext_width = 480 - -/obj/screen/swap_hand - layer = HUD_LAYER - plane = HUD_PLANE - name = "swap hand" - -/obj/screen/swap_hand/Click() - // At this point in client Click() code we have passed the 1/10 sec check and little else - // We don't even know if it's a middle click - if(world.time <= usr.next_move) - return 1 - - if(usr.incapacitated()) - return 1 - - if(ismob(usr)) - var/mob/M = usr - M.swap_hand() - return 1 - -/obj/screen/craft - name = "crafting menu" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "craft" - screen_loc = ui_crafting - -/obj/screen/craft/Click() - var/mob/living/M = usr - if(isobserver(usr)) - return - M.OpenCraftingMenu() - -/obj/screen/area_creator - name = "create new area" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "area_edit" - screen_loc = ui_building - -/obj/screen/area_creator/Click() - if(usr.incapacitated()) - return 1 - var/area/A = get_area(usr) - if(!A.outdoors) - to_chat(usr, "There is already a defined structure here.") - return 1 - create_area(usr) - -/obj/screen/language_menu - name = "language menu" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "talk_wheel" - screen_loc = ui_language_menu - -/obj/screen/language_menu/Click() - var/mob/M = usr - var/datum/language_holder/H = M.get_language_holder() - H.open_language_menu(usr) - -/obj/screen/inventory - var/slot_id // The indentifier for the slot. It has nothing to do with ID cards. - var/icon_empty // Icon when empty. For now used only by humans. - var/icon_full // Icon when contains an item. For now used only by humans. - layer = HUD_LAYER - plane = HUD_PLANE - -/obj/screen/inventory/Click(location, control, params) - // At this point in client Click() code we have passed the 1/10 sec check and little else - // We don't even know if it's a middle click - if(world.time <= usr.next_move) - return 1 - - if(usr.incapacitated()) - return 1 - if(istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech - return 1 - - if(hud && hud.mymob && slot_id) - var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id) - if(inv_item) - return inv_item.Click(location, control, params) - - if(usr.attack_ui(slot_id)) - usr.update_inv_hands() - return 1 - -/obj/screen/inventory/update_icon() - if(!icon_empty) - icon_empty = icon_state - - if(hud && hud.mymob && slot_id && icon_full) - if(hud.mymob.get_item_by_slot(slot_id)) - icon_state = icon_full - else - icon_state = icon_empty - -/obj/screen/inventory/hand - var/mutable_appearance/handcuff_overlay - var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked") - var/held_index = 0 - -/obj/screen/inventory/hand/update_icon() - ..() - - if(!handcuff_overlay) - var/state = (!(held_index % 2)) ? "markus" : "gabrielle" - handcuff_overlay = mutable_appearance('icons/mob/screen_gen.dmi', state) - - cut_overlays() - - if(hud && hud.mymob) - if(iscarbon(hud.mymob)) - var/mob/living/carbon/C = hud.mymob - if(C.handcuffed) - add_overlay(handcuff_overlay) - - if(held_index) - if(!C.has_hand_for_held_index(held_index)) - add_overlay(blocked_overlay) - - if(held_index == hud.mymob.active_hand_index) - add_overlay("hand_active") - - -/obj/screen/inventory/hand/Click(location, control, params) - // At this point in client Click() code we have passed the 1/10 sec check and little else - // We don't even know if it's a middle click - if(world.time <= usr.next_move) - return 1 - if(usr.incapacitated() || isobserver(usr)) - return 1 - if (istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech - return 1 - - if(hud.mymob.active_hand_index == held_index) - var/obj/item/I = hud.mymob.get_active_held_item() - if(I) - I.Click(location, control, params) - else - hud.mymob.swap_hand(held_index) - return 1 - -/obj/screen/close - name = "close" - -/obj/screen/close/Click() - if(istype(master, /obj/item/storage)) - var/obj/item/storage/S = master - S.close(usr) - return 1 - - -/obj/screen/drop - name = "drop" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "act_drop" - layer = HUD_LAYER - plane = HUD_PLANE - -/obj/screen/drop/Click() - usr.drop_item_v() - -/obj/screen/act_intent - name = "intent" - icon_state = "help" - screen_loc = ui_acti - -/obj/screen/act_intent/Click(location, control, params) - usr.a_intent_change(INTENT_HOTKEY_RIGHT) - -/obj/screen/act_intent/segmented/Click(location, control, params) - if(usr.client.prefs.toggles & INTENT_STYLE) - var/_x = text2num(params2list(params)["icon-x"]) - var/_y = text2num(params2list(params)["icon-y"]) - - if(_x<=16 && _y<=16) - usr.a_intent_change(INTENT_HARM) - - else if(_x<=16 && _y>=17) - usr.a_intent_change(INTENT_HELP) - - else if(_x>=17 && _y<=16) - usr.a_intent_change(INTENT_GRAB) - - else if(_x>=17 && _y>=17) - usr.a_intent_change(INTENT_DISARM) - else - return ..() - -/obj/screen/act_intent/alien - icon = 'icons/mob/screen_alien.dmi' - screen_loc = ui_movi - -/obj/screen/act_intent/robot - icon = 'icons/mob/screen_cyborg.dmi' - screen_loc = ui_borg_intents - -/obj/screen/internals - name = "toggle internals" - icon_state = "internal0" - screen_loc = ui_internal - -/obj/screen/internals/Click() - if(!iscarbon(usr)) - return - var/mob/living/carbon/C = usr - if(C.incapacitated()) - return - - if(C.internal) - C.internal = null - to_chat(C, "You are no longer running on internals.") - icon_state = "internal0" - else - if(!C.getorganslot("breathing_tube")) - if(!istype(C.wear_mask, /obj/item/clothing/mask)) - to_chat(C, "You are not wearing an internals mask!") - return 1 - else - var/obj/item/clothing/mask/M = C.wear_mask - if(M.mask_adjusted) // if mask on face but pushed down - M.adjustmask(C) // adjust it back -======= screen_loc = "CENTER-7,CENTER-7" maptext_height = 480 maptext_width = 480 @@ -484,219 +258,30 @@ var/obj/item/clothing/mask/M = C.wear_mask if(M.mask_adjusted) // if mask on face but pushed down M.adjustmask(C) // adjust it back ->>>>>>> cc30923... ismecha define (#31192) if( !(M.flags_1 & MASKINTERNALS_1) ) - to_chat(C, "You are not wearing an internals mask!") - return - - var/obj/item/I = C.is_holding_item_of_type(/obj/item/tank) - if(I) - to_chat(C, "You are now running on internals from the [I] on your [C.get_held_index_name(C.get_held_index_of_item(I))].") - C.internal = I - else if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(istype(H.s_store, /obj/item/tank)) - to_chat(H, "You are now running on internals from the [H.s_store] on your [H.wear_suit].") - H.internal = H.s_store - else if(istype(H.belt, /obj/item/tank)) - to_chat(H, "You are now running on internals from the [H.belt] on your belt.") - H.internal = H.belt - else if(istype(H.l_store, /obj/item/tank)) - to_chat(H, "You are now running on internals from the [H.l_store] in your left pocket.") - H.internal = H.l_store - else if(istype(H.r_store, /obj/item/tank)) - to_chat(H, "You are now running on internals from the [H.r_store] in your right pocket.") - H.internal = H.r_store - + to_chat(C, "You are not wearing an internals mask!") + return + + var/obj/item/I = C.is_holding_item_of_type(/obj/item/tank) + if(I) + to_chat(C, "You are now running on internals from the [I] on your [C.get_held_index_name(C.get_held_index_of_item(I))].") + C.internal = I + else if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(istype(H.s_store, /obj/item/tank)) + to_chat(H, "You are now running on internals from the [H.s_store] on your [H.wear_suit].") + H.internal = H.s_store + else if(istype(H.belt, /obj/item/tank)) + to_chat(H, "You are now running on internals from the [H.belt] on your belt.") + H.internal = H.belt + else if(istype(H.l_store, /obj/item/tank)) + to_chat(H, "You are now running on internals from the [H.l_store] in your left pocket.") + H.internal = H.l_store + else if(istype(H.r_store, /obj/item/tank)) + to_chat(H, "You are now running on internals from the [H.r_store] in your right pocket.") + H.internal = H.r_store + //Separate so CO2 jetpacks are a little less cumbersome. -<<<<<<< HEAD - if(!C.internal && istype(C.back, /obj/item/tank)) - to_chat(C, "You are now running on internals from the [C.back] on your back.") - C.internal = C.back - - if(C.internal) - icon_state = "internal1" - else - to_chat(C, "You don't have an oxygen tank!") - return - C.update_action_buttons_icon() - -/obj/screen/mov_intent - name = "run/walk toggle" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "running" - -/obj/screen/mov_intent/Click() - toggle(usr) - -/obj/screen/mov_intent/proc/toggle(mob/user) - if(isobserver(user)) - return - switch(user.m_intent) - if("run") - user.m_intent = MOVE_INTENT_WALK - icon_state = "walking" - if("walk") - user.m_intent = MOVE_INTENT_RUN - icon_state = "running" - user.update_icons() - -/obj/screen/pull - name = "stop pulling" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "pull" - -/obj/screen/pull/Click() - if(isobserver(usr)) - return - usr.stop_pulling() - -/obj/screen/pull/update_icon(mob/mymob) - if(!mymob) return - if(mymob.pulling) - icon_state = "pull" - else - icon_state = "pull0" - -/obj/screen/resist - name = "resist" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "act_resist" - layer = HUD_LAYER - plane = HUD_PLANE - -/obj/screen/resist/Click() - if(isliving(usr)) - var/mob/living/L = usr - L.resist() - -/obj/screen/storage - name = "storage" - -/obj/screen/storage/Click(location, control, params) - if(world.time <= usr.next_move) - return 1 - if(usr.stat || usr.IsUnconscious() || usr.IsKnockdown() || usr.IsStun()) - return 1 - if (istype(usr.loc, /obj/mecha)) // stops inventory actions in a mech - return 1 - if(master) - var/obj/item/I = usr.get_active_held_item() - if(I) - master.attackby(I, usr, params) - return 1 - -/obj/screen/throw_catch - name = "throw/catch" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "act_throw_off" - -/obj/screen/throw_catch/Click() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - C.toggle_throw_mode() - -/obj/screen/zone_sel - name = "damage zone" - icon_state = "zone_sel" - screen_loc = ui_zonesel - var/selecting = "chest" - -/obj/screen/zone_sel/Click(location, control,params) - if(isobserver(usr)) - return - - var/list/PL = params2list(params) - var/icon_x = text2num(PL["icon-x"]) - var/icon_y = text2num(PL["icon-y"]) - var/choice - - switch(icon_y) - if(1 to 9) //Legs - switch(icon_x) - if(10 to 15) - choice = "r_leg" - if(17 to 22) - choice = "l_leg" - else - return 1 - if(10 to 13) //Hands and groin - switch(icon_x) - if(8 to 11) - choice = "r_arm" - if(12 to 20) - choice = "groin" - if(21 to 24) - choice = "l_arm" - else - return 1 - if(14 to 22) //Chest and arms to shoulders - switch(icon_x) - if(8 to 11) - choice = "r_arm" - if(12 to 20) - choice = "chest" - if(21 to 24) - choice = "l_arm" - else - return 1 - if(23 to 30) //Head, but we need to check for eye or mouth - if(icon_x in 12 to 20) - choice = "head" - switch(icon_y) - if(23 to 24) - if(icon_x in 15 to 17) - choice = "mouth" - if(26) //Eyeline, eyes are on 15 and 17 - if(icon_x in 14 to 18) - choice = "eyes" - if(25 to 27) - if(icon_x in 15 to 17) - choice = "eyes" - - return set_selected_zone(choice, usr) - -/obj/screen/zone_sel/proc/set_selected_zone(choice, mob/user) - if(isobserver(user)) - return - - if(choice != selecting) - selecting = choice - update_icon(usr) - return 1 - -/obj/screen/zone_sel/update_icon(mob/user) - cut_overlays() - add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[selecting]")) - user.zone_selected = selecting - -/obj/screen/zone_sel/alien - icon = 'icons/mob/screen_alien.dmi' - -/obj/screen/zone_sel/alien/update_icon(mob/user) - cut_overlays() - add_overlay(mutable_appearance('icons/mob/screen_alien.dmi', "[selecting]")) - user.zone_selected = selecting - -/obj/screen/zone_sel/robot - icon = 'icons/mob/screen_cyborg.dmi' - - -/obj/screen/flash - name = "flash" - icon_state = "blank" - blend_mode = BLEND_ADD - screen_loc = "WEST,SOUTH to EAST,NORTH" - layer = FLASH_LAYER - plane = FULLSCREEN_PLANE - -/obj/screen/damageoverlay - icon = 'icons/mob/screen_full.dmi' - icon_state = "oxydamageoverlay0" - name = "dmg" - blend_mode = BLEND_MULTIPLY - screen_loc = "CENTER-7,CENTER-7" -======= if(!C.internal && istype(C.back, /obj/item/tank)) to_chat(C, "You are now running on internals from the [C.back] on your back.") C.internal = C.back @@ -883,120 +468,119 @@ name = "dmg" blend_mode = BLEND_MULTIPLY screen_loc = "CENTER-7,CENTER-7" ->>>>>>> cc30923... ismecha define (#31192) mouse_opacity = MOUSE_OPACITY_TRANSPARENT - layer = UI_DAMAGE_LAYER - plane = FULLSCREEN_PLANE - -/obj/screen/healths - name = "health" - icon_state = "health0" - screen_loc = ui_health - -/obj/screen/healths/alien - icon = 'icons/mob/screen_alien.dmi' - screen_loc = ui_alien_health - -/obj/screen/healths/robot - icon = 'icons/mob/screen_cyborg.dmi' - screen_loc = ui_borg_health - -/obj/screen/healths/deity - name = "Nexus Health" - icon_state = "deity_nexus" - screen_loc = ui_deityhealth - -/obj/screen/healths/blob - name = "blob health" - icon_state = "block" - screen_loc = ui_internal + layer = UI_DAMAGE_LAYER + plane = FULLSCREEN_PLANE + +/obj/screen/healths + name = "health" + icon_state = "health0" + screen_loc = ui_health + +/obj/screen/healths/alien + icon = 'icons/mob/screen_alien.dmi' + screen_loc = ui_alien_health + +/obj/screen/healths/robot + icon = 'icons/mob/screen_cyborg.dmi' + screen_loc = ui_borg_health + +/obj/screen/healths/deity + name = "Nexus Health" + icon_state = "deity_nexus" + screen_loc = ui_deityhealth + +/obj/screen/healths/blob + name = "blob health" + icon_state = "block" + screen_loc = ui_internal mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/screen/healths/blob/naut - name = "health" - icon = 'icons/mob/blob.dmi' - icon_state = "nauthealth" - -/obj/screen/healths/blob/naut/core - name = "overmind health" - screen_loc = ui_health - icon_state = "corehealth" - -/obj/screen/healths/guardian - name = "summoner health" - icon = 'icons/mob/guardian.dmi' - icon_state = "base" - screen_loc = ui_health + +/obj/screen/healths/blob/naut + name = "health" + icon = 'icons/mob/blob.dmi' + icon_state = "nauthealth" + +/obj/screen/healths/blob/naut/core + name = "overmind health" + screen_loc = ui_health + icon_state = "corehealth" + +/obj/screen/healths/guardian + name = "summoner health" + icon = 'icons/mob/guardian.dmi' + icon_state = "base" + screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/screen/healths/clock - icon = 'icons/mob/actions.dmi' - icon_state = "bg_clock" - screen_loc = ui_health + +/obj/screen/healths/clock + icon = 'icons/mob/actions.dmi' + icon_state = "bg_clock" + screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/screen/healths/clock/gear - icon = 'icons/mob/clockwork_mobs.dmi' - icon_state = "bg_gear" - screen_loc = ui_internal - -/obj/screen/healths/revenant - name = "essence" - icon = 'icons/mob/actions.dmi' - icon_state = "bg_revenant" - screen_loc = ui_health + +/obj/screen/healths/clock/gear + icon = 'icons/mob/clockwork_mobs.dmi' + icon_state = "bg_gear" + screen_loc = ui_internal + +/obj/screen/healths/revenant + name = "essence" + icon = 'icons/mob/actions.dmi' + icon_state = "bg_revenant" + screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/screen/healths/construct - icon = 'icons/mob/screen_construct.dmi' - icon_state = "artificer_health0" - screen_loc = ui_construct_health + +/obj/screen/healths/construct + icon = 'icons/mob/screen_construct.dmi' + icon_state = "artificer_health0" + screen_loc = ui_construct_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/screen/healthdoll - name = "health doll" - screen_loc = ui_healthdoll - -/obj/screen/splash - icon = 'config/title_screens/images/title1.dmi' - icon_state = "" - screen_loc = "1,1" - layer = SPLASHSCREEN_LAYER - plane = SPLASHSCREEN_PLANE - var/client/holder - -/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE - holder = C - - if(!visible) - alpha = 0 - - if(!use_previous_title) - if(SStitle.icon) - icon = SStitle.icon - else - if(!SStitle.previous_icon) - qdel(src) - return - icon = SStitle.previous_icon - - holder.screen += src - - ..() - -/obj/screen/splash/proc/Fade(out, qdel_after = TRUE) - if(QDELETED(src)) - return - if(out) - animate(src, alpha = 0, time = 30) - else - alpha = 0 - animate(src, alpha = 255, time = 30) - if(qdel_after) - QDEL_IN(src, 30) - -/obj/screen/splash/Destroy() - if(holder) - holder.screen -= src - holder = null - return ..() + +/obj/screen/healthdoll + name = "health doll" + screen_loc = ui_healthdoll + +/obj/screen/splash + icon = 'config/title_screens/images/title1.dmi' + icon_state = "" + screen_loc = "1,1" + layer = SPLASHSCREEN_LAYER + plane = SPLASHSCREEN_PLANE + var/client/holder + +/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE + holder = C + + if(!visible) + alpha = 0 + + if(!use_previous_title) + if(SStitle.icon) + icon = SStitle.icon + else + if(!SStitle.previous_icon) + qdel(src) + return + icon = SStitle.previous_icon + + holder.screen += src + + ..() + +/obj/screen/splash/proc/Fade(out, qdel_after = TRUE) + if(QDELETED(src)) + return + if(out) + animate(src, alpha = 0, time = 30) + else + alpha = 0 + animate(src, alpha = 255, time = 30) + if(qdel_after) + QDEL_IN(src, 30) + +/obj/screen/splash/Destroy() + if(holder) + holder.screen -= src + holder = null + return ..() From c8f52d272ed98ef1430fe188bb21e8d32174d111 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 3 Oct 2017 00:18:21 -0500 Subject: [PATCH 059/141] donation item --- code/citadel/custom_loadout/custom_items.dm | 11 ++++++++--- icons/mob/suit.dmi | Bin 324469 -> 325495 bytes icons/obj/clothing/suits.dmi | Bin 109587 -> 109831 bytes 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/code/citadel/custom_loadout/custom_items.dm b/code/citadel/custom_loadout/custom_items.dm index 9777d564e1..736d38d41a 100644 --- a/code/citadel/custom_loadout/custom_items.dm +++ b/code/citadel/custom_loadout/custom_items.dm @@ -55,6 +55,12 @@ item_color = "zombscarf" dog_fashion = /datum/dog_fashion/head +/obj/item/clothing/suit/toggle/labcoat/mad/red + name = "\improper The Mad's labcoat" + desc = "An oddly special looking coat." + icon_state = "labred" + item_state = "labred" + /*PLACEHOLDER*/ @@ -118,9 +124,8 @@ icon_state = "hos-g" item_state = "hos-g" body_parts_covered = CHEST|GROIN|ARMS|LEGS - - -/*Slomek*/ + + /*Slomek*/ /obj/item/reagent_containers/food/drinks/flask/russian name = "russian flask" diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 13141a4d4e2acbeb14aa0d70d42a480798ca49ca..9ec6c06c9fa2ecba594432076eb6966dc91273af 100644 GIT binary patch delta 9560 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 delta 8657 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 Y%7#L5|Glh$Spd2eWmR63NE?6pKeh?tx&QzG diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 53930d778c3f7d541c2761fb51a0dc4ab1e17ef6..9d9801f3a2f692191ff897a06d7203aa31afb1c6 100644 GIT binary patch delta 15406 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 DcX|AJ delta 15161 zcmbWeWk3|)8#cUvq)14EG)PLwkCw7fkdW?>?(P^`q#Nn(lJ1i3?(VLoVcC7g|NDM; zK0oKnGG~XGIdjLk?)$p-=OS9{JX#b3Qhp_4JSy1<0ychevO9D;mNK^1wu*Re6A?E@ zJi9~fKZjaBhl*5T0aQ8NCQjHb z_o3RMOJp-+V`t)6>xqAg`V$xs70wXAAd@hfe#-6z07}J^>KN)xn0l>aQ*v{yP9>u! zvIV1!d+8qK7d1LQQ{FM^)y9=3HdsDF$ueJuQ0j`U6egjCKt)Mjd0j$BrXI4tUy`dn zvaZ*)GOk$hYlLG9>_O8LdMfq{>bM82dZTuouJzyFz7Epn`NOwSm zRTTRW87;X3I=Lspi?U`J7EmJo_Qy;x~!{bsv^oG#!viIffIhaY6|PoxC=b zI)T@*n5wFCJjTy_N{4eqN|biWNs(un_u_6u@|NWANePE*LJJ`Fc&W`lnNF$FbE$>I zAF@zfUELMtlCfWNF_Y37G74JEvgd2R`=p%ewR6isO~c9mvt_vsC`Gtwrkk5aL`gnM z#J(;Bt}EKFsq%ti6nkZ^5=u+iH;#@%Crk|o<5*grZkAxz6@W+{{`s_`9JkRRA+JJn zO^wq0AjX$3U*z}JT0L8QM(M3G)2fsgSvp-=SiBG(*m1D(I5Ec?2y@VT8QC_=XEn16 zD4*{6`1m$AH?tGQ2vOc3QqJn$x?h<>LZoDYsO03u(-y5dZK|jU*T=@<%X6$5qI`~{ zF{k@Mp^&wx>IW9NzmpU6{a>v#FSbS8pXKJqPAziG9xn2F#d#I4i&Zap_F_YTv}pTk z9bV)r3$J;l?-K_}hrW^Wqil0CNy01T1S{THj4yS_?%iG8UxF{MRK5DnwMQ~oh2j91 zU9z@Oc4nNOn}N=#>Vgg`)lR<-oI!~QIlDz7TRNbLR9hb_-%Sc=nb1|;G5CK#i}qm8 z7~cAv;!a%(Y)eQ;45y2v%;^GY=v1zmvH#zzayeb5a>IP^iHnJ$GkITQU*M9bRz~C` zqbws?@1={NLZQ>ed?+zf-p&Cyk~7O8@^Q`3)BT;!!qC^YwnvfXvOaJI6or`6Fj8)0 zF)=aL`ZA*0+FDn4ckms)H!z^rj%Nd>I5;>2goJL`c-F*+&TxztGTuI%HNdHT!t?5g zOR|}lBIwU~vS8@%;Wqt^aH4eN+1&g~MCoB1l&60RDI|-lv)9WGaB}Lgi5Y&1Y3rRo&+sT~-%fU+DY#LR4;>o(0ePyc3t{ zT#_X#I1y$Ie?`sqIU-WITySrjP3oNhyTYsGhn&L))r3cuvr~U$frjfo=ec>ms;aj$ zwUnf!^Rf%bCvjXIl?Hu~rc`P%k{y?ylNB~?OM_u-#_9RBz={0lMM}vPlSLFgoBLTi zh};BU43PhUY^s?S9VncgDf zF?MVkO(3?DWF#jdnqeWT(5aBDm}8rGsFR18gnRb%;BpPC`{io{2};A3-xshTYtjbD z#~%#DGASFC9HZ)sAalNXqr8NrpR)ewn*gweNCDfBhUsagZ5YC83i+mcX)L}F-#d=% zaM5T>@#V#KzN$Ff%-TL;00`mB!>y8BC+l$M7tbpVyPF$d__F`z#fulM5!+`nZ6VdZ zR3~T{&@a~7WN^+q_JGHt`Sn(Z;Onaur~mVl(9qEffS*)hvJ zaXVN!*&ZQ%If{PI7*(5%X4*gEu=qQT-5mXI<`1KTT6>8>DyuO za!(H`E-tQ=wDjYNH?`?~0Ua-I{P=n&U`{MvFbGZeex6-1%wAJj=AzDwpa=x7?@x$?SN<93sCaNrpk84+o!D>!kNvhjOxUuu)= zss^_*DsMf^0kNmQO`M{AD>-lOUUaN<#e%uDycv$hi<184zI6!w{Q6uWGA#{o+Shtx z4yAU{72I4H7zj*Appu1O`A3-fu(7c%?O@6ey1BW1l$2c3@>a6UwYAVjGb0KvXxfpC zh-7r!ry)Q5Mt56y!rw!NaqrJbN*kxwp}4`z{!)@NQj`fUNJJcpijMA9I&MeuC3fJW zmzPL-dU{+!!shzAPtW9~Q~w^|=V_7b%n?&1xyD#ky=22tZMW5nb3#=YdhuObKYN&l zt>Mt#A+gi-#*k*a0^Fpi8tBB|HBbA$THl%-_Ngg<%&?W9#LwB$hS+Eyc4kB+J}fBPm~s_pa&C7KG5NE}OLj7tUXz!+)paJ4rD zLjD6INPckev%t;#uhUzOcILCF!>Q8JlB`WbR1zi~Mr~1t1lQe(_I3V#T+owPkIYHA zq1oO;?I6hL?!pyYF2HZu#GG&S;BSXPpARK+)*syB6H&1I_$;ZYuG2G+tzaLy`=JCm zA|%{U-jt>dE^3$$7#nb+=+SKBw&?}Pw?Gh==Of3mZ`RjmsfCSD9j^{OkTc8wton|D z?o+)G#_)A}Z;ybC>=zz#nyjROL5{ZbE`{m63B?C`gBcUwD!#QQPtn14L3Rb^?@wbj zZJNz63Fq5B=kF$=GCt-O7Bf4*_4PFdZByz|y$UQoKK=<<#Wsz|VCZ!h(zC3Rx1M#O zK>yP*CU!l7$@f##~|W%_!s>_ z%;qM4>kWV-C7-$ZpbCY|3*mHVBnb%!IEEbA+S@Bg?o%#h;6lgvB6g_b<5X35F2A?E zB|67GcR&v;Z+NO`Xe(c8S_SbjCRLj{Ss90O*{67(8}xRjAp>Em}W@- zyyoP@^|@UG)*jq7$44heM3O5SR+@(a!Axd-il#Mm4evz9T9zoNXajW$Bn?Yavd=qB zY;MOQRfPExe&$U(c2E5YhcFC$>xwI5Pf?1xx^e~v2F*p|4-f7$^Gez9F~bl&&B-Gw zHn&p=9RwT%Gesd4CGMJ+9`V#dhG7p}?Vh{r8~fY2y^LxBnbY#`JAcvDaspr&8WC)L z_`V6Ia^!XRa4Aat z=`v^3?N@?iuU5Td&f`97<$k<7%zBt-_L-`X>@g-suKk>qz)hvh-^BlSbQ zSW_?LkJFJ#G;E6Vcp>F|QPxN8h(gQv(-S=UM?T#P)g~EGOiSDzo50|Z5ISR+d|f#L z>BwLa5fKkxXyQb9(@r@!3KVn^4Q^YV~x zFp*y|-;G7# znKr<*z!OOs2?aQb`@`_{m8j?ZYbn>v9Sc~SJRg$1g9AM?^Or-l3T9|T3aUDr>yZa@ zYFSW6Bfr^&u;c)jnihizo#LvTGQdFq-U%%b4Oy@B%?H8Jk&&IIqjH0lCa1kxST!o+ zwV8`rM!geXjc-E5#p8w&R+E93O9;$T5xSB^1|c`$1$dQtx2Z;$Sosu0&_;hlDZy-p zl9ZIBJ;4C;RPH@4p83ZquA z0H7nicoBX{%CD-rv3tlWt6DI@Gn!=j>3`E}obJ@r-wkRB3?-8_HU9Gg^0WR8yS9n6 zl(mr=@$R%%oE#9@^pBRM|H{H%H15bd^Q;+Ls>^qwY8}t=3A}SqQgop+Yo1}$m=5{ zx?h^TXG^J8&KB7Kli+5XHg(7`Y@>NMtn}DHp)KgMYIjf1uZD&O4j^ZBV?DeO{M;d?rk^!ivw^-5G!+uOP|G7_VC z?)sYxW~&Zo6I;f~6|3nFFwy&PxR4*7roOpzA2P2rpJ4?=brD@=XFykNVyLEdW1yI} zlSBIhba03h6KG9e&y>Ij4b+Ws@e6$}+0CsC+)w&mA8lv?)UPID<$M;xqMIYbhComG1ElMmqO|L zz;SxSu{i1w!slhOQ>;wKDiqSP{O%>kD|GQs>U(9K4)&3icL|!uH)6W!3^vX??SEuk z9Flqs+OuP48%^ocV`O<60 z)~O1R)3=y@>Bs0E*#-VlxdP3=nNjX3&aMV)Qc{ZR>xs=d$BiK1A8w7}*HsH0og*pA zL*3X9Zmd#RzMT)B+@rXyT3<9Xd^G~mTT7Su0qYiQJsjJ8anw`nlu>1JR-r@|Uh^N{ z#vZWK<@B6b-usx8(uIKt`E?kj%y#heJ35wMA<3+-v{Nr8jv9^O@9c)0o+p>5yOa$z z(jk;e-H*AWZ_WS|+sr17vdG&TG`(%!IoqM0^NA&aC+k%#sRM39< zW!v%5?d|PiJv}{q(Rs{>>=3$C*3+Duzx*sud_i~!y!TJ{iu})EA8ejAg#P}Gi!`6=hAttYy0OJ0X=uzLe?~!YSyWiO*lpZJ99NeFB)MQ{ zk|D9Fmc3LRZSl+BHHO+>ez|{x%1LeW<3~`573(0YDKRleqa*9Tb8fhh2V?Q9zh{;8 zeL7U^f5RFVv`h!i-28`Jm8hE4e=AoizmsTln?qZV!L`vot}_`OkLVfWh9=*JD3Q+E%S-+hmb?-E<}lzljF zElZtGdv98pu@lj3`00LLHas-EE%ZpASTah7yR1iW-`@h~>qlrG-aE;?^Z& zeHoC-YH0br3H@O_I$t_VqD&Ya6aW7Er)Uj+hhF1aD=8Hz)%qjGDrg25tuH3QOVhXB z*y6^!l%xO-$xs4Wz{Q?zbdno7M5Z@#rml*1ef8{YJvJ9$u-h4C`%_c1&Me4vQf1a1 z5!|yf;vd)gDEQ}$=1~!c<`n}S9lf2s{q|sz>L2?V))Y9-yX9r29o(u(Rh?NQTz>v$ z7+h$ObM3UCZ8X3Wc^3=0Jm^kkr~Ss@?f}y*QNB+aQ~SH`#Dzk3cJ_J!lio?6ee)eY zo~;wpn6DM^F!gYVE>b16d-wH6)F_e*dz^67cf~cIM2{tvpHd6$dA{zi1kCE@9a-1Q zRL=+%Ia`Bn*L3=1>UI8J-oCMzh@{-O>r3Lfzv`Lm{=~0CpGPg|ccJG#6k3AVxP!%> zIqbDo3p$>YB)q$msCcY2ngY7zgq`Kp?PJb^ZF^;aFEosTN!zXGM>-M^2o2=xM+qel z%=62w!IJVHV-Xnxi|rX3TfN*~v)^>wPTi2v(76x%qBpaXc=FQ3PBUw|#Z3*L8T9t> zYxBD3L`trMU_%k8v&5&RrOhqVjqGw+;~pFe?c(MA2D?%eO%_SH_eXbV$VVF@Qssg! zTCe~d9J|FO1sLXIyH zG1DaXQCu9-emdXFuUUt;eG-(_>B^hTuwxV;?&HE@621TM9F+#l2BaU*kkQKD2;Mxr2Y4CyLr zqnc-}KSfQs@|)Zv_KX&~F-Z5%bR{kzO3KRIZ&pKB$Yj6{Maf=ub@i`^h+VLM$9(c& z0NEya#|omR)Gq}R=9?RgKfjC&Z^hsA-`_NRpR$}_L8JqJpJqpgc;npD@YedJx{`WCL39RlJmAynMV1A2D%jJmY;DvvacN>S6t0?@7I`&PoWnN`W357st?t zBPL!aq{<#&glHb(g+Q3SU&ZX$=pC&XAi>qANmb+&(HI!;;~;%oIMt0ih3j|=B( z>hUG@pLl-L74;XVeZu!k4lb9ghmyajgb021vp%?Or2(31wnJ*GPp(Wwx;7s$eCw;r zhaS^H0z<76%n!}E=4L09REK(gDF!mA7Zx)cJU!G3px-$xt+?Qmh{Y^Epe2aF+f&&q z49}x5$~7B&P}GxJ9wwzrweK9=ri_KIj~3Xt(;tEBcIY5 z{|5JlB_+5xfPjE#QbAdnh$P&;YfUiYtKDd+ZhQLivE^)qZUs5Y#Kgpt3cP@hi!16= z#hdJg7B#0QO*TYFM~Cx?jn)-MsP*EEq!~~(iG$TtoCf7|b1GQeY|S-0v;*yniPePV zum8LgSLeO_xbn&A6bWcHW~)bUVX?D2uoLsFBcSYqot?8jY!2W4JQ8nTOUo2=fvT#Q z#bk4^uy|mF*2I;X=T{aLO_dlbUmkFZ;%)@GP(`mb`x;ru;Q@GfK5aXa zYJ9jQeV-AS4H_y?^vR_;wn4G=L!GrMO%y#4w7(nYnVs?ljazJA(Fg8F%+~KkR7P2> zM8X{Ng~PRWFkNhy2JK1rTLNt z$q9|18#*xX{OEyEv4CRW>Ht8OkAIwCqBft~-H*jB`i$HG&Pf(fEO0hrg%Web5fAIq zqzQcg7TSYM3~mwE11HDZ-xL)Ih(kM8Mkv3=+#U2$@=-pqPLyvW*a+k`tMn(?x5h&jn__)1t&>L9fP!> zx|wIgZW7GsNVi*cuh%!#a_>HrLt^jny_p^N?Xo+6PPTz7bfbXf4aeub!@sakiMBLM zfF^5c*=C^8bG6%@$Dq=#l&gQ2;@9$Ui)>5PBwjo9-k^R>Kt2{esYhui01 z-A}kO29FWu&eltvS;yZzpI{B!RYeT4*Sk+H+ra*sWV#x|tYhc_Rsnxl;Ss z=-mAztTkkjm6e6^XnkFHT`L@Ba<_rr*0M_u0)~#GF#yQl z6+;LbJ;MK7&1C!*%=0O0CoFW5&X2D=EIdZS2$MA&sCm08g(Co-az4BjNkA$ZH@Vd} z-PHJ;7&??l(SW!K#Kt@~KJ^QL(vxMq8 zpUXMh4SynXuJDX&CVs7$!jY&SJF?^0EnyFlw6&l0McGev5@>E1pPmlzk41U&=FJn; zwaZ5`FHLI6<&9aZ=JLV4V$ZLNw^ zsH;Gm8Ss%~V`cbs&jzmD!lvBlI)o(PXFZA23~#BcuCu=G{hstf``F*HHOqfhod8Yb zH*ZkcaC25|J3vGNAfL}9C>51Aq2bzarn~)!c0C!XZ9V;WzWSF$-0FHuY@?weMO7ih+uQs>G#u6LWYO%j z7jbbRzJ#H~;@={=GCOE;#EE(``}9+Cu#);;K>Mdscc=h^x>;9umCi@-4_!YYR#cEY zYY;*P+yP~|e~ zVf&`m?C133)krlp6PVT+dxbzl>Vt;#tTKKp?0meR^S(5ZFj2Il*vfx;D@RVWyA|YZ zT5|!jTFU6p(KSTH!FG^PD+w7HW`B^4lM`=IQ4zL{TRO;T7MGML`>UCe;Nj75 z;vVA~QRLC*+3hym49JiF$PGRfBejvIuKAGpF5)IpkhKsmMwynjd7k| zRu7!nP9+$cO(ks0Uayree~kUJzF!<0K`s1wxqreiH}B<3;$GY%{w?+aKAFj&>nAvV z%k42wfUuzL5(*;n!&%F~vL?ypP6+NjGzZt!cENsdh%GpTaug7A#buI|++B8Kas$4y zsk<&&F_fuI=w6_3P_O5evR`|I-QEzNeh4bui^FI3d5og9-N#!a$DXW5`_Q*^l~hW- zMAz_B_o0yVMJJ8=B1txJIpxNV*jIl=^wXmY1ULB%m*d01KU8ERT1&h2T_>F+d zbT>5F7b&-NMwXWwTJuRb`Yq!K>is#Bh8X$zmD3^aU4A`1vVHp<<)aq+<=j66T~8>T zUdL#o0sWUYy9cD3T-RCyF7gk%!!L31Ve87I*crD+!hd=v9}H#Eqk*8~Su%c?laC8G#)p@7n=AuJx0Xa2E^qsDc8fnVA_k7oE)Eiu{$VXrYOCUG@XMxpZe~gor-}H5kD|W%Vy_4oiIAA(youas1Ws zivNpF9grt&#Zf_jtF_VZur`=*4Z>^tK4IhZN4^-Qa$tCm^YMfued)9@@%pR{R@xDp zFCNKzP0-L3;|P#PqP!CBl~F1B@fgziCvd)fs1Y&?&3H9Dd)eaM?mknEIyH zGO5EnHJn>XJk_QTv{E$NHd^9r{v*!|2zVBqks$}tL%DNDffJ^=b#*Eu;aTI;LQhek z2nLCcl~qdclo|}e*{s0xIxMvE^78!b?Dv3Qcx#(ceOfZu?Zu#sOWEmuUT_J4FjM_g z^dMJz-Jk_i6I(Sta@K!sWReP|J{!5!jO4ak{<7-k5-1QAYc=&EB0n-1AJFj>z7>U; zMvC<Tz(DZnI+|&IVLm9qp_Ul;6I%Tc;hIl>{3>Aq{OuaM|aav*FrQIRKY(rB>pi0gY z!AeanA6AT(w$+bkKFxR*o-`#k57pN6)Jx7{KDlF}M3@AxX)vG5 zyb1rd!kyg8<4{yqq^|*0TYYf{q*9c(cUrgmMqs*?R$3sZSAT5db#K)Hcc}O8-(z55 zDTqMO{C&Y{-%Soe5q2jRn30hY92!bbPoJZFe;YnU4xy?s(mo7Fg2?}zuuehg!40); zdjyDu(LN<}Z8t+lAK5(OuOvTw$T?H9!G2b^0_jga#rENf!ZJ&FsEY)UAgV`>KdKj^ z6I_lO*K6gH!0w^Z?KdVfgbr~;bCieX3S2UQqvL|}v@8WJ$qKGr`n2glODhR~E^Xq{ z4zaGuLCUmzAn=qn>8q^5Sxfgo0vi?1YH#YBnd_`5HZvkMWaLuw?h$1N&RBYifl<46 zWIbwf=wUL%#CP|oQ{Y zRsTSOCBa^KR@Q{(anTi#_1mP}2pu1K?V9F}!})|9M8qrgCZ7}+Dx-z{x@!dg*}K8$ zyviFq7ZvX9?{1E1x7n6=|3GL>0mWjPa4fX%-O+;WzD=#QiIjID?CRM=0yQ^X#XUd# z>RI=#mo@-T+D(0qJUu>s=Vcc=z_4-18l*;sw5HLjiwRrS7_H8MqH7dDn##qh9DQ56 z)0Jyjme7LU2}MCI&_9aSus#}H{^nQy>z;&YDSAnvp@>Q$=XI~{FN3oCkGDJSlzAN+ zw|5u<4Y6}V-Bw1Ly{=P%r;Hd6j8FbeJ3UX#1FVLqw{~SV$^!?wM^dt91>rqu!YiHQ zKQc%m;nksTii~deX+&uLox4eh{4XNbTFd)5UnawWTW&fGbjk? zJqzUz!bHN0y?hC5e=jm{%Y1OEm7QZ5STL@p=jNtHj!I&wcsx_9yS5h(=lRy5#jOR9 z`mk>?#~Elc-jaQ(VS#{bV|CEo-K&km=jCm9!8Qd@!0kJRFJ9Lw9v$6#Z_EH!&Q6^q zTV=kK5rw`)d+XalN%aO>vEGcQfnlJJo&cNG< z_kt=eFyX!l?El@v@83PPrf$A8(R&Nc8byUeI6QGZwQ0HVpjORiA9Ryy?mi`~@T7Sp z0&=kz1_^J3KPyZ&I2(;%2-J@sUH@2B`ZX_Ct`D|bnENPtVIG;y#ymicGK3r?F<&Sv z6My3^L#?>kQP}?Gp)`o(^Iv?i<}+M|kP=-0ze6A6cVIPL8jnGInOD%{X~m2ZyYHTg*pgZ4rQ!QgWXLaL&!G zqTh+qe#kr?oS%^e>005roizaQ^aGSGfB_({to#X-Xfl!EQF<u@ls z%}riH;a+bf&ga2WV``y*1yculz0H2LXaRlp7q0=Hav>7)Z^m_Jg5qBOn7A(d@c*uH z|Kt77hhby4*x=CyeIeF)I^XN}|JYDV*PY-H=a9N)hrK3Pa4-haAH#u{5S0p@l>rR- zIK&A58g_@KO)KhnUe>s3cU$1*xSV9;*>kzcNuIln11=7rN#2WEkS>D1qQYpnr}E2I zEMN(LLO6W=10g+Dlo3DI!=Wn63K-BLK9lBQ>|b(Mvwi)W8b|5nFh_6CgS>)$>L#lV z1b$ogas&gU>E#b5jK#q|-)3;=bB|%;T8{tzi`(jpBp@d*o;~4C5d_7mj*c}l{H^kF zfLxTL`wWHNbHW{6-8G*-YNlLCcF3?+z{sG#ZzUXT8PPub`y;EZ&9@uVAW7iutg)B; z=Q+V_zgOQoxdtNh;PB0SE|<#bHC>P#1b6V0F_L@f1a^H;=>TbHY~0w|>H}3p{6h zw+ewr#Ok5iX0Nx`X{>x-|2sv%Zuy&zGvt239a@FL{LZ>}a{e1;>;g~|BJwk3;VS+^ z^W#4eggB=&%Cc!?4cp`6Bahi61MKOk*=kO=NdfN5;dhbakK}emy*~+WG?u2%Y%EH8 za4!*OqZP*>C;tZdkB<+a74qDDctA@|Nw%WZF^U@Xr4>52ccGV5vYnJUo%&jjX8#dY z=hPZ|0_=8miVu*yKR>P>i;0ew(ATF06%}!DaWxi-3JQPgtd^MB*%|2R{Y^5wh-ocL zj$T&dTz1`TJ39fCYu<^8)OAclQ%KJ1^`P)tVG3D5i&VU!}D{1rB;w|~w~ zmlL^p>_!OA@#ah6kf8lJlNWD3`lkUQbg!kzthGlx991-n*jNNCe35H`h*-@L^!8yB zRDSpixzis*dL0qcGqiFNcVcl!G4F84oG2Goa4l5H$y1Qane#Fp}LCMwjWXUy=|G^dY`*%O6cUYjxWy1UN?Hj|1yt`&| zhIdV1zcqI}IYxN&`3?Uhat-9m`Ux)FH_D-A`qT^fr#7iSn6b6$iJ}c7<3aP;-#1MM z)V$G2d5p2yg0L&y(97_R4cbR<10lLLgRCWXPIjHk^V3$E4h96}92{}VDg^6CR@I_P z|8;$>w$x&gat_Anbsx;JKYEBYeoj>9B#K=Kd!%-SNJ~ElS;61mUV}@4{1&jI1NDD| z01*+=AFCxkP*eu#wtKbVo`2ecbR9a6_oZd?0>2vA2V=Mxcs9?@JWDrSpF`>Dn5ZB6pIc^< zDE@=TnX}(Vp<{n-ot$>+8W&3ENy7&Wk+Ei+>ppWMyHC!}4gzyo^a27kE^*V-{En=e zaxV<2IqB;EJiP;)0I;h^yI3uyTpmJK_gS!@rk)Xn5dbB}U}Z@kpf{E-GTHr$AaE19 zR%ew$PFgs9vRE4`;&Jn3V`JmrF7qwTLjBZ93ZBN@S1kOrdpl=`M=L4^snNWmc@9tc;^eWf)nU}r_CP^Y;P`sQePiw6F zDuT`-ARs{V^<{avP|C*~Ne`81?W3HC?viA7!?{DuX)+exp)=7@oMLGBP3hlxuZF*Z zwC!8_B4T10J)tDkU|>POpG+v-B8(EXdk5p$kig#s86W~(I!P?}3w3+wL%4n zd6}nOUZm~uvmoX;qSZ15$4Sy}G|lI`4)iRa9s)rP`==#{<8u}z;TjAL==wADxyoDg z_iI4`0Sww_39~aVx_I3?D*Nx%lh+suY_@IY|JDM*XDNcFb`cM+s=o&L;5TJ|O`e}nf z@*|3ERfm{8oKefAHgs_|>U)4o9Dlx$i`LMgW`zvC)h*~G<536kNKqLXW2hur9f($T z3doq)a{gV{-@gL(+rcBkg_+$DwPpkn2z&Y$Aeu`H=Hz;NaHVU}ErTFT2Lr`=U++Oy zU&_bhSS;7l0sy5qzdTWcJcT{%+7V1DR59qX;LoS5%dUiHSz0c7DPmrJG?n(N!s$By zo||V9mB2Biw2JbCf-xu*)(S@<+-bc#ecn=7nAgjO2betXvhLIf}A{|*+_2{?jfh%(G`h+BK`Q#UxJ5miy0 zWhZ*0R4aYfty%n^sPaJo6%v)6UQVTXhOZ}gW0EY_NNB5T{%hnVBrPOHfu1ohZHIb< z?Kr#EikW{1Bx>6eQ?94=4TEts3IRQgC=)(E^~lx17o56t2=Nx*gth1a#r!`~ zoIZJZf#A`+mWt#cs}uuhg};zo6UtsL&$tI1dE=jqKHA^^*icKjqZg-1M!D}lg9I|R z1)!?NfPX4q)6Ar1X0G3vo#tkN1x9`!F1wN8+Kj9Z77>v>hpPuFvNNECH9rFt_c%cl zkpHL5*mURQKe`xK-iQcve^toy=*ar`PYO>to#*~E(#t;%C5n3i5H2q-CTO!xAUarF zp1;fZExMxo>|iO?1uZA=teyYs6bG#s`@BfD!IO_8SZZvQ7O0j$T3T8HvbUQp=FW7| z{L14V@AJ>)ewM@oRb?Nj+;U3(5pcxtO@9qkNe9PvZ zaQ~YsXim2m8qte;QTmA=mLw;Nz=ezo%>}bnw2=EedEDxA5vTgn53D0QnCMjd6#gpZ*xcQ&A`v?5?SO(7n;L zlJd)Xm7CeVe=ZkF!nqsHzxu~OZWJ4Q=8&u`EABUvRa2zo#eGV;0VN*H;UHiA3rrUK zYQXG207R6GWScllQqgA}V2hsZVD`5ery?ca!v^aw zIsr8u^F$E2Iyu#DpPamjn}IMg0*rf~AbKti2+E1LHt=-a2`Vb`y=RmJk4h>k#b`bi z6*kRvd;a*D;O+EnM!#(*1br3@1~VQA{%HjSNEtVEzdsB%gA%#U&Q5mqs@&Mhf2U?m zkXhyC+RZw!29_U_*cLn7oWz5BQE%f20{sOVJ3JVl15A_<$XE1FvLDOe>-qg35JOYL From 3e6ceaa9a277c74ee2254af256e7b2727188b8d3 Mon Sep 17 00:00:00 2001 From: Augustfox <32084312+Augustfox@users.noreply.github.com> Date: Tue, 3 Oct 2017 01:16:51 -0500 Subject: [PATCH 060/141] Revert "Organize hair and facial hair in character creation" (#3084) --- .../mob/dead/new_player/sprite_accessories.dm | 855 ++++++++---------- 1 file changed, 401 insertions(+), 454 deletions(-) diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index 03b7fd53ec..1eb1379dce 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -67,317 +67,30 @@ /datum/sprite_accessory/hair icon = 'icons/mob/human_face.dmi' // default icon for all hairs -//Place in order by major style E.G "Afro, Bun, Ponytail" -//Place different versions under the same style E.G "Bun > Large Bun, Ponytail > Long Ponytail" -//A +/datum/sprite_accessory/hair/short + name = "Short Hair" // try to capatilize the names please~ // try to spell + icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you -/datum/sprite_accessory/hair/afro - name = "Afro" // try to capatilize the names please~ // try to spell - icon_state = "hair_afro" // you do not need to define _s or _l sub-states, game automatically does this for you +/datum/sprite_accessory/hair/shorthair2 + name = "Short Hair 2" + icon_state = "hair_shorthair2" -/datum/sprite_accessory/hair/afro2 - name = "Afro 2" - icon_state = "hair_afro2" - -/datum/sprite_accessory/hair/afro_large - name = "Big Afro" - icon_state = "hair_bigafro" - -/datum/sprite_accessory/hair/antenna - name = "Ahoge" - icon_state = "hair_antenna" -//B - -/datum/sprite_accessory/hair/bald - name = "Bald" - icon_state = null - -/datum/sprite_accessory/hair/balding - name = "Balding Hair" - icon_state = "hair_e" - -/datum/sprite_accessory/hair/longbangs - name = "Long Bangs" - icon_state = "hair_lbangs" - -/datum/sprite_accessory/hair/bedhead - name = "Bedhead" - icon_state = "hair_bedhead" - -/datum/sprite_accessory/hair/bedhead2 - name = "Bedhead 2" - icon_state = "hair_bedheadv2" - -/datum/sprite_accessory/hair/bedhead3 - name = "Bedhead 3" - icon_state = "hair_bedheadv3" - -/datum/sprite_accessory/hair/beehive - name = "Beehive" - icon_state = "hair_beehive" - -/datum/sprite_accessory/hair/beehive2 - name = "Beehive 2" - icon_state = "hair_beehivev2" - -/datum/sprite_accessory/hair/bob - name = "Bob" - icon_state = "hair_bobcut" - -/datum/sprite_accessory/hair/bobcurl - name = "Bobcurl" - icon_state = "hair_bobcurl" - -/datum/sprite_accessory/hair/bob - name = "Bob Hair" - icon_state = "hair_bob" - -/datum/sprite_accessory/hair/bob2 - name = "Bob Hair 2" - icon_state = "hair_bob2" - -/datum/sprite_accessory/hair/boddicker - name = "Boddicker" - icon_state = "hair_boddicker" - -/datum/sprite_accessory/hair/bowl - name = "Bowl" - icon_state = "hair_bowlcut" - -/datum/sprite_accessory/hair/braided - name = "Braided" - icon_state = "hair_braided" - -/datum/sprite_accessory/hair/front_braid - name = "Braided front" - icon_state = "hair_braidfront" - -/datum/sprite_accessory/hair/braidtail - name = "Braided Tail" - icon_state = "hair_braidtail" - -/datum/sprite_accessory/hair/lowbraid - name = "Low Braid" - icon_state = "hair_hbraid" - -/datum/sprite_accessory/hair/not_floorlength_braid - name = "High Braid" - icon_state = "hair_braid2" - -/datum/sprite_accessory/hair/shortbraid - name = "Short Braid" - icon_state = "hair_shortbraid" - -/datum/sprite_accessory/hair/braid - name = "Floorlength Braid" - icon_state = "hair_braid" - -/datum/sprite_accessory/hair/business - name = "Business Hair" - icon_state = "hair_business" - -/datum/sprite_accessory/hair/business2 - name = "Business Hair 2" - icon_state = "hair_business2" - -/datum/sprite_accessory/hair/business3 - name = "Business Hair 3" - icon_state = "hair_business3" - -/datum/sprite_accessory/hair/business4 - name = "Business Hair 4" - icon_state = "hair_business4" - -/datum/sprite_accessory/hair/bun - name = "Bun Head" - icon_state = "hair_bun" - -/datum/sprite_accessory/hair/bun2 - name = "Bun Head 2" - icon_state = "hair_bunhead2" - -/datum/sprite_accessory/hair/largebun - name = "Large Bun" - icon_state = "hair_largebun" - -/datum/sprite_accessory/hair/buzz - name = "Buzzcut" - icon_state = "hair_buzzcut" - -//C - -/datum/sprite_accessory/hair/crew - name = "Crewcut" - icon_state = "hair_crewcut" - -/datum/sprite_accessory/hair/combover - name = "Combover" - icon_state = "hair_combover" - -/datum/sprite_accessory/hair/curls - name = "Curls" - icon_state = "hair_curls" - -//D - -/datum/sprite_accessory/hair/devillock - name = "Devil Lock" - icon_state = "hair_devilock" - -/datum/sprite_accessory/hair/dreadlocks - name = "Dreadlocks" - icon_state = "hair_dreads" - -/datum/sprite_accessory/hair/drillhair - name = "Drill Hair" - icon_state = "hair_drillhair" - -//E - -/datum/sprite_accessory/hair/emo - name = "Emo" - icon_state = "hair_emo" - -/datum/sprite_accessory/hair/longemo - name = "Long Emo" - icon_state = "hair_longemo" - -//F - -/datum/sprite_accessory/hair/feather - name = "Feather" - icon_state = "hair_feather" - -/datum/sprite_accessory/hair/sargeant - name = "Flat Top" - icon_state = "hair_sargeant" - -/datum/sprite_accessory/hair/bigflattop - name = "Big Flat Top" - icon_state = "hair_bigflattop" - -/datum/sprite_accessory/hair/fag - name = "Flow Hair" - icon_state = "hair_f" - -/datum/sprite_accessory/hair/longfringe - name = "Long Fringe" - icon_state = "hair_longfringe" - -/datum/sprite_accessory/hair/longestalt - name = "Longer Fringe" - icon_state = "hair_vlongfringe" - -//G - -/datum/sprite_accessory/hair/gelled - name = "Gelled Back" - icon_state = "hair_gelled" - -/datum/sprite_accessory/hair/gentle - name = "Gentle" - icon_state = "hair_gentle" - -//H +/datum/sprite_accessory/hair/shorthair3 + name = "Short Hair 3" + icon_state = "hair_shorthair3" /datum/sprite_accessory/hair/cut name = "Cut Hair" icon_state = "hair_c" -/datum/sprite_accessory/hair/halfbang - name = "Half-banged Hair" - icon_state = "hair_halfbang" - -/datum/sprite_accessory/hair/halfbang2 - name = "Half-banged Hair 2" - icon_state = "hair_halfbang2" - -/datum/sprite_accessory/hair/hedgehog - name = "Hedgehog Hair" - icon_state = "hair_hedgehog" - -/datum/sprite_accessory/hair/hitop - name = "Hitop" - icon_state = "hair_hitop" - -/datum/sprite_accessory/hair/himecut - name = "Hime Cut" - icon_state = "hair_himecut" - -/datum/sprite_accessory/hair/himecut2 - name = "Hime Cut 2" - icon_state = "hair_himecut2" - -/datum/sprite_accessory/hair/himeup - name = "Hime Updo" - icon_state = "hair_himeup" - -//I - -//J - -/datum/sprite_accessory/hair/jensen - name = "Jensen Hair" - icon_state = "hair_jensen" - -//K - -/datum/sprite_accessory/hair/keanu - name = "Keanu Hair" - icon_state = "hair_keanu" - -/datum/sprite_accessory/hair/kusangi - name = "Kusanagi Hair" - icon_state = "hair_kusanagi" - -//L +/datum/sprite_accessory/hair/long + name = "Shoulder-length Hair" + icon_state = "hair_b" /datum/sprite_accessory/hair/longer name = "Long Hair" icon_state = "hair_vlong" -/datum/sprite_accessory/hair/long - name = "Long Hair 1" - icon_state = "hair_long" - -/datum/sprite_accessory/hair/long2 - name = "Long Hair 2" - icon_state = "hair_long2" - -/datum/sprite_accessory/hair/longest - name = "Very Long Hair" - icon_state = "hair_longest" - -//M - -/datum/sprite_accessory/hair/megaeyebrows - name = "Mega Eyebrows" - icon_state = "hair_megaeyebrows" - -/datum/sprite_accessory/hair/messy - name = "Messy" - icon_state = "hair_messy" - -/datum/sprite_accessory/hair/mohawk - name = "Mohawk" - icon_state = "hair_d" - -/datum/sprite_accessory/hair/reversemohawk - name = "Reverse Mohawk" - icon_state = "hair_reversemohawk" - -//N - -//O - -/datum/sprite_accessory/hair/odango - name = "Odango" - icon_state = "hair_odango" - -/datum/sprite_accessory/hair/ombre - name = "Ombre" - icon_state = "hair_ombre" - /datum/sprite_accessory/hair/over_eye name = "Over Eye" icon_state = "hair_shortovereye" @@ -390,39 +103,29 @@ name = "Very Long Over Eye" icon_state = "hair_longest2" -//P +/datum/sprite_accessory/hair/longest + name = "Very Long Hair" + icon_state = "hair_longest" -/datum/sprite_accessory/hair/parted - name = "Parted" - icon_state = "hair_parted" +/datum/sprite_accessory/hair/longfringe + name = "Long Fringe" + icon_state = "hair_longfringe" -/datum/sprite_accessory/hair/sidepartlongalt - name = "Long Side Part" - icon_state = "hair_longsidepart" +/datum/sprite_accessory/hair/longestalt + name = "Longer Fringe" + icon_state = "hair_vlongfringe" -/datum/sprite_accessory/hair/kagami - name = "Pigtails" - icon_state = "hair_kagami" +/datum/sprite_accessory/hair/gentle + name = "Gentle" + icon_state = "hair_gentle" -/datum/sprite_accessory/hair/pigtail - name = "Pigtails 2" - icon_state = "hair_pigtails" +/datum/sprite_accessory/hair/halfbang + name = "Half-banged Hair" + icon_state = "hair_halfbang" -/datum/sprite_accessory/hair/pigtail - name = "Pigtails 3" - icon_state = "hair_pigtails2" - -/datum/sprite_accessory/hair/pixie - name = "Pixie Cut" - icon_state = "hair_pixie" - -/datum/sprite_accessory/hair/pompadour - name = "Pompadour" - icon_state = "hair_pompadour" - -/datum/sprite_accessory/hair/bigpompadour - name = "Big Pompadour" - icon_state = "hair_bigpompadour" +/datum/sprite_accessory/hair/halfbang2 + name = "Half-banged Hair 2" + icon_state = "hair_halfbang2" /datum/sprite_accessory/hair/ponytail1 name = "Ponytail" @@ -444,36 +147,6 @@ name = "Ponytail 5" icon_state = "hair_ponytail5" -/datum/sprite_accessory/hair/highponytail - name = "High Ponytail" - icon_state = "hair_highponytail" - -/datum/sprite_accessory/hair/longponytail - name = "Long Ponytail" - icon_state = "hair_longstraightponytail" - -//Q - -/datum/sprite_accessory/hair/quiff - name = "Quiff" - icon_state = "hair_quiff" - - -//R - -//S - -/datum/sprite_accessory/hair/oneshoulder - name = "One Shoulder" - icon_state = "hair_oneshoulder" - -/datum/sprite_accessory/hair/tressshoulder - name = "Tress Shoulder" - icon_state = "hair_tressshoulder" - -/datum/sprite_accessory/hair/sidecut - name = "Sidecut" - icon_state = "hair_sidecut" /datum/sprite_accessory/hair/sidetail name = "Side Pony" @@ -491,33 +164,141 @@ name = "Side Pony 4" icon_state = "hair_sidetail4" -/datum/sprite_accessory/hair/short - name = "Short Hair" - icon_state = "hair_a" +/datum/sprite_accessory/hair/oneshoulder + name = "One Shoulder" + icon_state = "hair_oneshoulder" -/datum/sprite_accessory/hair/shorthair2 - name = "Short Hair 2" - icon_state = "hair_shorthair2" - -/datum/sprite_accessory/hair/shorthair3 - name = "Short Hair 3" - icon_state = "hair_shorthair3" - -/datum/sprite_accessory/hair/long - name = "Shoulder-length Hair" - icon_state = "hair_b" +/datum/sprite_accessory/hair/tressshoulder + name = "Tress Shoulder" + icon_state = "hair_tressshoulder" /datum/sprite_accessory/hair/parted - name = "Side Part" - icon_state = "hair_part" + name = "Parted" + icon_state = "hair_parted" -/datum/sprite_accessory/hair/skinhead - name = "Skinhead" - icon_state = "hair_skinhead" +/datum/sprite_accessory/hair/pompadour + name = "Pompadour" + icon_state = "hair_pompadour" -/datum/sprite_accessory/hair/protagonist - name = "Slightly Long" - icon_state = "hair_protagonist" +/datum/sprite_accessory/hair/bigpompadour + name = "Big Pompadour" + icon_state = "hair_bigpompadour" + +/datum/sprite_accessory/hair/quiff + name = "Quiff" + icon_state = "hair_quiff" + +/datum/sprite_accessory/hair/bedhead + name = "Bedhead" + icon_state = "hair_bedhead" + +/datum/sprite_accessory/hair/bedhead2 + name = "Bedhead 2" + icon_state = "hair_bedheadv2" + +/datum/sprite_accessory/hair/bedhead3 + name = "Bedhead 3" + icon_state = "hair_bedheadv3" + +/datum/sprite_accessory/hair/messy + name = "Messy" + icon_state = "hair_messy" + +/datum/sprite_accessory/hair/beehive + name = "Beehive" + icon_state = "hair_beehive" + +/datum/sprite_accessory/hair/beehive2 + name = "Beehive 2" + icon_state = "hair_beehivev2" + +/datum/sprite_accessory/hair/bobcurl + name = "Bobcurl" + icon_state = "hair_bobcurl" + +/datum/sprite_accessory/hair/bob + name = "Bob" + icon_state = "hair_bobcut" + +/datum/sprite_accessory/hair/bowl + name = "Bowl" + icon_state = "hair_bowlcut" + +/datum/sprite_accessory/hair/buzz + name = "Buzzcut" + icon_state = "hair_buzzcut" + +/datum/sprite_accessory/hair/crew + name = "Crewcut" + icon_state = "hair_crewcut" + +/datum/sprite_accessory/hair/combover + name = "Combover" + icon_state = "hair_combover" + +/datum/sprite_accessory/hair/devillock + name = "Devil Lock" + icon_state = "hair_devilock" + +/datum/sprite_accessory/hair/dreadlocks + name = "Dreadlocks" + icon_state = "hair_dreads" + +/datum/sprite_accessory/hair/curls + name = "Curls" + icon_state = "hair_curls" + +/datum/sprite_accessory/hair/afro + name = "Afro" + icon_state = "hair_afro" + +/datum/sprite_accessory/hair/afro2 + name = "Afro 2" + icon_state = "hair_afro2" + +/datum/sprite_accessory/hair/afro_large + name = "Big Afro" + icon_state = "hair_bigafro" + +/datum/sprite_accessory/hair/sargeant + name = "Flat Top" + icon_state = "hair_sargeant" + +/datum/sprite_accessory/hair/emo + name = "Emo" + icon_state = "hair_emo" + +/datum/sprite_accessory/hair/longemo + name = "Long Emo" + icon_state = "hair_longemo" + +/datum/sprite_accessory/hair/fag + name = "Flow Hair" + icon_state = "hair_f" + +/datum/sprite_accessory/hair/feather + name = "Feather" + icon_state = "hair_feather" + +/datum/sprite_accessory/hair/hitop + name = "Hitop" + icon_state = "hair_hitop" + +/datum/sprite_accessory/hair/mohawk + name = "Mohawk" + icon_state = "hair_d" + +/datum/sprite_accessory/hair/reversemohawk + name = "Reverse Mohawk" + icon_state = "hair_reversemohawk" + +/datum/sprite_accessory/hair/jensen + name = "Jensen Hair" + icon_state = "hair_jensen" + +/datum/sprite_accessory/hair/gelled + name = "Gelled Back" + icon_state = "hair_gelled" /datum/sprite_accessory/hair/spiky name = "Spiky" @@ -531,6 +312,122 @@ name = "Spiky 3" icon_state = "hair_spiky2" +/datum/sprite_accessory/hair/protagonist + name = "Slightly Long" + icon_state = "hair_protagonist" + +/datum/sprite_accessory/hair/kusangi + name = "Kusanagi Hair" + icon_state = "hair_kusanagi" + +/datum/sprite_accessory/hair/kagami + name = "Pigtails" + icon_state = "hair_kagami" + +/datum/sprite_accessory/hair/pigtail + name = "Pigtails 2" + icon_state = "hair_pigtails" + +/datum/sprite_accessory/hair/pigtail + name = "Pigtails 3" + icon_state = "hair_pigtails2" + +/datum/sprite_accessory/hair/himecut + name = "Hime Cut" + icon_state = "hair_himecut" + +/datum/sprite_accessory/hair/himecut2 + name = "Hime Cut 2" + icon_state = "hair_himecut2" + +/datum/sprite_accessory/hair/himeup + name = "Hime Updo" + icon_state = "hair_himeup" + +/datum/sprite_accessory/hair/antenna + name = "Ahoge" + icon_state = "hair_antenna" + +/datum/sprite_accessory/hair/front_braid + name = "Braided front" + icon_state = "hair_braidfront" + +/datum/sprite_accessory/hair/lowbraid + name = "Low Braid" + icon_state = "hair_hbraid" + +/datum/sprite_accessory/hair/not_floorlength_braid + name = "High Braid" + icon_state = "hair_braid2" + +/datum/sprite_accessory/hair/shortbraid + name = "Short Braid" + icon_state = "hair_shortbraid" + +/datum/sprite_accessory/hair/braid + name = "Floorlength Braid" + icon_state = "hair_braid" + +/datum/sprite_accessory/hair/odango + name = "Odango" + icon_state = "hair_odango" + +/datum/sprite_accessory/hair/ombre + name = "Ombre" + icon_state = "hair_ombre" + +/datum/sprite_accessory/hair/updo + name = "Updo" + icon_state = "hair_updo" + +/datum/sprite_accessory/hair/skinhead + name = "Skinhead" + icon_state = "hair_skinhead" + +/datum/sprite_accessory/hair/longbangs + name = "Long Bangs" + icon_state = "hair_lbangs" + +/datum/sprite_accessory/hair/balding + name = "Balding Hair" + icon_state = "hair_e" + +/datum/sprite_accessory/hair/bald + name = "Bald" + icon_state = null + +/datum/sprite_accessory/hair/parted + name = "Side Part" + icon_state = "hair_part" + +/datum/sprite_accessory/hair/braided + name = "Braided" + icon_state = "hair_braided" + +/datum/sprite_accessory/hair/bun + name = "Bun Head" + icon_state = "hair_bun" + +/datum/sprite_accessory/hair/bun2 + name = "Bun Head 2" + icon_state = "hair_bunhead2" + +/datum/sprite_accessory/hair/braidtail + name = "Braided Tail" + icon_state = "hair_braidtail" + +/datum/sprite_accessory/hair/bigflattop + name = "Big Flat Top" + icon_state = "hair_bigflattop" + +/datum/sprite_accessory/hair/drillhair + name = "Drill Hair" + icon_state = "hair_drillhair" + +/datum/sprite_accessory/hair/keanu + name = "Keanu Hair" + icon_state = "hair_keanu" + /datum/sprite_accessory/hair/swept name = "Swept Back Hair" icon_state = "hair_swept" @@ -539,24 +436,73 @@ name = "Swept Back Hair 2" icon_state = "hair_swept2" -//T +/datum/sprite_accessory/hair/business + name = "Business Hair" + icon_state = "hair_business" -//U +/datum/sprite_accessory/hair/business2 + name = "Business Hair 2" + icon_state = "hair_business2" -/datum/sprite_accessory/hair/updo - name = "Updo" - icon_state = "hair_updo" +/datum/sprite_accessory/hair/business3 + name = "Business Hair 3" + icon_state = "hair_business3" -//V +/datum/sprite_accessory/hair/business4 + name = "Business Hair 4" + icon_state = "hair_business4" -//W +/datum/sprite_accessory/hair/hedgehog + name = "Hedgehog Hair" + icon_state = "hair_hedgehog" -//X +/datum/sprite_accessory/hair/bob + name = "Bob Hair" + icon_state = "hair_bob" -//Y +/datum/sprite_accessory/hair/bob2 + name = "Bob Hair 2" + icon_state = "hair_bob2" -//Z +/datum/sprite_accessory/hair/boddicker + name = "Boddicker" + icon_state = "hair_boddicker" +/datum/sprite_accessory/hair/long + name = "Long Hair 1" + icon_state = "hair_long" + +/datum/sprite_accessory/hair/long2 + name = "Long Hair 2" + icon_state = "hair_long2" + +/datum/sprite_accessory/hair/pixie + name = "Pixie Cut" + icon_state = "hair_pixie" + +/datum/sprite_accessory/hair/megaeyebrows + name = "Mega Eyebrows" + icon_state = "hair_megaeyebrows" + +/datum/sprite_accessory/hair/highponytail + name = "High Ponytail" + icon_state = "hair_highponytail" + +/datum/sprite_accessory/hair/longponytail + name = "Long Ponytail" + icon_state = "hair_longstraightponytail" + +/datum/sprite_accessory/hair/sidepartlongalt + name = "Long Side Part" + icon_state = "hair_longsidepart" + +/datum/sprite_accessory/hair/sidecut + name = "Sidecut" + icon_state = "hair_sidecut" + +/datum/sprite_accessory/hair/largebun + name = "Large Bun" + icon_state = "hair_largebun" ///////////////////////////// // Facial Hair Definitions // @@ -570,81 +516,82 @@ icon_state = null gender = NEUTER -/datum/sprite_accessory/facial_hair/abe - name = "Abraham Lincoln Beard" - icon_state = "facial_abe" - -/datum/sprite_accessory/facial_hair/brokenman - name = "Broken Man" - icon_state = "facial_brokenman" - -/datum/sprite_accessory/facial_hair/chinstrap - name = "Chinstrap" - icon_state = "facial_chin" - -/datum/sprite_accessory/facial_hair/dwarf - name = "Dwarf Beard" - icon_state = "facial_dwarf" - -/datum/sprite_accessory/facial_hair/elvis - name = "Elvis Sideburns" - icon_state = "facial_elvis" - -/datum/sprite_accessory/facial_hair/fiveoclock - name = "Five o Clock Shadow" - icon_state = "facial_fiveoclock" - -/datum/sprite_accessory/facial_hair/fullbeard - name = "Full Beard" - icon_state = "facial_fullbeard" - -/datum/sprite_accessory/facial_hair/fu - name = "Fu Manchu" - icon_state = "facial_fumanchu" - -/datum/sprite_accessory/facial_hair/gt - name = "Goatee" - icon_state = "facial_gt" - -/datum/sprite_accessory/facial_hair/hip - name = "Hipster Beard" - icon_state = "facial_hip" +/datum/sprite_accessory/facial_hair/watson + name = "Watson Mustache" + icon_state = "facial_watson" /datum/sprite_accessory/facial_hair/hogan name = "Hulk Hogan Mustache" icon_state = "facial_hogan" //-Neek - -/datum/sprite_accessory/facial_hair/jensen - name = "Jensen Beard" - icon_state = "facial_jensen" - -/datum/sprite_accessory/facial_hair/longbeard - name = "Long Beard" - icon_state = "facial_longbeard" - -/datum/sprite_accessory/facial_hair/neckbeard - name = "Neckbeard" - icon_state = "facial_neckbeard" - -/datum/sprite_accessory/facial_hair/selleck - name = "Selleck Mustache" - icon_state = "facial_selleck" - -/datum/sprite_accessory/facial_hair/chaplin - name = "Square Mustache" - icon_state = "facial_chaplin" - + /datum/sprite_accessory/facial_hair/vandyke name = "Van Dyke Mustache" icon_state = "facial_vandyke" - + +/datum/sprite_accessory/facial_hair/chaplin + name = "Square Mustache" + icon_state = "facial_chaplin" + +/datum/sprite_accessory/facial_hair/selleck + name = "Selleck Mustache" + icon_state = "facial_selleck" + +/datum/sprite_accessory/facial_hair/neckbeard + name = "Neckbeard" + icon_state = "facial_neckbeard" + +/datum/sprite_accessory/facial_hair/fullbeard + name = "Full Beard" + icon_state = "facial_fullbeard" + +/datum/sprite_accessory/facial_hair/longbeard + name = "Long Beard" + icon_state = "facial_longbeard" + /datum/sprite_accessory/facial_hair/vlongbeard name = "Very Long Beard" icon_state = "facial_wise" - -/datum/sprite_accessory/facial_hair/watson - name = "Watson Mustache" - icon_state = "facial_watson" + +/datum/sprite_accessory/facial_hair/elvis + name = "Elvis Sideburns" + icon_state = "facial_elvis" + +/datum/sprite_accessory/facial_hair/abe + name = "Abraham Lincoln Beard" + icon_state = "facial_abe" + +/datum/sprite_accessory/facial_hair/chinstrap + name = "Chinstrap" + icon_state = "facial_chin" + +/datum/sprite_accessory/facial_hair/hip + name = "Hipster Beard" + icon_state = "facial_hip" + +/datum/sprite_accessory/facial_hair/gt + name = "Goatee" + icon_state = "facial_gt" + +/datum/sprite_accessory/facial_hair/jensen + name = "Jensen Beard" + icon_state = "facial_jensen" + +/datum/sprite_accessory/facial_hair/dwarf + name = "Dwarf Beard" + icon_state = "facial_dwarf" + +/datum/sprite_accessory/facial_hair/fiveoclock + name = "Five o Clock Shadow" + icon_state = "facial_fiveoclock" + +/datum/sprite_accessory/facial_hair/fu + name = "Fu Manchu" + icon_state = "facial_fumanchu" + +/datum/sprite_accessory/facial_hair/brokenman + name = "Broken Man" + icon_state = "facial_brokenman" + /////////////////////////// // Underwear Definitions // From 99d57a7f1966e52faa9104ff604b067fc12e8dd6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Oct 2017 01:20:37 -0500 Subject: [PATCH 061/141] [MIRROR] Swarmers work with multiz stations (#3083) * Merge pull request #31225 from KorPhaeron/multiz_swarmers Swarmers work with multiz stations * Swarmers work with multiz stations --- code/game/gamemodes/miniantags/bot_swarm/swarmer.dm | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index d919d5d277..c125f7648d 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -468,11 +468,8 @@ return var/turf/open/floor/F - switch(z) //Only the station/lavaland - if(ZLEVEL_STATION_PRIMARY) - F =find_safe_turf(zlevels = ZLEVEL_STATION_PRIMARY, extended_safety_checks = TRUE) - if(ZLEVEL_LAVALAND) - F = find_safe_turf(zlevels = ZLEVEL_LAVALAND, extended_safety_checks = TRUE) + F = find_safe_turf(zlevels = z, extended_safety_checks = TRUE) + if(!F) return // If we're getting rid of a human, slap some energy cuffs on From 1e309deac0b23178c64a73ef2da03572b446a554 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Oct 2017 01:20:46 -0500 Subject: [PATCH 062/141] [MIRROR] Wizard can't cast shout or whisper spells when he is unable to speak (#2965) * Wizard being mute now blocks touch attacks from activating (can still be cast) * Wizard can't cast shout or whisper spells when he is unable to speak --- code/modules/spells/spell_types/godhand.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index 455f5ef165..33f947408a 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -49,6 +49,9 @@ /obj/item/melee/touch_attack/disintegrate/afterattack(atom/target, mob/living/carbon/user, proximity) if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //exploding after touching yourself would be bad return + if(!user.can_speak_vocal()) + to_chat(user, "You can't get the words out!") + return var/mob/M = target do_sparks(4, FALSE, M.loc) M.gib() @@ -68,6 +71,9 @@ if(user.lying || user.handcuffed) to_chat(user, "You can't reach out!") return + if(!user.can_speak_vocal()) + to_chat(user, "You can't get the words out!") + return var/mob/living/M = target M.Stun(40) M.petrify() From a0fd8f8b8a698196c81155cdbb24f87867cb87e8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Oct 2017 01:20:48 -0500 Subject: [PATCH 063/141] Automatic changelog generation for PR #2965 [ci skip] --- html/changelogs/AutoChangeLog-pr-2965.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2965.yml diff --git a/html/changelogs/AutoChangeLog-pr-2965.yml b/html/changelogs/AutoChangeLog-pr-2965.yml new file mode 100644 index 0000000000..98ec6c9b83 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2965.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "Wizard cannot cast spoken or whispered spells while mute" From dffcebf4ffebb40ce2c8c5cf71488513148d313d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Oct 2017 01:20:55 -0500 Subject: [PATCH 064/141] [MIRROR] Remove ash drake hide from lesser ash drakes butcher loot (#2938) * Merge pull request #30884 from Arianya/patch-1 Remove ash drake hide from lesser ash drakes butcher loot * Remove ash drake hide from lesser ash drakes butcher loot --- .../modules/mob/living/simple_animal/hostile/megafauna/dragon.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index d1ddfa9a00..b81d58b329 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -385,6 +385,7 @@ Difficulty: Medium melee_damage_lower = 30 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) loot = list() + butcher_results = list(/obj/item/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30) /mob/living/simple_animal/hostile/megafauna/dragon/lesser/grant_achievement(medaltype,scoretype) return From 37ac0492c3f03cbba255aabcec5e3c419ae91b72 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Oct 2017 01:20:56 -0500 Subject: [PATCH 065/141] Automatic changelog generation for PR #2938 [ci skip] --- html/changelogs/AutoChangeLog-pr-2938.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2938.yml diff --git a/html/changelogs/AutoChangeLog-pr-2938.yml b/html/changelogs/AutoChangeLog-pr-2938.yml new file mode 100644 index 0000000000..36a1129534 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2938.yml @@ -0,0 +1,4 @@ +author: "Arianya" +delete-after: True +changes: + - balance: "Lesser ash drakes no longer drop ash drake hide when butchered." From 221404bffb552a4b01761fbd3e814037d4a99a48 Mon Sep 17 00:00:00 2001 From: John <31661882+Daniel0Mclovin@users.noreply.github.com> Date: Tue, 3 Oct 2017 01:42:18 -0500 Subject: [PATCH 066/141] cleaned up some things --- .../mob/living/carbon/human/species_types/podpeople.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 4c86a0f74f..3b589d05a2 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -37,12 +37,12 @@ if(H.nutrition > NUTRITION_LEVEL_FULL) H.nutrition = NUTRITION_LEVEL_FULL if(light_amount > 0.2) //if there's enough light, heal - H.heal_overall_damage(0.7) + H.heal_overall_damage(0,5) H.adjustOxyLoss(-0.5) if(H.nutrition < NUTRITION_LEVEL_STARVING + 55) - H.adjustOxyLoss(5,5) //can eat to negate this unfortunately - H.adjustToxLoss(3,0) + H.adjustOxyLoss(5) //can eat to negate this unfortunately + H.adjustToxLoss(3) /datum/species/pod/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) From 42cfb61f42d5c7ee08f2cf7b2fde54e9b7c46e54 Mon Sep 17 00:00:00 2001 From: John <31661882+Daniel0Mclovin@users.noreply.github.com> Date: Tue, 3 Oct 2017 01:55:50 -0500 Subject: [PATCH 067/141] Edited regen Made it proper --- code/modules/mob/living/carbon/human/species_types/podpeople.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 3b589d05a2..ef044e462b 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -37,7 +37,7 @@ if(H.nutrition > NUTRITION_LEVEL_FULL) H.nutrition = NUTRITION_LEVEL_FULL if(light_amount > 0.2) //if there's enough light, heal - H.heal_overall_damage(0,5) + H.heal_overall_damage(0.05,0) H.adjustOxyLoss(-0.5) if(H.nutrition < NUTRITION_LEVEL_STARVING + 55) From c8c5af25fe0f166772aa4e6b9749680a2bd261c5 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 3 Oct 2017 03:31:49 -0500 Subject: [PATCH 068/141] Update custom_items.dm --- code/citadel/custom_loadout/custom_items.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/citadel/custom_loadout/custom_items.dm b/code/citadel/custom_loadout/custom_items.dm index 736d38d41a..3f59fdf891 100644 --- a/code/citadel/custom_loadout/custom_items.dm +++ b/code/citadel/custom_loadout/custom_items.dm @@ -131,4 +131,5 @@ name = "russian flask" desc = "Every good russian spaceman knows it's a good idea to bring along a couple of pints of whiskey wherever they go." icon_state = "russianflask" + item_state = "russianflask" volume = 60 From b95d35d56ded48a5c3934658e91d68a7c8fbdec7 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 3 Oct 2017 03:42:13 -0500 Subject: [PATCH 069/141] FUCK. --- code/citadel/custom_loadout/custom_items.dm | 2 ++ icons/obj/custom.dmi | Bin 996 -> 1162 bytes 2 files changed, 2 insertions(+) diff --git a/code/citadel/custom_loadout/custom_items.dm b/code/citadel/custom_loadout/custom_items.dm index 736d38d41a..cf9471c629 100644 --- a/code/citadel/custom_loadout/custom_items.dm +++ b/code/citadel/custom_loadout/custom_items.dm @@ -130,5 +130,7 @@ /obj/item/reagent_containers/food/drinks/flask/russian name = "russian flask" desc = "Every good russian spaceman knows it's a good idea to bring along a couple of pints of whiskey wherever they go." + icon = 'icons/obj/custom.dmi' icon_state = "russianflask" + item_state = "russianflask" volume = 60 diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi index 3b812e445a7784e4f574a81106a16a9212c4f825..e037ffb73a005b6a7636c1edf6deb7528088feea 100644 GIT binary patch delta 563 zcmV-30?hs72Z{+ziBL{Q4GJ0x0000DNk~Le0000$0000W2m=5B0F^_Iwg3PEG*C=b zMZmzo=IQ37rJ{m$b$54mb#-)vf_r*;dH?_a-PzQRiG?#WGqEfR0vnkC0E&NnggV%t z00001bW%=J06^y0W&i*Hc#}&4Uw`3>ib{)%GZXXDauSQPaVb_-aP@NmI{^S211Da# zO2wG~00DqWL_t(YiDO_G1*8H-CT7YEU}9mV&;@LixPYCVor9B$g=|N#bHe}@6L>HI zx)N4yZk#6Y@bL2S@$sVqbR+N>0Mw4f1wbQ+G=PT}Xq$kbkg$lTn7D+blz+60tem`p zq7pwJ4=w{(Pz~VY=TTNsRa4i{)Y8_`)zddHG%_|ZH6zvlkORyuEUm0kx|hxv2pPUiAkuTfZG6|y5yA9G}rWu z%&hF3+`RmP!lL4m(z5aj;(raOtg5c5t*dWnY-(<4ZENr7?CS36?L&0|3+`9|D(s&y zanj@|Q>RUzF>}`JIdkXDU$7889`P6e32r@E8D0%6$BM;KU3MC+ z6cQE@6%%J+hN@s>W?__&l#-T_m6KOcR8m$^Ra4i{)Y67202!d8tEX>ZXk=_+YG!U> zX=QC=YiED&;0RR#GQi2%#nsK-!_&*#$Jft4ATTI6Bs44>>I#r+A|j)rtzu&1;u8{+ zl2cOC(lau%vU73~3i9#`3X6(MO3TVCDyyn%YU}D78k?G7{s5_HX>Duo=Fw*E zFmcl4DO0B*{0VXdf;KZvs`UT!k7)tJkb$T*rbG qlt4q6!GR4z%ossUII>0oK>z?Mv^^@3Ed$#C0000 Date: Tue, 3 Oct 2017 03:55:05 -0500 Subject: [PATCH 070/141] OOOOOOOH SHIIIIIIIIIIT --- code/citadel/custom_loadout/custom_items.dm | 8 ++++++++ icons/obj/custom.dmi | Bin 1162 -> 1278 bytes 2 files changed, 8 insertions(+) diff --git a/code/citadel/custom_loadout/custom_items.dm b/code/citadel/custom_loadout/custom_items.dm index cf9471c629..397f4c6576 100644 --- a/code/citadel/custom_loadout/custom_items.dm +++ b/code/citadel/custom_loadout/custom_items.dm @@ -30,6 +30,14 @@ item_color = null tagname = null +/obj/item/clothing/accessory/medal/steele + name = "Insignia Of Steele" + desc = "An intricate pendant given to those who help a key member of the Steele Corporation." + icon = 'icons/obj/custom.dmi' + icon_state = "steele" + item_color = "steele" + medaltype = "medal-silver" + /*DirtyOldHarry*/ /obj/item/lighter/gold diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi index e037ffb73a005b6a7636c1edf6deb7528088feea..c8b96b84695d149ff71df71bf28cf99559584018 100644 GIT binary patch delta 233 zcmV3H}L?7Y;xO0{{R3owtGP0006*u_ZDBD*qxPihq2-z`&URW`ZRinE=c& zF)>@br+okb00DGTPE!Ct=GbNc004lKasq872`VlwNlnd3#idMH!PU{0+IW-@-G z0{vD100G@eL_t(og|qwub^&!@6pVsVKtHf|@7{g;_wU~aqzA|V2Dkxa>IWIIZ{I!& zw1XW%nSO=?2M$oE{QxCK0QK(LMTrR@y_6ULvL6h{H34Wl43g^tm>0-2033*56Ufw0 jxd9ZX0|tsy;?M*DM;68Dj{`K^00000NkvXXu0mjflmb=x delta 117 zcmeyz*~K|QoKJy+nSp^}s&n5q1_maRjjBdW(lZ$ty6S6MtZvK)$}pA$`2{mLJiCzw zzN_*%?p&B!3ltRA<`>nKnMV}qxQV~9uRW?|+sMhOOS28QpRX}g{3 SeAIyY7(8A5T-G@yGywpB9U$!h From 4e31a451545e063a6731937a2f7072dda750bfd2 Mon Sep 17 00:00:00 2001 From: Michiyamenotehifunana <31995558+Michiyamenotehifunana@users.noreply.github.com> Date: Tue, 3 Oct 2017 17:18:42 +0800 Subject: [PATCH 071/141] Nerf to 10mm Soporific Bullets (#3085) Makes it require 3 shots instead of just 2 to put your victim to sleep. --- code/citadel/cit_guns.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/citadel/cit_guns.dm b/code/citadel/cit_guns.dm index e62884ecbc..73a98db4e3 100644 --- a/code/citadel/cit_guns.dm +++ b/code/citadel/cit_guns.dm @@ -596,10 +596,10 @@ obj/item/projectile/bullet/c10mm/soporific if((blocked != 100) && isliving(target)) var/mob/living/L = target L.blur_eyes(6) - if(L.staminaloss >= 40) + if(L.staminaloss >= 60) L.Sleeping(250) else - L.adjustStaminaLoss(58) + L.adjustStaminaLoss(25) return 1 /obj/item/ammo_casing/c10mm/soporific From 22b6f538d6c28f307a96359c6263cc92d3b02524 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Oct 2017 04:18:43 -0500 Subject: [PATCH 072/141] Automatic changelog generation for PR #3085 [ci skip] --- html/changelogs/AutoChangeLog-pr-3085.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3085.yml diff --git a/html/changelogs/AutoChangeLog-pr-3085.yml b/html/changelogs/AutoChangeLog-pr-3085.yml new file mode 100644 index 0000000000..90001fc8b9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3085.yml @@ -0,0 +1,4 @@ +author: "Toriate" +delete-after: True +changes: + - balance: "10mm Soporific bullets now have a threshold of 60 stamina damage, up from 40, and deal 25 with each shot, down from 50" From 8ac574108ed5f9bf7f7bd60bfff16e77735afc6b Mon Sep 17 00:00:00 2001 From: Michiyamenotehifunana <31995558+Michiyamenotehifunana@users.noreply.github.com> Date: Tue, 3 Oct 2017 17:24:36 +0800 Subject: [PATCH 073/141] Brings 10mm Soporific Description in-line with its nerfed stats D'oh. Completely forgot about this. Now no one can complain that their rape gun instructions tell them 2 shots is enough when 3 is what you actually need. --- code/modules/uplink/uplink_item_cit.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/uplink/uplink_item_cit.dm b/code/modules/uplink/uplink_item_cit.dm index 3aa1fd8bb1..40c74269eb 100644 --- a/code/modules/uplink/uplink_item_cit.dm +++ b/code/modules/uplink/uplink_item_cit.dm @@ -55,7 +55,7 @@ /datum/uplink_item/ammo/pistolzzz name = "10mm Soporific Magazine" desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. Loaded with soporific rounds that put the target to sleep. \ - NOTE: Soporific is not instant acting due to the constraints of the round's scale. Will usually require two shots to take effect." + NOTE: Soporific is not instant acting due to the constraints of the round's scale. Will usually require three shots to take effect." item = /obj/item/ammo_box/magazine/m10mm/soporific cost = 2 From ebca0173f3c3f342005c878c43d27d54a1961d42 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Tue, 3 Oct 2017 12:32:58 +0300 Subject: [PATCH 074/141] makes /turf/Enter() faster, and also makes CollidedWith async (#31217) * makes /turf/Enter faster, maybe * waitfor false on atom/collidedwith --- code/game/atoms.dm | 1 + code/game/turfs/turf.dm | 36 +++++++++++++++--------------------- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 508459188b..0774253d47 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -189,6 +189,7 @@ /atom/proc/CollidedWith(atom/movable/AM) + set waitfor = FALSE return // Convenience proc to see if a container is open for chemistry handling diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 5bb90f618b..b02444281c 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -121,8 +121,6 @@ return FALSE /turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area) - if (!mover) - return TRUE // First, make sure it can leave its square if(isturf(mover.loc)) // Nothing but border objects stop you from leaving a tile, only one loop is needed @@ -131,32 +129,28 @@ mover.Collide(obstacle) return FALSE - var/list/large_dense = list() - - //Next, check objects to block entry that are on the border - for(var/atom/movable/border_obstacle in src) - if(border_obstacle.flags_1 & ON_BORDER_1) - if(!border_obstacle.CanPass(mover, mover.loc, 1) && (forget != border_obstacle)) - mover.Collide(border_obstacle) - return FALSE - else - large_dense += border_obstacle - //Then, check the turf itself if (!src.CanPass(mover, src)) mover.Collide(src) return FALSE - //Finally, check objects/mobs to block entry that are not on the border - var/atom/movable/tompost_bump + + var/atom/movable/topmost_bump var/top_layer = FALSE - for(var/atom/movable/obstacle in large_dense) + + //Next, check objects to block entry that are on the border + for(var/atom/movable/obstacle in src) if(!obstacle.CanPass(mover, mover.loc, 1) && (forget != obstacle)) - if(obstacle.layer > top_layer) - tompost_bump = obstacle - top_layer = obstacle.layer - if(tompost_bump) - mover.Collide(tompost_bump) + if(obstacle.flags_1 & ON_BORDER_1) + mover.Collide(obstacle) + return FALSE + else + if(obstacle.layer > top_layer) + topmost_bump = obstacle + top_layer = obstacle.layer + + if(topmost_bump) + mover.Collide(topmost_bump) return FALSE return TRUE //Nothing found to block so return success! From 3b3b45c03c7cbf65df5727cd62d23207b60cf100 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Tue, 3 Oct 2017 02:37:16 -0700 Subject: [PATCH 076/141] Fixes/tweaks wormholes event and portals (#30846) * fix * THERE WE GO * Update portals.dm --- code/game/objects/effects/portals.dm | 6 +++--- code/modules/events/wormholes.dm | 9 ++------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 7b53b6c531..8bf0580e15 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -39,10 +39,10 @@ /obj/effect/portal/attackby(obj/item/W, mob/user, params) if(user && Adjacent(user)) - teleport(user) + user.forceMove(get_turf(src)) /obj/effect/portal/Crossed(atom/movable/AM, oldloc) - if(get_turf(oldloc) == get_turf(linked)) + if(linked && (get_turf(oldloc) == get_turf(linked))) return ..() if(!teleport(AM)) return ..() @@ -52,7 +52,7 @@ /obj/effect/portal/attack_hand(mob/user) if(Adjacent(user)) - teleport(user) + user.forceMove(get_turf(src)) /obj/effect/portal/Initialize(mapload, _creator, _lifespan = 0, obj/effect/portal/_linked, automatic_link = FALSE, turf/hard_target_override, atmos_link_override) . = ..() diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index 00b4ce4e98..74169df074 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -26,7 +26,7 @@ for(var/i = 1, i <= number_of_wormholes, i++) var/turf/T = pick(pick_turfs) - wormholes += new /obj/effect/portal/wormhole(T, null, 300, null, FALSE) + wormholes += new /obj/effect/portal/wormhole(T, null, 0, null, FALSE) /datum/round_event/wormholes/announce() priority_announce("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert", 'sound/ai/spanomalies.ogg') @@ -40,6 +40,7 @@ /datum/round_event/wormholes/end() QDEL_LIST(wormholes) + wormholes = null /obj/effect/portal/wormhole name = "wormhole" @@ -48,12 +49,6 @@ icon_state = "anom" mech_sized = TRUE -/obj/effect/portal/wormhole/attack_hand(mob/user) - teleport(user) - -/obj/effect/portal/wormhole/attackby(obj/item/I, mob/user, params) - teleport(user) - /obj/effect/portal/wormhole/teleport(atom/movable/M) if(istype(M, /obj/effect)) //sparks don't teleport return From f870b66b3173d5fde0a17b3e3f85a285fe7d3729 Mon Sep 17 00:00:00 2001 From: MoreRobustThanYou Date: Tue, 3 Oct 2017 05:39:41 -0400 Subject: [PATCH 078/141] Makes antimatter code less shit (#31219) * Antimatter shielding that can't find a control unit won't delete itself anymore * Update shielding.dm * Update shielding.dm * Update shielding.dm * Update shielding.dm * Update shielding.dm * Update shielding.dm * gthruhru * thanks Antur --- code/modules/power/antimatter/shielding.dm | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index e6814c5c0a..39353737bb 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -32,16 +32,24 @@ . = ..() addtimer(CALLBACK(src, .proc/controllerscan), 10) +/obj/machinery/am_shielding/proc/overheat() + visible_message("[src] melts!") + new /obj/effect/hotspot(loc) + qdel(src) + +/obj/machinery/am_shielding/proc/collapse() + visible_message("[src] collapses back into a container!") + new /obj/item/device/am_shielding_container(drop_location()) + qdel(src) /obj/machinery/am_shielding/proc/controllerscan(priorscan = 0) //Make sure we are the only one here - if(!istype(src.loc, /turf)) - qdel(src) - return + if(!isturf(loc)) + collapse() for(var/obj/machinery/am_shielding/AMS in loc.contents) if(AMS == src) continue - qdel(src) + collapse() return //Search for shielding first @@ -59,7 +67,7 @@ if(!priorscan) addtimer(CALLBACK(src, .proc/controllerscan, 1), 20) return - qdel(src) + collapse() /obj/machinery/am_shielding/Destroy() @@ -67,7 +75,6 @@ control_unit.remove_shielding(src) if(processing) shutdown_core() - visible_message("The [src.name] melts!") //Might want to have it leave a mess on the floor but no sprites for now return ..() @@ -209,7 +216,7 @@ if(injecting_fuel && control_unit) control_unit.exploding = 1 if(src) - qdel(src) + overheat() return From cdfc5ffc0c19400ba0075e00b6c87835b5eec0b4 Mon Sep 17 00:00:00 2001 From: Leo Date: Tue, 3 Oct 2017 08:18:16 -0300 Subject: [PATCH 080/141] Merge pull request #31231 from AnturK/longenoughiruntimelogtopissmeoff Fixes alt-click runtime --- code/_onclick/click.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 2bd1d01431..99d12568bc 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -359,7 +359,6 @@ else user.listed_turf = T user.client.statpanel = T.name - user.Stat() //responsive ui pls /mob/proc/TurfAdjacent(turf/T) return T.Adjacent(src) From a64e2fd25e83ebbd20659b187ae33fdaf04a1ef1 Mon Sep 17 00:00:00 2001 From: Leo Date: Tue, 3 Oct 2017 08:18:02 -0300 Subject: [PATCH 082/141] Merge pull request #31233 from kevinz000/patch-306 Fixes floating bullet holes --- code/game/turfs/closed.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 69b1f345b1..c9eb1a6762 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -156,7 +156,7 @@ /turf/closed/bullet_act(obj/item/projectile/Proj) . = ..() - if(!Proj.nodamage && (Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + if((. != -1) && !Proj.nodamage && (Proj.damage_type == BRUTE || Proj.damage_type == BURN)) var/mutable_appearance/bullet_hole = mutable_appearance('icons/effects/effects.dmi', "bullet_hole", BULLET_HOLE_LAYER) var/random_x = rand(-13, 13) From 0888d3944eee3abc2e14968e1a27b4b5e3bb9668 Mon Sep 17 00:00:00 2001 From: Leo Date: Tue, 3 Oct 2017 08:19:48 -0300 Subject: [PATCH 084/141] Merge pull request #31210 from MoreRobustThanYou/patch-7 Silicons can no longer take brain damage --- code/modules/mob/living/silicon/damage_procs.dm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index 07e6994db5..0f2c57c4fe 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -15,7 +15,7 @@ /mob/living/silicon/apply_effect(effect = 0,effecttype = STUN, blocked = FALSE) - return 0 //The only effect that can hit them atm is flashes and they still directly edit so this works for now + return FALSE //The only effect that can hit them atm is flashes and they still directly edit so this works for now /mob/living/silicon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) //immune to tox damage return FALSE @@ -30,8 +30,13 @@ return FALSE /mob/living/silicon/adjustStaminaLoss(amount, updating_stamina = 1)//immune to stamina damage. - return + return FALSE /mob/living/silicon/setStaminaLoss(amount, updating_stamina = 1) - return + return FALSE +/mob/living/silicon/adjustBrainLoss(amount) + return FALSE + +/mob/living/silicon/setBrainLoss(amount) + return FALSE From f4ce4a3a2718bba69703eca1808a04fd0b407327 Mon Sep 17 00:00:00 2001 From: Kevak Date: Tue, 3 Oct 2017 08:03:03 -0700 Subject: [PATCH 086/141] Shock Collars Are Now A Thing. Exactly what it says on the tin. --- .../items/devices/radio/electropack.dm | 71 +++++++++++++++++- .../research/designs/autolathe_designs.dm | 8 ++ icons/mob/neck.dmi | Bin 40497 -> 40711 bytes icons/obj/clothing/neck.dmi | Bin 2764 -> 3116 bytes 4 files changed, 78 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 8b27659ada..2c4d0dd76a 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -143,4 +143,73 @@ Code: "} user << browse(dat, "window=radio") onclose(user, "radio") - return \ No newline at end of file + return + +/obj/item/device/electropack/shockcollar + name = "shock collar" + desc = "A reinforced metal collar. It seems to have some form of wiring near the front. Strange.." + icon = 'icons/obj/clothing/neck.dmi' + icon_state = "shockcollar" + item_state = "shockcollar" + body_parts_covered = NECK + slot_flags = SLOT_NECK + w_class = WEIGHT_CLASS_SMALL + strip_delay = 60 + equip_delay_other = 60 + materials = list(MAT_METAL=5000, MAT_GLASS=2000) + +/obj/item/device/electropack/shockcollar/attack_hand(mob/user) + if(loc == user) + if(slot_flags == SLOT_NECK) + to_chat(user, "The collar is fastened tight! You'll need help taking this off!") + return + ..() + +/obj/item/device/electropack/shockcollar/receive_signal(datum/signal/signal) + if(!signal || signal.encryption != code) + return + + if(isliving(loc) && on) + if(shock_cooldown != 0) + return + shock_cooldown = 1 + spawn(100) + shock_cooldown = 0 + var/mob/living/L = loc + step(L, pick(GLOB.cardinals)) + + to_chat(L, "You feel a sharp shock from the collar!") + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(3, 1, L) + s.start() + + L.Knockdown(100) + + if(master) + master.receive_signal() + return + +/obj/item/device/electropack/shockcollar/attack_self(mob/user) //Turns out can't fully source this from the parent item, spritepath gets confused if power toggled. Will come back to this when I know how to code better and readd powertoggle.. + + if(!ishuman(user)) + return + user.set_machine(src) + var/dat = {"
+Frequency/Code for shock collar:
+Frequency: +
- +- [format_frequency(frequency)] ++ ++
+ +Code: +- +- [code] ++ ++
+"} + + user << browse(dat, "window=radio") + onclose(user, "radio") + return + diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 5d089739d1..946ec70d38 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -608,6 +608,14 @@ build_path = /obj/item/device/electropack category = list("hacked", "Tools") +/datum/design/shock_collar + name = "Shock Collar" + id = "shock_collar" + build_type = AUTOLATHE + materials = list(MAT_METAL = 5000, MAT_GLASS = 2000) + build_path = /obj/item/device/electropack/shockcollar + category = list("hacked", "Security") + /datum/design/large_welding_tool name = "Industrial Welding Tool" id = "large_welding_tool" diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi index fb43ae85ec0e094f361fee3d9604e5d6580e412f..17f9d3ade4b00687b5cb04d195bff8d8c9d2ddc0 100644 GIT binary patch delta 20149 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 delta 19892 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 diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 40c4aa03bc72c8232368f640c2d77576b4ff33bd..c41db68326388b8ba1db35a2e4dbda380f257fa1 100644 GIT binary patch delta 2818 zcmV+d3;p!W6|5MLBmsl5B_{!YLPA2qt2a(gPCGk0baZrQXJCZ#B9DiX_oG|z?%@nVuj;BJ=s!N6ccV`35=K#b-x1RE*JG-2B_;`r3Y zUt~`$)a-2hgc?iEz!p-Ww+mlNeV7@(4MEd5@1?Ob9xAEC%VT!w59j^==lKQKhWGq8 z*;)1g010nNL_t(|obBBITN+0i0Py9DF=7-%*<3D{aEGQnWtFObg>qC8)N2ER3bh*B zCW@r-YR`OW)7s=r?*8<9-T#d%diVGH)#IL_8%m*f_@+|m8wp%X=pVhM7JA0iLhra*=nDpd*AebVw06oVM?Fv9W6jA^ofs+!z}3z%rzg=)E~S?uBJYB+)k!41#VV zFk%yiTP`H<)@aBN%aBT8@n_3P7w7zvBLyXA4otl!aJs>V60%km@UnLLfSKL1xK4xrx1>O%w|J)`dfQ$$AtLBjj6g+tXvGqaq@+`Ik{}K&1Cpk>{1dl9U4{RSO zq>9%I+Xo6M-^2(eF=+FFFgAV9@-iHok@8^sKp|PYL(u-PMazNS;bCZh*rEv_WROj> zeFEY|Y!!ABC`=qR*5Y|(NcoL_{H^4%0dY4<~aV1UmuD`K0F=WGVT^0LKuO9%-c z;|<-QwqP&g4c{cTU?0yPZg98=?Z5{tg&)TtW@JD=@^9?qltALo%L zti}?51fVp5Oo$0&K>oxE8gadJ!gR&A4!kD;z^w;(=w*M+msN~T_ z0I8#k3B+I-l%8QsA+EfcSj^_blZ(S&N!=$Gkx2AM=$|!ta-hL@ zpM0{o*e_s%Cl?xwhd~RMSkU)y8ee8X3^s5&KqcdGBeBSVhG7u*|1=UwMv{~u_1W}v zdODr@8|BM9n3o<h(8;!95LeXgCKuAyoW*F;43UnHOhXl@TE-!yEC(oeHQ%E)%!vLJJ(d4qwK|Uq# zujf;#)Mr@7R020Lnat-{$Fc#6iKq>rxQ^~~xDq>rp&zm;ceG*H8kHx6WfwITs# zq0J=ejlyYsb8Q(;Q^ZDMsSeR;TBn%RFbA4P8VMkx+Q#(!G%P}L6TvmO0*jCsZ1k6A zBWw{ug&;8zH#?1_N&uLnZ|^+5xi+^+jWuD-MrZ|sOAzPHBaIB0R0;HadK&s59qSvb zE9)dsY{8bPZUM5X1)?DuA<<`lk_w>nxY$W3pzh~W+$fe7U}ABR^%+(y#F;Rc&8h%; zKCjFmq;Nx(L5{NY8q4^6d>+oxiwT3}60Gu5bx!5G!uTe=1~oNsL0gE=#}NfUrUSD2 zX59^)KXeOJvjV?_#{%XNCp&>xAol@iW>RYhK7_}Y3IEyZ}LT;ASxO=Az_?d%i_1!5d|ySwF5$yHS| zIImc#ROCX=D_5)4{s@bV_tjT>dvaiz@xK0gf4^Tq#>0>c%Z!K7Ct;yj+2g=su_zfY zm8<(4ST2`c*MYB6;6N;Y6$!9ZEpZ^0N*{rulI`OHC@R@~AM}{LLPhY3Mf)Nwm-kCm z!7G<#i}2vl!6W!O=v1J7KhCSklT``MtI3mB34An*PK6HdFYbU)G#V*z7lfkGNP+nI z?AoEw>HWnb;1rFfTn3z~(KJ4{bD-+|P#{2TG@8BkMgs)`#73ik*|#?uTtC+9hXa-G z=M^j(4VJPU2o)?E4VJRKj$v*d9UeXsGbNA1Lxm9DuW8i#p@t!E9LQ>=4G1+1dE-D< zE0RWYaB%p|H-}0ejH`sr?=~OSFbA4PnpPjyFbA4Pnhys!kJAAag2YO}>@;mv0u_S9 zYRT+0#CEKj!mEsbQvohP+%k_eEkJMy;h`I6N82fE z6%YkLrUSBNd{^5oZI=)QK&At-o4{}3v4eTU$*$lP$d>Vc@8GeEdBn-C;uXkl0w2TU zTZRH$0k24I#uIpa$54PP;T6d)$77L4jze;5JP~>1I3&9sj|I|>s{1Ac+o}HbsDu(MB0DtH*@T4I;vMxs}ki*QYHEKVe zomw+?dV2O_*W1kr?=NPzkqChnji$v+w?uf<_M?A)I{s%0A08*HQ4>53h0*)>qY|GM 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 Date: Tue, 3 Oct 2017 11:29:15 -0500 Subject: [PATCH 087/141] Automatic changelog generation for PR #3086 [ci skip] --- html/changelogs/AutoChangeLog-pr-3086.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3086.yml diff --git a/html/changelogs/AutoChangeLog-pr-3086.yml b/html/changelogs/AutoChangeLog-pr-3086.yml new file mode 100644 index 0000000000..90798d5475 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3086.yml @@ -0,0 +1,4 @@ +author: "Toriate" +delete-after: True +changes: + - spellcheck: "uplink description for soporific magazines now correctly says at least three shots are needed, rather than two" From 5fdeb55876dd7158522e303bde60ba7dae06f6d3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Oct 2017 11:29:49 -0500 Subject: [PATCH 088/141] Automatic changelog generation for PR #3088 [ci skip] --- html/changelogs/AutoChangeLog-pr-3088.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3088.yml diff --git a/html/changelogs/AutoChangeLog-pr-3088.yml b/html/changelogs/AutoChangeLog-pr-3088.yml new file mode 100644 index 0000000000..1f32d861a6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3088.yml @@ -0,0 +1,5 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Wormhole event wormholes now actually teleport you." + - bugfix: "portals now actually teleport on click." From ca61069ecbae7ba45c9779f6489e071db161d453 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Oct 2017 11:30:04 -0500 Subject: [PATCH 089/141] Automatic changelog generation for PR #3089 [ci skip] --- html/changelogs/AutoChangeLog-pr-3089.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3089.yml diff --git a/html/changelogs/AutoChangeLog-pr-3089.yml b/html/changelogs/AutoChangeLog-pr-3089.yml new file mode 100644 index 0000000000..0ee37ab23d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3089.yml @@ -0,0 +1,4 @@ +author: "Thefastfoodguy" +delete-after: True +changes: + - bugfix: "Antimatter shielding that can't find a control unit won't delete itself anymore" From 06fe1e8da6af4523a454d88cbbde118f0abcfd3d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Oct 2017 11:32:21 -0500 Subject: [PATCH 090/141] Automatic changelog generation for PR #3092 [ci skip] --- html/changelogs/AutoChangeLog-pr-3092.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3092.yml diff --git a/html/changelogs/AutoChangeLog-pr-3092.yml b/html/changelogs/AutoChangeLog-pr-3092.yml new file mode 100644 index 0000000000..efb4de6d35 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3092.yml @@ -0,0 +1,4 @@ +author: "Thefastfoodguy" +delete-after: True +changes: + - bugfix: "Silicons can no longer take brain damage" From ba99e3845a9d5074fd8415f01ca973f5a0db5555 Mon Sep 17 00:00:00 2001 From: Kevak Date: Tue, 3 Oct 2017 12:12:52 -0700 Subject: [PATCH 091/141] Added normal collar functionality. You can now name your victim's collars on top of other functionality. --- .../items/devices/radio/electropack.dm | 49 +++++++++++-------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 2c4d0dd76a..513ffb8d2b 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -157,6 +157,7 @@ Code: strip_delay = 60 equip_delay_other = 60 materials = list(MAT_METAL=5000, MAT_GLASS=2000) + var/tagname = null /obj/item/device/electropack/shockcollar/attack_hand(mob/user) if(loc == user) @@ -190,26 +191,34 @@ Code: return /obj/item/device/electropack/shockcollar/attack_self(mob/user) //Turns out can't fully source this from the parent item, spritepath gets confused if power toggled. Will come back to this when I know how to code better and readd powertoggle.. + var/option = "Change Name" + option = input(user, "What do you want to do?", "[src]", option) as null|anything in list("Change Name", "Change Frequency") + switch(option) + if("Change Name") + var/t = input(user, "Would you like to change the name on the tag?", "Name your new pet", tagname ? tagname : "Spot") as null|text + if(t) + tagname = copytext(sanitize(t), 1, MAX_NAME_LEN) + name = "[initial(name)] - [tagname]" + if("Change Frequency") + if(!ishuman(user)) + return + user.set_machine(src) + var/dat = {"
+ Frequency/Code for shock collar:
+ Frequency: + - + - [format_frequency(frequency)] + + + +
- if(!ishuman(user)) - return - user.set_machine(src) - var/dat = {"
-Frequency/Code for shock collar:
-Frequency: -- -- [format_frequency(frequency)] -+ -+
+ Code: + - + - [code] + + + +
+
"} -Code: -- -- [code] -+ -+
-
"} - - user << browse(dat, "window=radio") - onclose(user, "radio") - return + user << browse(dat, "window=radio") + onclose(user, "radio") + return From fd5acc55736fc83c9f3bd6783da20be2c59360d0 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sun, 1 Oct 2017 13:32:02 +0200 Subject: [PATCH 092/141] Organ initialization cleanup --- code/modules/mob/living/brain/brain_item.dm | 10 +- code/modules/mob/living/carbon/human/human.dm | 31 +-- .../mob/living/carbon/human/species.dm | 184 +++++++++++------- .../carbon/human/species_types/skeletons.dm | 16 ++ .../carbon/human/species_types/zombies.dm | 4 +- code/modules/surgery/organs/organ_internal.dm | 2 + 6 files changed, 138 insertions(+), 109 deletions(-) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 13a34b6bae..fbff6a5285 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -18,12 +18,12 @@ vital = FALSE decoy_override = TRUE -/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0) +/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE) ..() name = "brain" - if(C.mind && C.mind.changeling) //congrats, you're trapped in a body you don't control + if(C.mind && C.mind.changeling && !no_id_transfer) //congrats, you're trapped in a body you don't control if(brainmob && !(C.stat == DEAD || (C.status_flags & FAKEDEATH))) to_chat(brainmob, "You can't feel your body! You're still just a brain!") loc = C @@ -44,13 +44,17 @@ //Update the body's icon so it doesnt appear debrained anymore C.update_hair() -/obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0) +/obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0,no_id_transfer = FALSE) ..() +<<<<<<< HEAD if(!special) if(C.has_brain_worms()) var/mob/living/simple_animal/borer/B = C.has_brain_worms() B.leave_victim() //Should remove borer if the brain is removed - RR if(!gc_destroyed || (owner && !owner.gc_destroyed)) +======= + if((!gc_destroyed || (owner && !owner.gc_destroyed)) && !no_id_transfer) +>>>>>>> 85cd9e6... Organ initialization cleanup transfer_identity(C) C.update_hair() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d66e6f808a..70a5f5225c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -21,41 +21,12 @@ set_species(dna.species.type) //initialise organs - create_internal_organs() + create_internal_organs() //most of it is done in set_species now, this is only for parent call handcrafting = new() . = ..() -/mob/living/carbon/human/create_internal_organs() - if(!(NOHUNGER in dna.species.species_traits)) - internal_organs += new /obj/item/organ/appendix - if(!(NOBREATH in dna.species.species_traits)) - if(dna.species.mutantlungs) - internal_organs += new dna.species.mutantlungs() - else - internal_organs += new /obj/item/organ/lungs() - if(!(NOBLOOD in dna.species.species_traits)) - internal_organs += new /obj/item/organ/heart - - if(!(NOLIVER in dna.species.species_traits)) - if(dna.species.mutantliver) - internal_organs += new dna.species.mutantliver() - else - internal_organs += new /obj/item/organ/liver() - - if(!(NOSTOMACH in dna.species.species_traits)) - if(dna.species.mutantstomach) - internal_organs += new dna.species.mutantstomach() - else - internal_organs += new /obj/item/organ/stomach() - - internal_organs += new dna.species.mutanteyes - internal_organs += new dna.species.mutantears - internal_organs += new dna.species.mutanttongue - internal_organs += new /obj/item/organ/brain - ..() - /mob/living/carbon/human/OpenCraftingMenu() handcrafting.ui_interact(src) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 07f3acea48..34d4ae8e51 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -68,7 +68,8 @@ //Flight and floating var/override_float = 0 - + + var/obj/item/organ/brain/mutant_brain = /obj/item/organ/brain var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes var/obj/item/organ/ears/mutantears = /obj/item/organ/ears var/obj/item/mutanthands @@ -123,6 +124,113 @@ return 0 return 1 +//Will regenerate missing organs +/datum/species/proc/regenerate_organs(mob/living/carbon/C,datum/species/old_species,replace_current=TRUE) + var/obj/item/organ/brain/brain = C.getorganslot("brain") + var/obj/item/organ/heart/heart = C.getorganslot("heart") + var/obj/item/organ/lungs/lungs = C.getorganslot("lungs") + var/obj/item/organ/appendix/appendix = C.getorganslot("appendix") + var/obj/item/organ/eyes/eyes = C.getorganslot("eye_sight") + var/obj/item/organ/ears/ears = C.getorganslot("ears") + var/obj/item/organ/tongue/tongue = C.getorganslot("tongue") + var/obj/item/organ/liver/liver = C.getorganslot("liver") + var/obj/item/organ/stomach/stomach = C.getorganslot("stomach") + + var/should_have_brain = TRUE + var/should_have_heart = !(NOBLOOD in species_traits) + var/should_have_lungs = !(NOBREATH in species_traits) + var/should_have_appendix = !(NOHUNGER in species_traits) + var/should_have_eyes = TRUE + var/should_have_ears = TRUE + var/should_have_tongue = TRUE + var/should_have_liver = !(NOLIVER in species_traits) + var/should_have_stomach = !(NOSTOMACH in species_traits) + + if(brain && (replace_current || !should_have_brain)) + if(!brain.decoy_override)//Just keep it if it's fake + brain.Remove(C,TRUE,TRUE) + QDEL_NULL(brain) + if(should_have_brain && !brain) + brain = new mutant_brain() + brain.Insert(C, TRUE, TRUE) + + if(heart && (!should_have_heart || replace_current)) + heart.Remove(C,1) + QDEL_NULL(heart) + if(should_have_heart && !heart) + heart = new() + heart.Insert(C) + + if(lungs && (replace_current || !should_have_lungs)) + lungs.Remove(C,1) + QDEL_NULL(lungs) + if(should_have_lungs && !lungs) + if(mutantlungs) + lungs = new mutantlungs() + else + lungs = new() + lungs.Insert(C) + + if(liver && (!should_have_liver || replace_current)) + liver.Remove(C,1) + QDEL_NULL(liver) + if(should_have_liver && !liver) + if(mutantliver) + liver = new mutantliver() + else + liver = new() + liver.Insert(C) + + if(stomach && (!should_have_stomach || replace_current)) + stomach.Remove(C,1) + QDEL_NULL(stomach) + if(should_have_stomach && !stomach) + if(mutantstomach) + stomach = new mutantstomach() + else + stomach = new() + stomach.Insert(C) + + if(appendix && (!should_have_appendix || replace_current)) + appendix.Remove(C,1) + QDEL_NULL(appendix) + if(should_have_appendix && !appendix) + appendix = new() + appendix.Insert(C) + + if(C.get_bodypart("head")) + if(eyes && (replace_current || !should_have_eyes)) + eyes.Remove(C,1) + QDEL_NULL(eyes) + if(should_have_eyes && !eyes) + eyes = new mutanteyes + eyes.Insert(C) + + if(ears && (replace_current || !should_have_ears)) + ears.Remove(C,1) + QDEL_NULL(ears) + if(should_have_ears && !ears) + ears = new mutantears + ears.Insert(C) + + if(tongue && (replace_current || !should_have_tongue)) + tongue.Remove(C,1) + QDEL_NULL(tongue) + if(should_have_tongue && !tongue) + tongue = new mutanttongue + tongue.Insert(C) + + if(old_species) + for(var/mutantorgan in old_species.mutant_organs) + var/obj/item/organ/I = C.getorgan(mutantorgan) + if(I) + I.Remove(C) + QDEL_NULL(I) + + for(var/path in mutant_organs) + var/obj/item/organ/I = new path() + I.Insert(C) + /datum/species/proc/on_species_gain(mob/living/carbon/C, datum/species/old_species) // Drop the items the new species can't wear for(var/slot_id in no_equip) @@ -138,79 +246,7 @@ if(DIGITIGRADE in species_traits) C.Digitigrade_Leg_Swap(FALSE) - var/obj/item/organ/heart/heart = C.getorganslot("heart") - var/obj/item/organ/lungs/lungs = C.getorganslot("lungs") - var/obj/item/organ/appendix/appendix = C.getorganslot("appendix") - var/obj/item/organ/eyes/eyes = C.getorganslot("eye_sight") - var/obj/item/organ/ears/ears = C.getorganslot("ears") - var/obj/item/organ/tongue/tongue = C.getorganslot("tongue") - - var/obj/item/organ/liver/liver = C.getorganslot("liver") - var/obj/item/organ/stomach/stomach = C.getorganslot("stomach") - - - - if((NOBLOOD in species_traits) && heart) - heart.Remove(C) - qdel(heart) - else if((!(NOBLOOD in species_traits)) && (!heart)) - heart = new() - heart.Insert(C) - - if(lungs) - qdel(lungs) - lungs = null - - QDEL_NULL(liver) - - QDEL_NULL(stomach) - - if(C.get_bodypart("head")) - if(eyes) - qdel(eyes) - eyes = new mutanteyes - eyes.Insert(C) - - if(ears) - qdel(ears) - ears = new mutantears - ears.Insert(C) - - if(tongue) - qdel(tongue) - tongue = new mutanttongue - tongue.Insert(C) - - if((!(NOBREATH in species_traits)) && !lungs) - if(mutantlungs) - lungs = new mutantlungs() - else - lungs = new() - lungs.Insert(C) - - if((!(NOLIVER in species_traits)) && (!liver)) - if(mutantliver) - liver = new mutantliver() - else - liver = new() - liver.Insert(C) - - if((!(NOSTOMACH in species_traits)) && (!stomach)) - if(mutantstomach) - stomach = new mutantstomach() - else - stomach = new() - stomach.Insert(C) - - if((NOHUNGER in species_traits) && appendix) - qdel(appendix) - else if((!(NOHUNGER in species_traits)) && (!appendix)) - appendix = new() - appendix.Insert(C) - - for(var/path in mutant_organs) - var/obj/item/organ/I = new path() - I.Insert(C) + regenerate_organs(C,old_species) if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype) C.dna.blood_type = exotic_bloodtype diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index 4302c43ff8..f9c731a4ce 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /datum/species/skeleton // 2spooky name = "Spooky Scary Skeleton" @@ -11,3 +12,18 @@ damage_overlay_type = ""//let's not show bloody wounds or burns over bones. disliked_food = NONE liked_food = NONE +======= +/datum/species/skeleton + // 2spooky + name = "Spooky Scary Skeleton" + id = "skeleton" + say_mod = "rattles" + blacklisted = 1 + sexes = 0 + meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton + species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYDISMEMBER,EASYLIMBATTACHMENT) + mutanttongue = /obj/item/organ/tongue/bone + damage_overlay_type = ""//let's not show bloody wounds or burns over bones. + disliked_food = NONE + liked_food = GROSS | MEAT | RAW +>>>>>>> 85cd9e6... Organ initialization cleanup diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 04123102c0..4ce8570c2b 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -9,7 +9,7 @@ blacklisted = 1 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,NOZOMBIE,EASYDISMEMBER,EASYLIMBATTACHMENT,NOTRANSSTING) - mutant_organs = list(/obj/item/organ/tongue/zombie) + mutanttongue = /obj/item/organ/tongue/zombie var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg') disliked_food = NONE liked_food = NONE @@ -64,6 +64,6 @@ limbs_id = "zombie" //They look like zombies sexes = 0 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie - mutant_organs = list(/obj/item/organ/tongue/zombie) + mutanttongue = /obj/item/organ/tongue/zombie #undef REGENERATION_DELAY diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index f5a00d24cb..4fdda7a7bc 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -10,6 +10,8 @@ var/slot // DO NOT add slots with matching names to different zones - it will break internal_organs_slot list! var/vital = 0 + //Was this organ implanted/inserted/etc, if true will not be removed during species change. + var/external = FALSE /obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) From 49a354d752a27436e30b27647746352bf2b1b77f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Oct 2017 14:22:46 -0500 Subject: [PATCH 093/141] Automatic changelog generation for PR #2922 [ci skip] --- html/changelogs/AutoChangeLog-pr-2922.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2922.yml diff --git a/html/changelogs/AutoChangeLog-pr-2922.yml b/html/changelogs/AutoChangeLog-pr-2922.yml new file mode 100644 index 0000000000..f46c3136a6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2922.yml @@ -0,0 +1,6 @@ +author: "Daniel0Mclovin" +delete-after: True +changes: + - rscadd: "Podpeople to roundstart" + - tweak: "Modified podpeople heatmod from 1.25 to 1.5" + - tweak: "plant-b-gone now does roughly 7 damage per tick on podpeople" From 159835db24f68cd5e6bb996076efd758811170fc Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Tue, 3 Oct 2017 15:30:42 -0500 Subject: [PATCH 094/141] Fixes humans having no examine feedback for soft crit (#31247) * Soft crit examine * Concise --- code/modules/mob/living/carbon/human/examine.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 74ccdab19c..0ca0bed9fc 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -277,9 +277,11 @@ if(!appears_dead) if(stat == UNCONSCIOUS) msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n" - else if(getBrainLoss() >= 60) - msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n" - + else + if(getBrainLoss() >= 60) + msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n" + if(InCritical()) + msg += "[t_He] is barely concious.\n" if(getorgan(/obj/item/organ/brain)) if(istype(src, /mob/living/carbon/human/interactive)) var/mob/living/carbon/human/interactive/auto = src From d98cd745ddec5a4221f937e3c6b2c16d4026f2fb Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Tue, 3 Oct 2017 18:11:06 -0400 Subject: [PATCH 096/141] Fixes morgue maintenance radstorm protection (#31253) * Morgue maint area * Fixed typo --- _maps/map_files/BoxStation/BoxStation.dmm | 199 ++++++++++++++++-- .../map_files/Deltastation/DeltaStation2.dmm | 119 ++++++++--- code/game/area/Space_Station_13_areas.dm | 6 +- icons/turf/areas.dmi | Bin 32943 -> 33086 bytes 4 files changed, 269 insertions(+), 55 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index dcd0717e29..1ef76788eb 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -24665,7 +24665,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, -/area/maintenance/aft) +/area/maintenance/department/medical/morgue) "bgp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/white, @@ -26862,7 +26862,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/maintenance/aft) +/area/maintenance/department/medical/morgue) "blh" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/eastright{ @@ -26940,7 +26940,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/maintenance/aft) +/area/maintenance/department/medical/morgue) "blp" = ( /obj/machinery/power/apc{ dir = 8; @@ -26974,7 +26974,7 @@ dir = 4 }, /turf/open/floor/plating, -/area/maintenance/aft) +/area/maintenance/department/medical/morgue) "blr" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -29030,7 +29030,7 @@ }, /obj/structure/disposalpipe/segment, /turf/open/floor/plating, -/area/maintenance/aft) +/area/maintenance/department/medical/morgue) "bpR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment{ @@ -60163,7 +60163,7 @@ icon_state = "2-4" }, /turf/open/floor/plating, -/area/maintenance/aft) +/area/maintenance/department/medical/morgue) "cHE" = ( /obj/machinery/door/airlock/maintenance{ name = "Mech Bay Maintenance"; @@ -63862,6 +63862,167 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"cTJ" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"cTK" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"cTL" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/open/floor/plasteel/black, +/area/medical/morgue) +"cTM" = ( +/obj/machinery/power/apc{ + dir = 4; + name = "Morgue Maintenance APC"; + areastring = "/area/maintenance/department/medical/morgue"; + pixel_x = 26 + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/open/floor/plasteel/black, +/area/medical/morgue) +"cTN" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"cTO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"cTP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"cTQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"cTR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"cTS" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"cTT" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"cTU" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"cTV" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) (1,1,1) = {" aaa @@ -103574,7 +103735,7 @@ bfL bhp biB biB -biB +cTL bkU bmX bpE @@ -103831,7 +103992,7 @@ bfL bhq bhm bkb -bhm +cTM bla bmZ bpH @@ -104346,7 +104507,7 @@ bfS biC bkd bfS -bKH +cTO bmZ bpJ brc @@ -104860,7 +105021,7 @@ bfS biE bkf bfS -bKH +cTP bmZ bpL bre @@ -105117,7 +105278,7 @@ bfS biD bke bfS -bKH +cTQ bmZ bpK brd @@ -105374,7 +105535,7 @@ bfS bfS bfS bfS -bKH +cTR bmZ bon bon @@ -105626,17 +105787,17 @@ aYV baR bcb bdl -bdO +cTJ cHD bgo -bPv -bPv +cTK +cTN blq -bna -bPv +cTS +cTT bpQ -bPv -bdO +cTU +cTV btm buy bvz diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 5809176275..efae305c74 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -91795,7 +91795,7 @@ "dwO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dwP" = ( /obj/machinery/door/firedoor, /obj/structure/cable/white{ @@ -91815,7 +91815,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dwQ" = ( /obj/structure/table/glass, /obj/item/clipboard, @@ -92448,7 +92448,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dyb" = ( /obj/structure/bed/roller, /obj/machinery/iv_drip, @@ -92456,12 +92456,12 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dyc" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dyd" = ( /obj/structure/cable/white{ d1 = 1; @@ -92470,7 +92470,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dye" = ( /obj/structure/table/glass, /obj/item/folder/white, @@ -92923,12 +92923,12 @@ "dzf" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/neutral, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dzg" = ( /obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dzh" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -92938,14 +92938,14 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dzi" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, /obj/item/storage/backpack/duffelbag/med, /obj/item/device/flashlight/pen, /turf/open/floor/plating, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dzj" = ( /turf/closed/wall, /area/crew_quarters/heads/cmo) @@ -93674,7 +93674,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dAw" = ( /obj/structure/cable/white{ d1 = 4; @@ -93687,7 +93687,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dAx" = ( /obj/structure/cable/white{ d1 = 4; @@ -93699,7 +93699,7 @@ dir = 1 }, /turf/open/floor/plating, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dAy" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -93712,7 +93712,7 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dAz" = ( /obj/structure/cable/white{ d1 = 1; @@ -93733,14 +93733,14 @@ dir = 4 }, /turf/open/floor/plasteel/neutral, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dAA" = ( /obj/structure/table, /obj/item/clothing/gloves/color/latex/nitrile, /obj/item/clothing/suit/apron/surgical, /obj/item/clothing/mask/breath/medical, /turf/open/floor/plating, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dAB" = ( /obj/structure/closet/secure_closet/CMO, /obj/item/clothing/under/rank/nursesuit, @@ -94324,7 +94324,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dBP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -94334,13 +94334,13 @@ dir = 4 }, /turf/open/floor/plasteel/neutral, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dBQ" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plating, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dBR" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -94350,7 +94350,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/neutral, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dBS" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -94359,7 +94359,7 @@ /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dBT" = ( /obj/machinery/light{ dir = 8 @@ -95032,15 +95032,15 @@ /obj/structure/closet/secure_closet/medical3, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dDe" = ( /obj/structure/closet/wardrobe/white/medical, /turf/open/floor/plating, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dDf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dDg" = ( /obj/structure/cable/white{ d1 = 1; @@ -95048,10 +95048,15 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, /turf/open/floor/plasteel/vault{ dir = 5 }, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dDh" = ( /obj/machinery/suit_storage_unit/cmo, /obj/effect/turf_decal/stripes/line{ @@ -95603,7 +95608,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/medical/morgue) +/area/maintenance/department/medical/morgue) "dEn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, @@ -113090,6 +113095,50 @@ /obj/structure/ore_box, /turf/open/floor/plating, /area/shuttle/auxillary_base) +"esz" = ( +/turf/closed/wall/r_wall, +/area/maintenance/department/medical/morgue) +"esA" = ( +/turf/closed/wall/r_wall, +/area/maintenance/department/medical/morgue) +"esB" = ( +/turf/closed/wall, +/area/maintenance/department/medical/morgue) +"esC" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/maintenance/department/medical/morgue) +"esD" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"esE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc{ + dir = 2; + name = "Morgue Maintenance APC"; + areastring = "/area/maintenance/department/medical/morgue"; + pixel_y = -26 + }, +/obj/structure/cable/white{ + d2 = 8; + icon_state = "0-8" + }, +/turf/open/floor/plasteel/vault{ + dir = 5 + }, +/area/maintenance/department/medical/morgue) +"esF" = ( +/turf/closed/wall, +/area/maintenance/department/medical/morgue) +"esG" = ( +/turf/closed/wall, +/area/maintenance/department/medical/morgue) +"esH" = ( +/turf/closed/wall, +/area/maintenance/department/medical/morgue) (1,1,1) = {" aaa @@ -155932,13 +155981,13 @@ drr dsR dur dvw -dwN +esz dya -dyY +esD dAw dBO dDd -dwK +esF dFd dGE dHP @@ -156189,13 +156238,13 @@ drs dsS drs dvx -dwN +esA dyb dzf dAx dBP dDe -dwK +esG dFe dGF dHP @@ -156960,13 +157009,13 @@ drv dlO dus dvA -dwK -dxS +esB +esC dzi dAA dBS -dxS -dwK +esE +esH dEY dGA dHP diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index 4846cc2bc2..c4b5c5caae 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -151,7 +151,11 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/maintenance/department/medical name = "Medbay Maintenance" - icon_state = "asmaint" + icon_state = "medbay_maint" + +/area/maintenance/department/medical/morgue + name = "Morgue Maintenance" + icon_state = "morgue_maint" /area/maintenance/department/science name = "Science Maintenance" diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index ae61dc28527201c82e6fc7abc5ab5201f2b1947b..cb5499487d406c4221ad91fe4809a622eac32164 100644 GIT binary patch literal 33086 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 Sp$-UmpojO=6wBnzU;Gc4a(pcS literal 32943 zcmagF2UJtt(=HymH0ec=CW0VM5KuZ&MBt?e(yJiSL3#}!f;4H;6r@N;Aasy~-a?UH z0--l4A#@T*2;BJozVG|rb=Uu{o3(akpE=1slYQpwdG^ecSUnweYKprQ004kmMdmkqccK{&ZdwQ0x$D$N%-x#Wt_6q_$ z07CM~UnKWyWD{yo7AYll3rPyrX?bpPH-@zXX&|vo%?EPJuB)YVgHJ>5C8F$4PqEet zq3#EYz}CguKV0Q4F7BZLzJawgmd7KO-fiI4qkBQtIyaljQQ43`eeuKbB986{SzB9u zFPv7VR#w6rKY<(=*uHALlxGEi}P(_&Z)c@cj~}d3B`DbdAzt zcUR{W@chlW|I2|k;nwFfs@W=lxPJQmt!G}86kgr%Q#QSjWX3rDFCI}mNd-|esyU@8 zNU`sa=UpQ{ZfC~x6F_!87eY1$#D5rK(TX{!e(-((DSbno&(7kGDFCtlTNs|*HM9*r#YAU z(;p8;o4f-`K{A? zV;K#ty~ksGFN!}H8yGiGJY}FNlAU|sYw(OQC7#VeoySX2pwl#vV)n&1dK=PQTh}Lu z+bz2C|Ga#TdYr<1^y%;W^sjqPqQYK6IRlAyb7HTp97U12X>I?^a}2DcDbp3*uMzx^ ztUegda+{l*c8pyTeD8hpsXJY^?srldyOg$hYhNAZqgO$}(knpB(%b9%$Z&ns zqI>;t%YfW$;~j!NmA4DxhhanyQsjN=FQ=X`sex7{8uWVQoRa1o$6~eK`_b(bD80)t z_3w1Qf&XEf3-vuV*rO#|dws7)N++o)`txhTQo_aVq;krTbYKm`@$Z6>g(st8jIvLq zo~!JoCsPzWyCcrDJ!n<+WVoE4n?2;^?zjc<0Iqt2t0+6b7Ol5^+{!FIhXH1@ zy)MN)dL`p$4*8>G25TrST++>#_i8Ma_o^+GXZHxd&H8?|a)bD+eAaVa@Y!;@m%n{p zy!FHlsc|L?ySj{&{|Is&bzGk8=g0jkkwL5S^VPndI|rwUuu=SsEo!2cr*W!`XGtV1 zB+9emX*kKA_lnT+l}jc5WQ&PNZe^nM6r%KrB{Y^n(I8X4xkRI3Zsg*DncOC)Mnk}W zeBD2t+4cXd{@Z@M|4QVwxxeo-#zSzOr|z}L7uwDfwpP6PO4A#*D3VdlqRZ*`g@R{f zN}76l@(En3L)tBS^?Q3&L0DyhwebXsId4kQa6)Urp}hw&Z81C8QaR;q`f#UCXTm!(Dx^3?>~J5U&GS9pE`!C64$q@4bI_4=_sE_pg*ZyBi}yw z$()fl>4Mp)jrrgmSH!cAZcGj}RcjV$GUOE!#J~M?jLUDCAiskq=^n$SEsG!6)O&+9 zwL0H!`z(c4PSU@h!z+1LtN&G6Zu_KXgg1{0kIbIX{rW}#OEUiU5Y5->|LzN!P6UvD zlL%5ytYH#d3x)qmG(Rf*vf(#f!;?R;Mf#!eHevL+c)^>t&rENga7gvMX;dk6CL=?p z`?=BV43*Oyp+6R+dGWh_n>{*|?y^2idoGUYF*P&Td*BJX4m)XgT@Gva_`Bv_k0&3oaCz}(y zeY^-xoV*8bfL9lZ zAp_X;6U@bN&KLAoLOCV2aAswp2%!&e1CxJ&$^)Dcb7m234l_!dH218jnQ2j;9PImnBv>KvW0D3M)V~QT!bcBjr=g4W9;M~ zxBEu`>g0u+J*c&9EQf$i0K7sYhxe;;QBXva_7!bZhY93*{XAg>8rD&q7dFtN*G*Kg z0Ac3-fpQDIE?&7Qo-;ZerVS@^48M?*6KG&BEr009)|XV`;-PMU1>T^|*DtZ57RAN| zk+`p@dnn7X>gw%7whqL$r~vNzFqJ#N+SXO`d6R$=AR+vor%LU8e#5H>?Gkvq&VQz~Y4bl)#H0G~81Lxp8-vka_ z7zFd-Km(`mm}Oef;kxinGhr!os?*9PrCaI)xW;-mbQf)H?5U{IvnA=gu06CH=oJ{I z>?S}pN~GGb-I!9)M=vR6XR@7e*tf<+VF_L5m$0IeNm$C99d&Eb-?6OOez+}iGRye& z1vtpAKMj{1@Iil;saD)T|AvSi0^9{UdL@XI265SRRN^KNJ8FM)uw@7R_U`AbE$xpZ zKWQwk@#M&#KK^ppw?PosVieDw`56A-tid?3tp`qw^)yXflSxv$K@VD&0ITH1{jhMX zO_lhf{od34%)j%-qO9Ylp_?Lk&a|PiC-_mY&!Diwp(;4txBYNu{IsE@O4-fgVQI5Z z&Zp8r(oE8^<-5$nLC#u1-fvBVKl?xq>c{r4&eD7rJ7)PA*uTT;O2*Gx+O0~v%y;tN ziI`WY4L5x?$^TK*^_1Jeh-GqhI6~qA@6{3)?E(08HuPnh1e1VU>Cd;!Rq2KmH<#0d zP_WTL9XvMX@A5lW>NF`8?E0RA%lIl$0gOR_=Po!`UZK5bOkpjf+4OMMMudQ9K~3ji zTYPK0Hq9A+HD+n&m8;}c`n7CEL97*iapyaLP)ekBD*A{!4t;RO8vy{=WP1i0C|fb* zk(JyyObEN#eIUI81G%>NBpu8l6IZsZN6`g7?jwpUht}P zAj0D2b&Joi9n|>vq|i-MVU=;-vOl#M6wc*nlPnt($Us=QmH7~|zHp^J@3Zu!cERJL zRnm(Lh(!e{>U4f(6U{kiLE3y<@9=k=S&|u9nbw(%k|hO`%YK?~xL1U4_z=GJQ_m8B zaV8pARUdzi4L2BpGo_r8O&+LCB72pb5D?DM0y(4pe5V&caDUJ0>akrMUI}57XCo*?ydY317}T&`?ml9C5@j!k}W^Zw9_`PDcuFZPq5nx=#~OX6-(b4k45vz z>%34*ht=!J>y#B)Y@QapdK+r>YEt3i{}H`l1PYY0Qt9s{FYxM&mM(nQdUo*o^MmV064w*Vt%ptA}Ffpnb*wr ze@P;Ml9b6klXd<~y+^#QpKLjOMs0|bU&M2pK9pCp@CZz*bTK&A{)iizC_E!_7(3v! z#4W65lgc(P9E#xk1b}?WjJeB}AapYS-cVD+MAXsUI$&~o7X?>r?(KTw#2MY76nIct z!_$Y&o#a2-q-mc4!e71851{T+7#MwVi;EIT;=DjZmB}+Ek3FSX3OcPlAvNRG9~ePkLwdj)=w=WBfj|x(dIcoK19@@)q_72HLGV50NAhx7hG z-$bE0T5;H6EEl<{fFc<$sp=`5FA63>j@zndh_Opqodicyq}XMtiLO7a&a{7Q(!feF zqj8wx^8M|cY!QimnNCpp-I(%1^`wKB6NSSq@B0DNZtNV7bxeNm6uSGTccHqMbE|0O z{{g*rnb(cu4)`ubFVD``rgF0Q(*>#VC6`Mfsfy=*J&0Qo2&!X93XLkqhvW|x?*vB$9^DLde-4^IKsZgNvIQggq1XP&RdD^am?<$+lBnJ>Km! zJ$a(^48Gt)vPm>Fvvw=1U|7tsw7&W5=V<;t&}UIWL01MCab1a97Afw8rh}0Pn|9j4gRhf81t!yEHm_)#40Iyy99Q@l{X;3Dwy^tgtZi~7tGFK zP4%T(7(Jb3F$~poNz(9c#{B9({?R696kfkfs={&JD6XAb-S#uLO(=kes4osZ&$z}j zVIZv?)|!3ROswIART}4;F{32Iqob0^BA}LPU(BNl-Bi}1X(#aFeYLnQkn61gXRQqH zGq*^l`kpECI;&YzoH*ru*lVMOU->`+iD}<}GoLKOS=&k{sxOT4itkaCE!CO6?y;f8kH61Ew1-DZE+My6`5Zqf6f_}-cyV|?pQeg_ZIJSN9tbsJ3F#C+=(l^A!O zgflNDfLXmav;s8Ay!3A^2N3k&W&bKlVK0j*s|;w_pp}it8+t9*tK^D2t^J1B^Lf-W zZb2L{wU;J^eLxVQtat`Gwk5&O26xDmce~Vha#PoYwrzrbf8w_SM7Qil-9#pij$z~Y z_&oObHuXE+o$tS-w0tL|mP-dI#jHjH8xc*oOAng`S;@&AxEL+5j4GYwq+O zY0gkhgy^?PYq-LIvJ`_(5R4?yfy^nc|KH;CNP7Ksdag za#sRZV&^P2S+pNVazdh_)xf$|$E#l{WxZ6gLE)8g4w8&el4*AZvA!yd8Xt(F@$mOF zoPZpy#miEpTh=PI+w7E}OQ7!)<}+Dq_j?2zJn?HVT_2R$)Kde5&DJKIK z?uR_NPcxpg&0##j+DFqf`zUU8-R{*$j8Mb9D>S6day>3XF znQ#Tyi`xpuXNpA?AWTBA7W`&P_XZZP30FJ`cDV7@z@A^t32MU0tgYMIdgJw0RWCk!w8~kS^yCVAwCwK5Umk)c7DJIukaA13qTDw zKGp-2IG&wS0%{1js5$VT02~u_k{-`FX9<$qK9TlZe>)*m2@5&)(KuDr&C=D(3fmbP zyY|$;K3w*$b7VGZ1Y=Wqk+9UkVqTFfH~%5 zQku^3lx_#*4jq>ur!ELVK4-2rS+f8*ucr3V0EHZWR~_TGe2x`e4ul2T$PxP_{DI&({^&_n#?>Y-85zPqlj(;8%d-duSF8Alz9U4 zb4c~|Y|@Ez^KhLD)e=-v$Gqt1n~~33!zmT%{w3DOyrfNc@LN%e{rLv(9em!%Ma*qh zK>wn3dn8Zs{Fnegj z9i9d1T~@9;Y()sJh#>n^HN8+8y>~wg&qXM|6O}aohMay!PmOvnTmSjEV3cgK%)ye; z%uh!9JaW}BIqIj`!SuOnCZ~Y%C+N=l_3eP*x0N)CMf`D0Dq+Dv4maEgB}V)d!i&2c z&dwyH*pE;WbT3PFa^TW|Cr7z9Ak3oNHm>3H+u=g6@TJA9Z^GGCWJ#q(w^}^^aQ0j6 zA6p?D6$;3UqK~BuT~TR!Lo*ZxGjup^F7@9*=1l z-Se|#;mRa?Xh__s;Rf5dP))W5ICT|{3BO`6htV@Xy@%x)ZgHz+wf*p*Z(=a@p?_7~ zens_^6|X>$!YQz!LS6~vJ*=|HpbPQ@bM?Dy_RtHL7w|{lildWSbawXy%9I}yzjWd`5pwBO$A31%)u{5G z0HKr`o;+&F)p_byKJ4`j^v_%Hf#X=1PQsC(!R;5ZzPZQeEu`m!vBgBwkJ7H9)fDAu z1Q~beDo&$6?(+CeAGstu4>OWP6S<*GrZ8MC!cHWisl1%qbU~c(z)y4dgp1&Q1YnQJ zSgA3Wa3hFW3gj2dtZ;JIILAfkPRGV0hAnE_#N*M1WBPM35-EPJP&2x??X|i}|D5e` zdFfe+Of~cBB(2q*AXC2_8jjtWHSvvjWXd|!x2=heC#`ZW?{&zOW5id1pHfx@;}>F- ztWC%CZkvo>d*hB%c8^2ci+@84HvHeR=RrVDX4_eWS^^N;4ki?+_) zeybjLGp{6tf9UB9RnMuHIb{As5C1U9kEm7FeufW~udvmZ>$?RgQHbC5uSL5(R<1lp zGwZ-p&gMqweSWp8tD(VEwWr$hI3oWr@wq|xszmBV`NLE#@6V}2Uf_$KFQ^XB?a_EG z_{#je0OlI9oy(FTq07YN_f@`jAFYU6-(AqkvL4y9bA#H@O*db>F(ED{)+vPoOoKo8 zvfdC$MK>+j6amI)0D!a~X%}zw>-)P2UsB$IUE3Jl`JB-nNkiBB_nfT(el}fcB>?&N zgo3z2@o9QCeB5;<{F{JIX1c}oHza?){eQ^BpC$3`{6GfYz#FU%Q)Ad#6bo}>7_L0* zSuWM1j~>BYiu}$u2_3R0zUQEl0>rAtiHg6a-lT#h?xNt&?(A@UR>u{}B_1BOQQdx^ zi-$D(#Sb;JL`T{E7hg>){1*=R-{U{t2-g4W@h+r`2+-fVzUV13+ETed0J!t)JY%Xf zCPoLJFV;|iZKZlBcYj; zL6WlxxWAouCId8tN0CyJ12?@h9}h*{OFa~L(C-zS=V0Y`tiddS8Q2zi!$?F-3*h=h z!hUuoWWi1V2>kcbArUWv?7*#Lc?lwiYag&2a$5`%LSOWu(Evi5XD0VmW}}9Js4C=1 zh9OfG&D$7juuC+jMTR=?wi3k(>fC2gUa_Gb{CmI92-=^5E&?2vpkwA~;`rFr* zQ^-o7Rf0{i_=8GC4+gwN5PswG2pZgpa_*^}5GrhUdW14?H0hrnb1^AzPmv_BrLLMO z&cKFF^6B2Dy#F3I_?X)GVEN*cpnp{pB5W6w!?yB%OGK5{arh7?oRb!zmU$jn7WQZ# z=d=#2UHA6twk>t3W|#;(OwuLZ^)pSRd-0Lw-|M><#rt^_#iKed@Y6LmNTzV~A%`Yp zl}NU3-(||zt>yAhw!eG(p%;9%14ty&k&g_~l7 zr=rX6PvFv&xlg~h`iUg5)6&xeZz&pIC27Ub`L1$P#Ads(D4thYOaDl^O5PgXpW2I5 zI8n)f)P)@iS_La}UUCn+A#2J!)2psQ2ve#{kpG*&aGxvPvc>5VUz&CqV+(zAh-wqr zOXyAH5H}m%e${AsIbdKg-ej8n)~hYi72xHtb-UoO{_21@dc)5AuiZH=)op%gxJ&g? zx_w@L3NnP9(|e+{***sKBq-SS7J2LhF$bhou@PKBZ#!+J>n9VGXOu4D@aTT)PYt$m<|rs?C~wM%4ua9@U# zOts;mUjSSXI+svJ@7-d_UrHpJZFDqHs?tdWsdOl99ZuXY5Fst;nIt2%!wTflnp`$GboxbpS zsa)IPc=#%%*CC)s}sFNu%I@!hNQd zV}!&_A_wZ+r)-Ob#g_9xa;mduMh5VJm@^;d%;M-$-C7l&XMajOJpOUQ%KRy{^BAWc z=P0L@i3zp~z)a z0(w3;{tw@rd~fp3>I0)`4vz*#1*)J3k?Ap1wq_ok)0gclQfU z-(cgKnhAV~gGtEs>{WAVx2G)VE9afxLf9dM@BGu;q_lrTGRgSVBGZ~y9;9kn*#(A& z+~|beMs*>UFsYkg96&JH<*WvuTyQf{@kO>kMW^vw?y0@XESeKJQpg!C7_aks~+H zf(i`5!^$jVWnp0Y!^eLK1l_o=O`(m1&XEW=Khc z4@MR?r~tN1DqUb(r+lH)qCkphJnG|WnH7jrCY6Swn&lM0N!7sAn#o0b)6zkQW{;wl z;X0kvv4r$LBKVSeyFd_K&)4e=s5<(%5fY>Q!QU-)!cPmILa{SgwOn{>vhdD?m?XK8 zG)Vz7yQ}d$KC@)X2^3IVf=>B@5?S!Q3uJpMm#h=rJh=fe!Io;=Som4G3At|qO>@hn z#FWh{BYP?1AFP}U+kWyQenP{X=il$IomyT667R>Tmb7@c>gIj35g*Cf0AhX7K_n-8d;1=QvOk~R=qWd(mef)-rrfpmK%J+Zx1XQ$98|~`~ zdfMZ?&fd5(S?~{3vv5VV0a~hhx0P8Q2#0axS=_PCAR91F)DFu$7qj9M1ofMRsdM0; zfb&3GJ6}zBk||o9!#+%qgTKL@_SIWvlROgx*Y-lh;>>bn@*MeuRMc{m&NPiF-+yxf z{@w2}j*V9Ri%h>eH$-G;wzr=J9dYXGPRz%0COsjg>ELacL45S&E{1 zHmhFHbDsyTgXGkHeQd^yQRzk)`zYC-v{%8`uEC6O=qsy3_+c0(R)yZ0m)dT8^}&0R^m{ zwaNDt7DA_{oEQ6j4YgU8l5K6w18%TGq+8YjYf)-Q>##jeh1X}K6sK;Y7i4P4j$?my z5DTb;hj+yK{|%GOA(<|W{)?XKudrVU@kOiut^V-eb%_6#Wg_ht>jke&&{qc^c}J$m zD53eG!-e+9n{f|C{pstQiy0c`#v9S<&?P)~;U@J4yKqxdgrjWtxv|b{Py}2z)!?c{ zT{%Bzzv{U8KWiQTeU1N{yygDM*^P_u>76O0*VEbQgx~$6TOBIc>b24v>73Rp|D802 zJwFAQ-GB^0Nv^r|WDR|EiC7L^qZyL1%)nKG4-T2b-CMTOX*$%~GtakGIu2XftFc<# z&QAkc>VGQip_(ASBIFz1rxZY)nZJ|_X0ein3eo76QFYa` zJ9c^R>dGAlfgooOa|7Ds_O6YBMU<`g{?4SDv0|rKQ{%INH)!9(wj(l?n-OQ-H?gCx4O{Jnj;;}>x5PfhX3PfICl?bfhg4kxh;bt6biT_WQB zY%$tzZp79fzcfLvpNkw{*)79>a{f&lg8n4BPRE5bNl9ufD~esLTv|H=GIz)}A$%F7 z96t=gj>iKJNi*%+m=)_f4iG70o9erL5<<^cLMngg?rj-hhM>G*ck zfQI!Fl=HN~Kvh)~1Lt|zqRr8gCxj4_%xlN^Vqun{3&IcWhA{jKTVFwSn}({ghkS6~ z^z89JX1m9=Ln@tHp1T`b-@@K2bHpy9c{;9CZqEJg(D=AtS+(9~7OM_}ogsal)^T+u z@4)S2wJ8X!!~5(XpNNxvH{12OoN71e6>GD9XpSW^D(ll0#}snooj#UbYp1A5%iQb9 zYi98}OW0tY7Hyx!@W6yYqlmzA*GAxU}+ZISNv_#}b(}%P)Ep7**YnkL5=Crc5#X*k5pL_ZGKTBP6+ik5udN zZe8WnmWh>G!|9^}c1yn*bJ$)GC3}w@`{kQPgm(oMewE+}e`^L2f~Y3U}O;mgQ$$>@6H|6_y$HpG>Uh#Q{EjO>H+h&&Own zM!79GxGL$=bjS}AB@OKZea>1Gz;H{)H@4(V$cfrS?f&?!rB7VzU}LoyE?`1`+|-0U zeurV`&`0_qK-v0Cq_S@vFelM}a_vvS)z%lq`>xVW9KJq`sf)<9i^#XD?+nn?f}WT> zAFZoywaNr;^sO#Tb~jR!4h%#3rdcv$Z&PwE>7oPudjuY5cE%!Us&$`IO{CK(S-VbQ zSENb!Hp1TKxWk-|Kz5IWEGo-I5svoJeZ)%j0iN1Urub1S7tR9~J7O=^E;y|3wk8tn zDc>@kGHn;nYtA9GtL(J5mbTyfyi=o;vgKb^l_*0TQ zy_GO*?d;7UZzyZaXp$8gYDUJ-J5}*O$g0v!)N9^RCil9V+|8d0yKR!y(SVcM{7T4= zyLuD0h+3!-IJ|jvE1xwh$l)T3&%oSLG=Gk_)@k38j>2l0)F&u7)dyX&dnyolo&Bhd zNm&FNji&%X&#o1@!fj`9DeChpL#&ilY@6M2r=Hq&yH#TP#y~uo z;V;M`ftxW5Y`>XAT<%nfSh(DnAjLK$d8HC8QM!%xKjh`aaNclEp5lyU&N$p;TIh9+ zqC2*DcjNMqGXJY@n9rw7xsw(~)p7*D)aj_b;eyZUR78j-xq3g2$*b>bry(%bYD}H8 z#gc;6bQU>_QIdvHdKLGfx40)O6wE7>KDyWb*|EcT#Q%R|51wD4o4aeoTi^c4RM>Oz zdGYm7CU%*k&;y@r+KKZBJj+MFi023dMJ2js!lE%+l~s>1s_s#*2wRw5ke?Z`0zXzg zo@^!@e_jx4BS@w91s`PV`vJuPAxc^P{U^7gFr~|!fK{&M2cT5KPN^EKhzk z@=#Oj{{;Rr1t9iDPB4&Y<>-o1Gm8vQtcY2`hTUwWOrjsZTq)Bc-h zTD_;j#N{QVkg1&Ds9U)!6T|iN-%^lLI5!2Y@U#yw4(Y#mW-hvR3TwZ%4&jFarPg{5 zA?JM|*Eu(stRz1tO2S*N#9?UvnTRn?^sgWhM9cnO>TtW{pRfDoc4&Lfv-tDoG+&Fu zpWbciO$j2zFAW-2oqJ^6F;$s=tL>JjYv?76tw4~E^iwwOa0|{CxUT)Zc$36xsNej- z9?>DTYj=-qAV>$;ehsRv6g5I4Rf7u6;kgqzr5iPKP; zTTNr@>OoPztb*f&#^_+has14RlY+hHaD%sjiN8j93#9m{uRW70wr5%5U13`m>*|U2 zK)T2SUKY?c64Gq(5>l%Ounge-bj1rnawLx<@=h*OQHHcD5>z^*tqTjcEo6M`>O`22*UkmE%eVoUy_SNHatGdS!f zp60mcr-N?Fmi**8f7Ia>3>K2cX(W#~^)Q85{Y%0TfG$e$rR5Eo&gQlL;i(EJEF4p} zbas9i@%0!&|MG_?1Qpt+P%T1IaCo^HdOf>snzT#L2SOMes9UpOw)vpjo%G@v=oi5u zwos}ytT|XtDO<$nflQ)$+&!&-B8guNNqnv705xLCuvKpTDGCmq4EowLV~yuMkBW?D= zdXD9SpkE@9i#ic0(g7xXWrjro zUqPt!?gJn_KK&$#GyLPNHElvTD6_}b`K}C~sZHV|7%TR4`xKX+jOB*CD}$>r3I=$& zeflY{TKmmzS>Um-S;O|j=@l3Y{;33v z+Q-)t_A!)nf0W+^rMG9k*1W~3F%vSY!RAe);)wIchPaJm!tnCX4KKq8qilNXE zNE$>v877U&WGhD02T*`um0as90v19&{!?O&tFfwjvY1j_@bwpUiZ zw#)b(c;>eam-8UgJ=rf?ca@`pKBx#+S|DgO4l_fkD`C71xhe4$@pt;~v&ete2=u5o ze4z(8PD{_dTR&Rmb$jz?0az!`+2YFqD1!H-%NMN6#>UJU zx>6ZBmhny5uFs+9RQz=)xNpq<8SGxx@ayJX9yF+m4`c`x&-cxSX&HY!#RHRZJyU z*n0l%)E3jw8l7OH@QZ8{P8L%X;naeS$%3tq_AU+Q{&uqml57jUApl#}tx>#()t>7| zE2gy3m^hA!!azsbQR93#oOjB7J!RXXUI~lOFn(s24=P$0n_1U&P2ERsDcqjgVJ#)S zsOD~dlBR9|AiULe$d46N^;k)96Hf8b=~1|sTU5$W|32wor_=q}OcvhcLwB_(`8Oog z@G4z|>$_%MaChU~1^@d0B@g`7|4;E?CfFT(>Y%yYx!1vogW#(yCnI4vJq>L9{K?uE zJUQV8&u2LIvBcB(OH#pQxS4`S&SBDd7KSL&IJ1Y3z!Yo~UbP|^TyyTMS_gnnb;WY> z+F4mmF?`0>?Cj9`?tcY8ng0%c|1E3iCGciEmcaA-?)}8JfYAwt&3FEdb~cVRbAbkp zL~B#je;DUvJvw%IuXeDXIxhm?xTKEZM~cX6=t^JGBJORTvo>cMuEnBi_v6(79%u?^ z7?xw@jX{qvT#8=kRN$ZC^9uVgk+DpK@hOkL;=F^-&zqK$@3Yl^)DJ?zG_1@BU*C_0 zrJP3A2)Ju&Ib3@6j#mzP5Wib$jai~X(FBGs2V%8F14jg{Zn%x_gtrH5&Re&gIH47< zLF&1<8Nn8v%wtP@!@`X;2Fl#l0Xl`2{MG4oT#DuWD>R? zZvC6@FiR9xZH1TXGM0apFBVD%A%7Y|&m($&{ah^KMElN9b!#uzS0_}@jE$V%4fo+o z#gHl-zTPo;sY{!8W6=f?4bcpW1znzP`5?CPmL;%V0*{#$;cRDF#;w;Xb)%1l5nKh~ zG|WQq;3*a%lTVx9b{YP2aAk+Y{5V{^mhRGrKiOaq%IJ)}^W;G;;N^=TYt5Ma3{;_A zc!Tjvn3gVGGXjjK-o_j2uo&U4+A3PAm-Z-6YyyMfXD)GDNT(@}shU=KH;iQ8394Zi zHrKv}*Hw#h`JJquVk%)X)RQU_6z*+TQ)+5@TG)h$d?+JBL%^2L8olUZ$pR1tP)w4; zRv3pa$)Ck`gmoEPn{-q9=+s<2m;d2$r;ugmyUpcCaEXV&8i~w9lTc@|>?`a>3{_FWBo$@}NbYID0=KoRAmP|`!`8MJSL@kCHKuer&p0;w_-9)Ts zW4bbBVmnbG1CoE3V;jr{r63E?235-bum#TI&zWm$lvQ#NdDE&Q3`KTuaWW~kut z9{0T7qDt}C4c;TqF5}fZFvhB?VK;<9KZK%3vr(z%8IQ{!o(Y3Nf1T&9j?rz|X4&Sx57##qem1}*)mplOs&;rO8; zFVAK3_FJ1e2&L-NWL#D)m-vO6@%bOdue?UezD88Z2(U>*eqaxcb-f@$Xzf(Xqr+Dn zW{&&iUN(KcZ~xb5kb~&dxsjsvynovbAK!}B4Cdo&-BGCLj#p~v;!~pHw#UG^yx)6= zmUsho-ko2&lniTQJXg|!Cpsw`a8~&O!rOvb!kZJ$-j+SSb*`2h4`27WZyupdxiK)k z56hIrf_POrk=EHoWWvnK$s&z zV&xKrDcB0ptnYJnkj^{s3KYw3jYq`XzOnJ1H{{%FUU9EPY*dWRR11_l9nCf}CzO`S zZAdUb<8EMq8v31+g@SWI6tVeyDAUciw9h}zQ_axJ?6(MPHJY}1fonK;@i0~Axc;HZ zH5ZK0kjLoU`G$K~8-D&OZ}__9;1$PtpvowDhT?#vTI23-X2GkCspO_9pn=)w0!5}y z?-=WZpn|z?u~8@oVKeZ2muyJ?$nkh%Eu4(Mfx-vY^;_nh`mE%gk7}usRtzCdM*`WrYS5T!F|A-JqnHao-W z2y|L3{*xC1k^+lAcdbl0TN1Ft-oUB@gbUe%>IowY9s9}ZPE&25_cNp=r+u)9ZAlqC zAXa(fX>B!$&gTm!8Ipe6(rOYa;S~CxQ=anRurj&V79WPi2qv_LqN#O*h6yL9>@bSg z^R|ssjmeHw!2vSh>cPqbYU4NnDak;0W4!a-}40aJOr?C&e+{-#c zFAWnET}(K7K0v^~cxzU^rS<8&CLq{kkkh9%g_&$=n_u3M;A&=h8Bej*LQe5O9ycBJ zkngcop5ok6z=y>#kHeO}w%lke2C5J?@*Knb+-&YwZ({$<*dFJTWxny=;hy_3W01Cb zAB*^V{cj_q;4&kO2wTOP=_snk_ZsY_53va!^RwM!3FsQS2F`;+YMEK#@WOFeyXv_r&Z8e^*mwqeUP(YQK7OyNb7vz|I2I>QSRchhp5*Ean#QaM3MHuY1%{lrVAzYC zTt@>xFrX&y-GjtFB@dr8S}`0c!Lgjz&eeVYkMyL)Jj8TB${~2=4YCCeZ$P%|m2s{RL(c`a)h7~SA@R?-`8(mk#b z(VBStkU^8#U_F6J!v7Vc6!GOx{F9t%HDooj;VbO$<>t@2r+U*e6P1;hTeg;GSP%KC z_)vm>V%i}^xS7bfP(Vdr!_G>F#Q(ESqF^9LRV^giaT3A9iwwJ9Y2S_bg3_uFIGBH! z*>JNH%aAANbW`~B`mM(4+4fi#{tusj#mBLkl=rsV zLjlBp%T55jw3!HZOW~bAc%fk2ZrZrwYT;cbf-(cd{EH{4!gs%eaz=N}6f$jN5O+Y7 zv0O2nt2~(iu=v!oY-dgYKuMOihbV}*l&q}bmVg_lt90qI7bfk{g0nf6>>&8)Z;!xn z$oYBmka%!_#WLr-dh?(QF!%mrcdvcYuwt1G!Je<#Z#h4Q8+b?q_cpV2zi-+Z`zc(1 zEoG;t{WsUHi0|hFO~5#$clV$`WnYVx&D?+U*JG{w>!~5GUdWQVzX-@VyTf17V^Yya zc&_K^h<)REu)hu4Ab0pdLEZf#Ja7BUjb7Uy*=rzf^u`FIpd2YD+d`~gsZ@)J+7o)t zs4`GrpFlXsYh+_sL-&@fB|9XQsRAC!9ZFA?lbXL%J{LUW&f5Mo+VFzu{?9 z1uhu~{5iB7*~T}!HU;ESEDQ5fp*ShF9Fjj-e+ao)q~(welB3=GpK^*IKM6p*lcmoH315}+PGU03%DyIfJ#)^P*|TT22xQ)Uq#04a(GUtg`mDxy+vGZOtUQbV7=7bb7Oz*#f!gCrJ={H9@A#WD3LeuX$KgxT~W>I5v_?T7{1`d=JzJZb&oJeJBq=}Ql_8h6&`h+ z-pXDV1~kqjd}_XyJU8@Bmkbdkw6Y(VspIICVMx=J6h7(9dwaF^wDdmd$r&;d+6l)S z;5J^AaVDrrNwMVSV_Hr#>@a7}@VOzAS(hk)UFXj;ZR-(dSlLKc-R=0U^1@nhq@{fE zWYOIz7Pb`N0Qc}^qxd?dV|u%FhT`?q*8Z%a?}NVYU4dQun>8r(qr*GNRIYWz86J&a zB^Xtw?Vh@yIDbxazra3|jIDQaA``U?8TL`~4!KQvwcqVmi6?3W2NS#<`|+{g;9EYC zu9Yi&=X^YuD|=DeAP?4iESEV)0Tu{wAoMlkxB|Djz{(e>9hm7x!6aM9S{+2rr@#D? zHM8(}vi)1SC+|Mb>Qn*dR*l-XTT`=0HEuF2I1GQhvU*vuxf#;Oi z`d=J1%hJtmU;0uo#A2xMaLU9iMdIz4Z<*%J&dBmk{Ybm<~N z5Dfi#3w|jdX{v`o2sEiTMgmprh@;u^a!Czmns3oHK3(Pma)WunFmzDZ@VO7z5Tf0 zXWKBx3qdBn2Ypw)n#zUA%u^dDx1Ypo(yBO1--Yd^hI5#g5Fm+~3@Z98F_W-4(;VCT z9a?lXFDW=WLx-j))I*HmU8Z+wEcIjS3MwqcT740h4fwxKu11hLc!TXzp9cibrkZ~8 zVa*!q=zc%FXsEzd_}Hi9^W$)OmPsY zstPO!$+(!5N?bl??Gf^Iw{CIYoS;DR5#GHV3ae1s9p$E$*z^N(M3 z9y$HuAL6(q0P8l!ch4U6C!#Y1^n1jE6CL{mpU<;94vQGoX(LdQk2;Ny3V#^OvyNI{ zi=37+mthu>JU5~r&VI|RrggOKq3!FFAoWik0j3BTF57$2-Eg2mE@^G_)q^Chz}?6B z>kV?1HXzW`43B_q*R&&Lz-y`hrHzlMFm;T}SLbO?+1Dz^&D(|a1nB_bdvF9>t+{Z3G}Dd&B@27g9~!F53~q4;OE%ZX}YA_>iZ9O zE2?!~8-zKwY_lOWYW#NnJoS?ShG+u6w6|zD=I=LW5J5&17!htz-@g0je(_FBk{D5frapIR!n17wmULR%I{N-%DkMTyS zy_|ym3z)BR&GZ;48^9OQ(oTN%UpYtnlwf$-e;aPJvXRP5F#U6%$Dv@zJl0!O1bbDZ z)<>L6rQ=)NJ95_q-Syq`L`JVa%dR$s#vF2c-wSL&~02rCiumHjl; z?ZFCnOW(YX^uWK^X)w5?Zf-w3S}$AB6Ltttt#k7#;Uq%zmR&5hev(n#O%Ix-0GBQ6 z9MV|vtxjTFAo|A;;Asv9obstz8AbIa^*ihyObn*4cJJfXFj{I_Mddc+3Eh|Ph$})(c!Q^rD)#L5yA-Mu zYf=VA>~s}MQ82ee!2RPdK&L_}m;iW1w`G#^5MJMhNeSe3a8ECV#u$wdcVBnNfyv!{ z=zi5#jgeXNopY|IU46;WmtQ_mjIQDIBhl-@vE?nLn%AsHZc~2LVuklxktake&hTTe z#gUnd#IU4rjoZNDfhqTrW`&4?R19gzA?xCL{m6GSJ_OV9V=lABXSiFo{vgl=f)hU4 zo7@wxGK(4XQ0J2zD$@y4-ptw3AfP!#k2E=$vk( zUAzt5$8QXMWbp`nGD8Vk>#(a}1V7U1nsq}X^tu%DwLF8cx*@uPvHzCW`JeLjKz+k< z1N*umor0<-bII%5Rncn}PO)a(vr?KLpTz&kHxaU)8u{XbYkfTr&u3+iSbM9L(+_$W zirowwi78PHjeWW(UcYq$cq9lJ48+oz^EYybLXlRRPB)Ui>^Vopd8v4*em}13>S@aT z%KgIE#AB42E<}yCloi(%B=Kq4-Z7vhNx^r^}2*N;Krvd7XtVsK!A9ksXZEKE; z#EC_8AuWoYSY51D%IMr^u!emMYLm)YR2kHoWp^V$)*D#R5yNRSXKVFpb6)Ww z^X;}eibBv>U~th#yEwmE`TcCtaDZTOTSEO|u9>Zr6ITu7D`9TnYQP zj?bxYPBA<0UI?Eq(Itn=>wBeMI??dBbWYLdmtZtXa^Qdh27N%;He82P=T^;OyNz?UJb z%CB;;vYSvx4{vW17ws@UNg-XpR%bbUq@mo!BvOK_XO=jZPw}#x(#NV+D9Fwz(}z|G zB;Rs8_Px^QRMOPMs;0G;I>o8Fu4AOz(1&yM*X)7n=fW<^`i}SXio#FFCiUs1lRRF` zXTm(4Ge^%kYTknJ&eGl0Z``I+9AGnt;VwItahT&TThCLpGo7Z5UjhVn+Ic}^-^(x) z^GkTE=ubO=T3=&cAT2I(bj_Y7Aj>*w>eGHPgoBTGZ@gGm2vZNz8X(KP>exP3XBfz< z|J4vlBpyZN>h;!gigbUAj`3Y0>1rPpX} zZRKt$gmUgs)9rWFC{wZ}M~Qf#hQO5C*(6kV2r!-LkIR8aLIum5%ze@oMt>Q=NU zQBIflIWKe_ZoL^B@Kbh5pILI7d%4X1YPVRBQ&qNiAVF4T5wRx4;XM~NGsabSiR#lv zwoeSsu=m=VbvMB4TiS06nV~;{D`}`HI%}!_i3eEO$9GxIPGY|MdE-l$!mW5WWc$0L z!A}?cj#R=E6_3U}8uL1uXv-pCQF=lf!^t&}qiVVRnGfigc}V9)?k&2}^29s1yLV;Q zv4F_XTwh;YuUjfb(MjIVa|VI;P%e8n+AbICBlrF+`Govrx>6uKLGdWQbl%21CpeB? z#IFVjt&%AZdi(2e3w7la)6Fi~3m9Plb^(Ye^Xdob#uQ}-;MRcI88x^90zCl{oeSq` zB4V${x=(r%Lo<7h=V`>#g`K~kJaJl>AB1v3Pg>Gyl|dFE3L8{ zbdggm@|+(K)FkU15Ebs;E^#7?*nU`T5jc+ABsxcPvv1le026&Ox^+XIiUwq%28`@C zroOp%9>Bx3A}2miZ@Vcf&u!^naS5ofnPT#c#cO*eGkJv&js3fOu zPMWhQ=2y5?H;mt&-Q<~tK;#E>CBwrR#Lgi|#(ifL*+4JLX?9qv0z+ya2c=B7gOl5M zmDH2X;Q6~3_SP{NS$vF_n=8cn+iey>-utz$wL88ZA$PbWV!D}CAIIg>a5e=}5 zuEwgFNGZ67bL_Y=#uQ!;a}y;zkM$jJOGY*h5dIRov1Y-3tcx4jmXS;_NH_5yp&kJZ zfrW7E^x8{W2D^u;(CR6o4T=o2cn?EzyL$>n=YX*yL5X*wfuKo43e>NGCxfv7rUl^^ zKz$?ipgz$v8`@9YNmiKBi;@K`zJ|p+4Na7dm4KV8zf}woKP%l0;8X)lFn8gAdt^PS zxF?;deXid`<<(((oN!DS?OhfUYjsF|TMiEoDjiw2Uakv>IWJ57hKgEcVy?F7GGF*T z1*s0Nl30)OklhR^vcF7{N0R9w89c$vk(_1E@1EKPTK{2dl=(p-hB@o!`RvQUlLIDi z)OEroi%5GjVL<@u@=10tUTPJX`2>8R1R~-hBI8|m*2VFJv~g2m(_g$EqaDE7c?R4i z=qAZIEiT}WT;uL{bq5AVf8PO2j09~qD>eNRH6ZYel;(cI6YT(TLrD^JPM1x|Zz`Xw zH3HlK&+LL z$a71mC5pHi#=H#Nu{$S*T zX=7)M--hFPoo6>%0Ym|!AR<8drF;p?C@1-r$&UHsvp*~TfwEF*+tDtbz7B8kcu8D6 z!*tAF4>K$$;Mkm@7BMSwhJhb=JjLqCh&Z%-5hyX1GenaK`{hB;hW+Y`PAG-nSUx_O zTo*CdACqOcq`+I!tUo68f9gy7+t3m;O(E=$>^$m52NTp0pw=HiR05t~A?FFY3lQj9 zTc=CYF|I(Nn-p+<1wLfz!lS>p2B7N0I7ONVz`_Pd|B{`+?>zuG6Vpl`(^1Rbha3LI z&zyJOVTm;G5B7f|Xg!Q;r#$yZ6cLr{EKTzVxkM_x$Un&s5@sBKT#=mwi@DY+>s^2q z2gK3T)K;ST&pZ9A_Q~q4CnY1H{yolzY_z2^D?cw5z7}||@BL`c?72>Ejd8d9D z|L9MrILqwu8)g1I9pS8@Tp)SDr=s%t-%k`jJ={Ixc+qwYo{nki!kAoIcWEs9Qq?Ch zNv8|+@ulNpM5gILG6OBG5MZj|;BIpCf~A)oGCs} z^uSB}vaOW5X?Cdfr)XnlGvLjrLKi<0=iD*uE-S-fRufy<*8sV;r?bCfE~2kHSom+4 z3dT47sV)m>b7|y@jnq!i=@SSu|E1*V0h2La_fr6W+Qv-!Reb0h1 zKpis{E{Y`a(oX*AZsqls7W6L~ph+=PsRcXJY=olHx2os0CGY$K*|H?QrE62wUT7Qq z_$%-1JcTM|19AEA_akVlU@p%V()#wjf}ltp8F?kNZqo2|YjEZU5f?xH z=yO4pFB>Nkqf1Q_CzH5xaNYjU#TQP)t&uiDtPo2e|^=g`_Q11Tz0MDzcCMZ2)svNrdF%7|@G18CzQcp=3t1;0*L;MO9)V6a6s$y^ zqqx1cZ%3i5!DG_uJnQ&ughibovLj7<9p17jccb59X8oYIVH3&DdJgQc!8!G!x0qIF zx*_%QK@|Rnru4B>^1VLEt>x++0R&ALShkya4jj!+62Z=uBjUSSUE^O=K)4R!O0U`1 z!5D9_e>$(}(rYgaghEK)2FQ`{hl1AkskE!_npD7Nu_sl*7?zgOPNGJCf4-wOs+A1a zuPqs_KclJ%Pnm6hW9?1mA}&K@WciVD%bARM)(%FFy6$YU9WD|!L|M?w;5pR1`*C<1 z?s6OOf`;NrKz2{A6X`mnr<%UT8d6p4>|sq=ZguH1aaA93#Z=bR#}t~rS=#*N;(Z&u zKhVE^Hhk7ngz3@4qLh>tQNQ}vuM8in99Ayk@A+XrH;2NoZEkCbbt>@Dk5>(tmBk8k zye$NcIGkgjZ+uTWyfN)Eb|iy>wZydlOi`75Sp^Jp1x~3?){2N zcmW~miE+5BvODJ}@M4gZ$fhMl@w3f#5$+uF#;+)|T`y0l{F*bjhhMTOy@aOHPk{3* zP){`ypBcIAQ)aeWz%lV!V}1`x)??z2X}=@7L^vVX33Rvu;g^F za@^P|oQQu5Sn#|-?j=5pYr0354I{XtFF00q6j;;AH@8kW(jL*D*viR0_N=oGCF2b9Zf-`3` z7reK4GZ35IOJ6#Nci}`Em!Tv<9sy4XaY~zU>FRGEOJK+yTJyHsnjc60lx&#J?2_Vr zexv-X<6wc=W99*(@ap)R4zSbgqH(Ft=r$s9S02O*EtSfG=UrhK8Emo5#AG zF}=WO0zG#O$28#}yj(e&falx+VGbR=`UJ32mGU5G(YZB-QKvaK--Uw(+3Q^5Hnj%b zIqy58gOq8nmqQ3ZAHvUE9Ww_I_Kgstgrw~#!HD}L-B@7^NDJ6=}3*HUz5JUE_5R3SM8dGeVi_>uBO zc7P+XwGn!!#VmP7E&d~PcBgRsz246jysPn)Y#Bv4iI@oX#2iX_{}yF=yUw)qplS;) z815SM@5V6y7{&ZwT$d`FyNsGXtG8FBZvWo(kxkCGOC0KdvjU!vQ-uET0tG(hCQZg$ zK#lQDkzughoSdc*uc*us7mN`BZ2cFYjHvp#A_5n{x2sZ=ngJ9SR>*qJ#bZth3`U7D z9qm)F=I`=>p(dB4@sr<-hgalnyoN)A=6ZfblsoTwh*sJU+yqS^|poBX|~$^9MfH^ znYOjBEuy~gPvr~DXL|rTW8YIdFe{_5day>xF6S(roH3zYF`?b*?{;|<>^U-fxxuPB z+420oq3Dj7|EtQfKilsWw$^;%%&{;MD>Wc+AHUN&@M?gqF#b*x+@HE4{k=Q*nI)Ta_yGrzejwS1Nrn{Z-Szl(Z4V%k4L9T2rDMeh%d1)k;9)i6mB6ITv`bDq# z6qM1UB8F1vMQEFidK1ObD2l9q0O==|@J zZdkzQXRMTNe|HTRRVgjKPtJX~l!Lw7vA_GMT%)Hw7kjsJf43(_XDv7Xck9 z-W0ZmrUKrV{{!E{{FmuLbW5@SVSliHIV6teW#9kKBmGnN4})Yw^{@+{XBK~(?E1f0 zEV=&`i}l}|KaX^H5Pw&qxiNB}I5>oZq*@sRv6D1Z8)NWh8^bI1KT!V74t2Enh?K+h!D`d9=_-q^WT7$(r@hJdbu(s?YdXhAyCZi!A3coB@koF=y;$+2ae?EKR_*|1mYq(*?au zor)=v4W08wNFo$pAQTm#%_O77S@XnQ(8x02z5GV_@SMUYamef(TL5_x2X`>FSVfH0 zP68T)igFyxY__ZJ(!AsfJBbf;%&hp6GsOm>f`PIEK=KDA(VdW*BFJU9zexddF1wD^ z%1c^C2ZT2XI{V{W`v10T_)j~BfAV|NV**8!$SP!o*0Te>pVw|ST^e=LeofT)_$Nxt zHW<#CI@Aw)CnoZhrq5LyjmlK(hqd1^Nj}4Bs+N=76=6Z01<9`5B zK|m7nk67dX`npSz<)t_Jwd7J7;XqrUT2jzY0_-n0^id0n8HGu7MFs*T2Bid$?rOgS z{+o^8VeMxdz+_+U3pAz~T{lpOU^ksoG50YkS#kZRxYls%Z!zI095IP|*N<6qbm@1{ z+xe&2#y>z+@G$x>hNOc7YGGt|O7N)7S1BTykI)qp{0 zBb5<#Lj6J7GtmPw&zt1XkmoI)>+OMy5*!BG%$pyDJ=ddCFKr^vJpy7wH9&ru$)OxP zenhFeAFDe9XJ{7opw0pOT`J&a7>`9S)PCl^MkmHSWbAY&}oj@0W!^nF&+T6#HMqMgcZ#Y&R;p*c5~2jjNJPZIPa z^z@(VVs_Z~0SpeZ`QDWT3=1qXvg!IY#*;?MPkTOHpG%%hc#h&Py-DHaX6>UVR1CBI zTVNZ}c3&cOW+;sr+=(+9DbYEOMcaWmNL>3Bcg6 zj-t80D+q;R&>;H<6F@D>oMst$V;Vx$#dV-o4adej0Syxy2YTTS@OMN@<6R^j3!ivI zVCdtTeNg35L2q&dklZCC!vaQu_(5zO>hM5bCAi!hPKr-Ern^CF#=Ai`&yIG03nBTR z->u{`oc;ATcP4XSiz&`E=bj_gMlFj6`u$V*Q|W74QWDN?mGL5T(7f?&a;yDqmhYdm z;A|l3Nx>};9%NNH-U(Qhwi-5z_-f^u7RdUJdCn_5j*}4D_}_TVrAj`g^;SFZ_Emum z)1><<9~Cupx^XT2M2~m~ zJ!WL#mt751fCT^8@lPk6$~?3AxM=>qy6Lcz=rLPX8uBd9!p0MYZM!xDmhrz}Gz0dd z$mG0b0u3i?7uH{Sm#r$6t{Fk5lz&V7M1PJ*h;%QC~$OnJ-8_;K!C^WRh`sv!?8N~8H@U#`s+ zs;mhU64CylOx;Z(;%!Kb#>t<%_-+i?Py!V~3!5%0X;pzNfvz|^L|#`iWwyM5GUVRx z@~)0~N|ksBiahpA4(+30e?IUlqzFoGXV=CHUoijlq!$uS{*&m*IV2#u&&okpUINr7 z{1^TZalW&&2!cin_&g;0KNQk-TO}V<%^45CZ444Jpnb4+TId-%A-ZIm;ZEzPZ&*{j zjIi+@Ge?WSZYUi;hJ-Vik%trnZ^3QwIFCJ#AAPCi6pO9%g_?NFr`Z2>6l!2}|K&*f zN0R-&&p#llF`mHwC7P&>)4z1KLFzB{)Ye0uktd@@;R{JK4wZj_x64cZ0Zv-h{R1>A z`-cn{^soOV*s6N!NB_{~@s)q5c#hfTzo`4E-oN03C9;2TnP`{m{}~hOao9dcodg>k zJUe$8Biw%oMp$2dBN8$@rwzxQ1p*ZH!WPpM%HJ|#7EcU7Z>M8h2!z#0^UP&e%g01t z44-UY)FkBbqva!zeJ;?FauFcdW+!sy0Fh3>old@m-G_ml3fA{24Ey>-d z#D7SmmvX6cx*mOS^P;tn_`CpuUYS5XGbaE_`iFRW$Yhro+cNwHn`D%+hi{==;d!xB*|tOeAus+c1E)d1{;4KNpKtqV|( zw^e1QEboBA0-&&!fB2+_E5Pt@c^1b-D#IWlaj0vUS#eaTNvkWx;AvO9>sQ$22r$Sk z3Xi-4j=yTs-Uz;wi2y2-^^+txVk4NJKyZT8TIF1iynTzz|bYj6@)qLC4b-QC z_nqE*U^lh9^u4%b!5QLQ`iwHplbUvNawkl{F!<_u6ALz zxeIOOY=oFXqQrw?gl<~{jm&rV5q!j&BeD*Ku(>g6qN{!5S8#`mSHxw|Ru>jyZ@;IyN3X&nf?jm)f+nRH`xTsITo zjIM~&t~jcDx9N=@6bD-&G7$P+zRa`TC0fp%R#97;GmH!zAj5!nOd@Q9UZxko^RKqO zgA0{^#KnArcAM+yyW<*9_9sN}Uf4{mcsHCSSy67aQtD*m3_j~$B2=&GWHN-J2>@BV zwYE`t&(eh3pDMG$+dARFfgezzrKqJc`YWNvNx8-rr`$C#B?}t52 zj@lCtnkTqxM-k>4gU=X@UliM1%kMt=0wGg47r-F-X7AT1i(dM4>wEn|TYxY zy2y>Ob|aXlnnlDPypfNts*yvS(FK4&@SxSx)CRC)vxv<395#VR z!rjpyF|)}^As#yWb8$WbGw)QI|> z%+IZ$toR8Ni^_EY1-F1iH7{CkN+;nd6N`qJ7})uI3@A~W*ksJaB88nWVQ+y+$9@*v zITSQ<;*UsM7gfNDgmqnfG`D;aFW?->WQ_!pW2ZsE%j*rey}r(o}Giw0kIzdmIQ75 zxi$}dw_NUPe*M|_q1%-+-#6aQ5(v$q9ozZg;gCYxdaOf?<_mMjqjFxn17>k=uXjrf zqERo{)O55u>+#(e?KS1`6-WzuE~XUjn9Cev#zmU_Ft|yQronPNAv1{$@kb+1_wwOx z^{)!aO+4jlg%S5G><2&z2P;h2+cgT>H}6gMNJ2F1=HO@@h`FP)-0LB&IibOM+-hwj z@?DH+hPHEPvCL3?%rjnkHRB!`7w1rWR)1eW)33g@$Bl5^whHAOurRk#4;GzdqF5cp z?zjvQh}LKVryUIK@niI-ioyHSVgGd5W(oP;l2|H9@1}B4K3e3$ljhquNIonwn%I^d z{p>3rzGza#e?u|aY)3%8_^hzxa_>tkz3@{Ecn&RmcY8t-0o~9ll?W)-8zkky$0bAR zn!kXDW`0$67|+2W?1X{K$PjCkqdmTa3H4hnD{4MI4wE5^=Tw0S%(vV)*BfgY%+_S~ zK7HiGa?UE|n{`hd^2w14ZJ=v!maY!)N3V)Kqk0@If^g(Y(h-r`v(fnMF1G4Kmiyk= zT86NNtq|bMJZ)QV7 z6;p6x!NllN~o}B8)v31%I#;SF8NLJ z+#Nagb5k6jcp-~D?SVkIWYdl{1Z#pYxdmxnW7vWNFu$aj=o6LEW;RTdJYkf%s0fcI3DAxoC>msA-788XU zw@aY?Z-9;ru_|fq_l=mzbt5^lY7FSa&vl4gkSIQzSf=dd?FlgE(9SW9s@5ixjYrYu zw(eo|nyfr1Nk!lN^#wUcZUHH`*LGwhj6~<OhEBU@>z7fhvj*8K;)aM=Wii+sfz;cro9}Y*|g~%_rjYnY*N&ET!P9~)Ul^R zCit#0fW+>&W=q03j|Pq4CE)E$Z00YV&cWLgKX;Fw^8T``CnLG-Vg8fzSBF&~rxIR~ zwXlM=8v-&78+0X%EBbMHpN|&OdPjb>NBLv>MNG;&O|0-WY2*X=@2>tLJFZI_HUX7n ziV2BaO<>sgw~&p?Nz2BhJ$OZDbsHLtigZmmo8Ty>Ov+%p9_sf5_7;o4CBMN>`C3$N zXxUHN!C(2gk__s`OhNme+DY2Lv$Vzh-untBrcUUxTd8|rEumVM5R}TBILD}PX^P|c zykM=yle5>2NEdvq!)nzpTs=O`V~pj9J(U`&yqEZsd1({nREyg+f$$xfz< zf|Qxn7us!FR?u;CG>84E-48{X@x}#%okfKbe%*d=)0JeaZ{6N`4ELETZs-y9q>>L{ zLKeN$e1omZ1XkA@V`_7Q(l(3K@n- zlLTy?vc-o;SGT07Q``nfyG$+C!rsylsaY

#^9!Dp|0L0s#vCC*JZeU&uain?)Mz S!M_FqK97|(lwb-Lf&UM6b{nVw From 21cfddd4268cbb706d0b05c5f22fe42f14ee365d Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Tue, 3 Oct 2017 15:48:08 -0700 Subject: [PATCH 098/141] fixes healguardians not being able to heal people (#31228) * Update guardian.dm * Update support.dm * Update guardian.dm --- code/modules/mob/living/simple_animal/guardian/guardian.dm | 7 +++++-- .../mob/living/simple_animal/guardian/types/support.dm | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 144f7081e0..592679d35b 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -180,10 +180,13 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians new /obj/effect/temp_visual/guardian/phase(loc) /mob/living/simple_animal/hostile/guardian/canSuicide() - return 0 + return FALSE + +/mob/living/simple_animal/hostile/guardian/proc/is_deployed() + return loc != summoner /mob/living/simple_animal/hostile/guardian/AttackingTarget() - if(loc == summoner) + if(!is_deployed()) to_chat(src, "You must be manifested to attack!") return FALSE else diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index db1581d8cb..a8a31ad89c 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -28,7 +28,7 @@ /mob/living/simple_animal/hostile/guardian/healer/AttackingTarget() . = ..() - if(. && toggle && iscarbon(target)) + if(is_deployed() && toggle && iscarbon(target)) var/mob/living/carbon/C = target C.adjustBruteLoss(-5) C.adjustFireLoss(-5) From f1dfc1b6db986c299d70ecd331dde867fd942636 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 3 Oct 2017 18:54:20 -0400 Subject: [PATCH 100/141] Merge pull request #31252 from MrStonedOne/whatthefuckcyberboss Partial revert of #30763 (datum config refactor) --- .../configuration/entries/config.dm | 35 +------------------ 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/code/controllers/configuration/entries/config.dm b/code/controllers/configuration/entries/config.dm index 62919afd06..ec96e88553 100644 --- a/code/controllers/configuration/entries/config.dm +++ b/code/controllers/configuration/entries/config.dm @@ -8,10 +8,8 @@ CONFIG_DEF(string/autoadmin_rank) // the rank for autoadmins protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(string/servername) // server name (the name of the game window) - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(string/serversqlname) // short form server name used for the DB - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(string/stationname) // station name (the name of the station in-game) @@ -24,52 +22,38 @@ CONFIG_DEF(number/round_end_countdown) // Post round murder death kill countdown min_val = 0 CONFIG_DEF(flag/hub) // if the game appears on the hub or not - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_ooc) // log OOC channel - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_access) // log login/logout - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_say) // log client say - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_admin) // log admin actions protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_prayer) // log prayers - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_law) // log lawchanges - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_game) // log game events - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_vote) // log voting - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_whisper) // log client whisper - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_attack) // log attack messages - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_emote) // log emotes - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_adminchat) // log admin chat messages protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_pda) // log pda messages - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_twitter) // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases. - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/log_world_topic) // log all world.Topic() calls - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/allow_admin_ooccolor) // Allows admins with relevant permissions to have their own ooc colour protection = CONFIG_ENTRY_LOCKED @@ -85,14 +69,12 @@ CONFIG_DEF(number/vote_delay) // minimum time between voting sessions (decisecon CONFIG_DEF(number/vote_period) // length of voting period (deciseconds, default 1 minute) value = 600 min_val = 0 - + CONFIG_DEF(flag/default_no_vote) // vote does not default to nochange/norestart - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/no_dead_vote) // dead people can't vote CONFIG_DEF(flag/allow_metadata) // Metadata is supported. - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/popup_admin_pm) // adminPMs to non-admins show in a pop-up 'reply' window when set @@ -140,14 +122,12 @@ CONFIG_DEF(flag/admin_legacy_system) //Defines whether the server uses the legac protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(string/hostedby) - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/norespawn) CONFIG_DEF(flag/guest_jobban) CONFIG_DEF(flag/usewhitelist) - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(flag/ban_legacy_system) //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. protection = CONFIG_ENTRY_LOCKED @@ -171,29 +151,22 @@ CONFIG_DEF(flag/use_exp_restrictions_other) CONFIG_DEF(flag/use_exp_restrictions_admin_bypass) CONFIG_DEF(string/server) - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(string/banappeals) - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(string/wikiurl) - protection = CONFIG_ENTRY_LOCKED value = "http://www.tgstation13.org/wiki" CONFIG_DEF(string/forumurl) - protection = CONFIG_ENTRY_LOCKED value = "http://tgstation13.org/phpBB/index.php" CONFIG_DEF(string/rulesurl) - protection = CONFIG_ENTRY_LOCKED value = "http://www.tgstation13.org/wiki/Rules" CONFIG_DEF(string/githuburl) - protection = CONFIG_ENTRY_LOCKED value = "https://www.github.com/tgstation/-tg-station" CONFIG_DEF(number/githubrepoid) - protection = CONFIG_ENTRY_LOCKED value = null min_val = 0 @@ -233,7 +206,6 @@ CONFIG_DEF(flag/useircbot) //tgs2 support CONFIG_DEF(flag/automute_on) //enables automuting/spam prevention CONFIG_DEF(string/panic_server_name) - protection = CONFIG_ENTRY_LOCKED /datum/config_entry/string/panic_server_name/ValidateAndSet(str_val) return str_val != "\[Put the name here\]" && ..() @@ -290,7 +262,6 @@ CONFIG_DEF(string/extreme_popcap_message) value = "The server is currently serving a high number of users, find alternative servers." CONFIG_DEF(flag/panic_bunker) // prevents people the server hasn't seen before from connecting - protection = CONFIG_ENTRY_LOCKED CONFIG_DEF(number/notify_new_player_age) // how long do we notify admins of a new player min_val = -1 @@ -303,7 +274,6 @@ CONFIG_DEF(flag/irc_first_connection_alert) // do we notify the irc channel when CONFIG_DEF(flag/check_randomizer) CONFIG_DEF(string/ipintel_email) - protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN /datum/config_entry/string/ipintel_email/ValidateAndSet(str_val) return str_val != "ch@nge.me" && ..() @@ -315,17 +285,14 @@ CONFIG_DEF(number/ipintel_rating_bad) max_val = 1 CONFIG_DEF(number/ipintel_save_good) - protection = CONFIG_ENTRY_LOCKED value = 12 min_val = 0 CONFIG_DEF(number/ipintel_save_bad) - protection = CONFIG_ENTRY_LOCKED value = 1 min_val = 0 CONFIG_DEF(string/ipintel_domain) - protection = CONFIG_ENTRY_LOCKED value = "check.getipintel.net" CONFIG_DEF(flag/aggressive_changelog) From 126020185d097d3e68b6ec746aeda4f712e8ae0a Mon Sep 17 00:00:00 2001 From: ExcessiveUseOfCobblestone <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com> Date: Tue, 3 Oct 2017 18:55:21 -0400 Subject: [PATCH 102/141] Monkey Cubes expanding will give the new monkey an attack log with their creator (#31236) * Update snacks_meat.dm * no one wants to see that * WE'RE JUST SENDING IT TO ONE PLACE COBBY * boop * cool leoz tricks * Update snacks_meat.dm --- code/modules/food_and_drinks/food/snacks_meat.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index 7c8db01bcc..11426a4e04 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -185,7 +185,9 @@ /obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand() visible_message("[src] expands!") - new /mob/living/carbon/monkey(get_turf(src)) + var/mob/spammer = get_mob_by_key(src.fingerprintslast) + var/mob/living/carbon/monkey/bananas = new(get_turf(src)) + bananas.log_message("Spawned via [src] at [COORD(src)], Last attached mob: [key_name(spammer)].", INDIVIDUAL_ATTACK_LOG) qdel(src) /obj/item/reagent_containers/food/snacks/enchiladas From 3310d73b7fa063a94cd383d11f7b6a95b3672c17 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Wed, 4 Oct 2017 02:04:02 +0300 Subject: [PATCH 104/141] Greatly speeds up bees (#31250) * Bee perf * requested changes --- .../mob/living/simple_animal/hostile/bees.dm | 25 ++++++++++--------- .../living/simple_animal/hostile/hostile.dm | 6 ++++- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index f2d29d3660..9f7a7d1bbf 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -105,22 +105,22 @@ /mob/living/simple_animal/hostile/poison/bees/CanAttack(atom/the_target) . = ..() if(!.) - return 0 + return FALSE if(isliving(the_target)) var/mob/living/H = the_target return !H.bee_friendly() /mob/living/simple_animal/hostile/poison/bees/Found(atom/A) + if(isliving(A)) + var/mob/living/H = A + return !H.bee_friendly() if(istype(A, /obj/machinery/hydroponics)) var/obj/machinery/hydroponics/Hydro = A if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit) wanted_objects |= typecacheof(/obj/machinery/hydroponics) //so we only hunt them while they're alive/seeded/not visisted - return 1 - if(isliving(A)) - var/mob/living/H = A - return !H.bee_friendly() - return 0 + return TRUE + return FALSE /mob/living/simple_animal/hostile/poison/bees/AttackingTarget() @@ -187,7 +187,7 @@ if(loc == beehome) idle = min(100, ++idle) if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM)) - forceMove(get_turf(beehome)) + forceMove(beehome.drop_location()) else idle = max(0, --idle) if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME)) @@ -200,6 +200,7 @@ continue BB.bees |= src beehome = BB + break // End loop after the first compatible find. /mob/living/simple_animal/hostile/poison/bees/toxin/Initialize() . = ..() @@ -215,7 +216,7 @@ //the Queen doesn't leave the box on her own, and she CERTAINLY doesn't pollinate by herself /mob/living/simple_animal/hostile/poison/bees/queen/Found(atom/A) - return 0 + return FALSE //leave pollination for the peasent bees @@ -234,10 +235,10 @@ /mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B) if(!B) - return 0 + return FALSE if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent) - return 1 - return 0 + return TRUE + return FALSE /obj/item/queen_bee @@ -255,7 +256,7 @@ if(S.reagents.has_reagent("royal_bee_jelly")) //checked twice, because I really don't want royal bee jelly to be duped if(S.reagents.has_reagent("royal_bee_jelly",5)) S.reagents.remove_reagent("royal_bee_jelly", 5) - var/obj/item/queen_bee/qb = new(get_turf(user)) + var/obj/item/queen_bee/qb = new(user.drop_location()) qb.queen = new(qb) if(queen && queen.beegent) qb.queen.assign_reagent(queen.beegent) //Bees use the global singleton instances of reagents, so we don't need to worry about one bee being deleted and her copies losing their reagents. diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 2b29283c28..d4c9632a03 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -115,7 +115,11 @@ if(can_see(targets_from, HM, vision_range)) . += HM else - . = oview(vision_range, targets_from) + . = list() // The following code is only very slightly slower than just returning oview(vision_range, targets_from), but it saves us much more work down the line, particularly when bees are involved + for (var/obj/A in oview(vision_range, targets_from)) + . += A + for (var/mob/A in oview(vision_range, targets_from)) + . += A /mob/living/simple_animal/hostile/proc/FindTarget(var/list/possible_targets, var/HasTargetsList = 0)//Step 2, filter down possible targets to things we actually care about . = list() From f78d0988abea9c5478454fdf8a6ddf59366ba91f Mon Sep 17 00:00:00 2001 From: MoreRobustThanYou Date: Tue, 3 Oct 2017 19:11:49 -0400 Subject: [PATCH 106/141] Blobs now take damage from particle accelerators --- .../particle_accelerator/particle.dm | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 4519835c1f..6d663d1339 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -29,6 +29,7 @@ /obj/effect/accelerated_particle/Collide(atom/A) +<<<<<<< HEAD if(A) if(isliving(A)) toxmob(A) @@ -60,3 +61,39 @@ else sleep(speed) move() +======= + if(A) + if(isliving(A)) + toxmob(A) + else if(istype(A, /obj/machinery/the_singularitygen)) + var/obj/machinery/the_singularitygen/S = A + S.energy += energy + else if(istype(A, /obj/singularity)) + var/obj/singularity/S = A + S.energy += energy + else if(istype(A, /obj/structure/blob)) + var/obj/structure/blob/B = A + B.take_damage(energy*0.6) + movement_range = 0 + +/obj/effect/accelerated_particle/Crossed(atom/A) + if(isliving(A)) + toxmob(A) + + +/obj/effect/accelerated_particle/ex_act(severity, target) + qdel(src) + +/obj/effect/accelerated_particle/proc/toxmob(mob/living/M) + M.rad_act(energy*6) + +/obj/effect/accelerated_particle/proc/move() + if(!step(src,dir)) + forceMove(get_step(src,dir)) + movement_range-- + if(movement_range == 0) + qdel(src) + else + sleep(speed) + move() +>>>>>>> 056be96... Blobs now take damage from particle accelerators (#31181) From baa53ba1d3da4be78a1171db914ba3a4b739a1b7 Mon Sep 17 00:00:00 2001 From: oranges Date: Wed, 4 Oct 2017 12:12:49 +1300 Subject: [PATCH 107/141] Merge pull request #31208 from ShizCalev/AINT-NOTHIN-BUT-A-FIRE-STARTA Makes mobs on fire light up --- code/__DEFINES/lighting.dm | 2 ++ .../effects/temporary_visuals/miscellaneous.dm | 2 +- .../atmospherics/environmental/LINDA_fire.dm | 14 +++++++++++++- code/modules/mob/living/living.dm | 5 +++-- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 6d7c9568a9..819abd032f 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -70,6 +70,8 @@ #define LIGHT_COLOR_TUNGSTEN "#FAE1AF" //Extremely diluted yellow, close to skin color (for some reason). rgb(250, 225, 175) #define LIGHT_COLOR_HALOGEN "#F0FAFA" //Barely visible cyan-ish hue, as the doctor prescribed. rgb(240, 250, 250) +#define LIGHT_RANGE_FIRE 3 //How many tiles standard fires glow. + #define LIGHTING_PLANE_ALPHA_VISIBLE 255 #define LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE 192 #define LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE 128 //For lighting alpha, small amounts lead to big changes. even at 128 its hard to figure out what is dark and what is light, at 64 you almost can't even tell. diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 8b2d95f373..dfc5fb94d5 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -213,7 +213,7 @@ /obj/effect/temp_visual/fire icon = 'icons/effects/fire.dmi' icon_state = "3" - light_range = 3 + light_range = LIGHT_RANGE_FIRE light_color = LIGHT_COLOR_FIRE duration = 10 diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index a39a9059f3..93862f16b4 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -49,7 +49,7 @@ icon = 'icons/effects/fire.dmi' icon_state = "1" layer = ABOVE_OPEN_TURF_LAYER - light_range = 3 + light_range = LIGHT_RANGE_FIRE light_color = LIGHT_COLOR_FIRE var/volume = 125 @@ -175,3 +175,15 @@ ..() if(isliving(L)) L.fire_act(temperature, volume) + +/obj/effect/dummy/fire + name = "fire" + desc = "OWWWWWW. IT BURNS. Tell a coder if you're seeing this." + icon_state = "nothing" + light_color = LIGHT_COLOR_FIRE + light_range = LIGHT_RANGE_FIRE + +/obj/effect/dummy/fire/Initialize() + . = ..() + if(!isliving(loc)) + qdel(src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e1d854c0c8..f4e85e40fb 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -884,7 +884,7 @@ on_fire = 1 src.visible_message("[src] catches fire!", \ "You're set on fire!") - src.set_light(3) + new/obj/effect/dummy/fire(src) throw_alert("fire", /obj/screen/alert/fire) update_fire() return TRUE @@ -894,7 +894,8 @@ if(on_fire) on_fire = 0 fire_stacks = 0 - src.set_light(0) + for(var/obj/effect/dummy/fire/F in src) + qdel(F) clear_alert("fire") update_fire() From 5c49bab3c5aeb75a13bf29efe2ede78d491e6698 Mon Sep 17 00:00:00 2001 From: oranges Date: Wed, 4 Oct 2017 12:14:32 +1300 Subject: [PATCH 109/141] Merge pull request #31135 from KorPhaeron/unconvertable Adds a var to minds that makes them immune to conversion --- code/datums/mind.dm | 1 + code/game/gamemodes/clock_cult/clock_cult.dm | 2 ++ code/game/gamemodes/cult/cult.dm | 2 ++ code/game/gamemodes/revolution/revolution.dm | 10 ++++++---- code/game/objects/items/implants/implant_loyality.dm | 8 ++++---- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index a3bfa7d497..093e828452 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -63,6 +63,7 @@ var/mob/living/enslaved_to //If this mind's master is another mob (i.e. adamantine golems) var/datum/language_holder/language_holder + var/unconvertable = FALSE /datum/mind/New(var/key) src.key = key diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 0e72fe93aa..7d6f9bcdd1 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -53,6 +53,8 @@ Credit where due: return FALSE if(M.mind.enslaved_to && !is_servant_of_ratvar(M.mind.enslaved_to)) return FALSE + if(M.mind.unconvertable) + return FALSE else return FALSE if(iscultist(M) || isconstruct(M) || M.isloyal() || ispAI(M)) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 868e02589b..01773f1ea6 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -21,6 +21,8 @@ return FALSE if(M.mind.enslaved_to && !iscultist(M.mind.enslaved_to)) return FALSE + if(M.mind.unconvertable) + return FALSE else return FALSE if(M.isloyal() || issilicon(M) || isbot(M) || isdrone(M) || is_servant_of_ratvar(M)) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index add016dd8f..c1b6d13456 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -253,12 +253,14 @@ /datum/game_mode/proc/add_revolutionary(datum/mind/rev_mind) if(rev_mind.assigned_role in GLOB.command_positions) - return 0 + return FALSE var/mob/living/carbon/human/H = rev_mind.current//Check to see if the potential rev is implanted if(H.isloyal()) - return 0 + return FALSE if((rev_mind in revolutionaries) || (rev_mind in head_revolutionaries)) - return 0 + return FALSE + if(rev_mind.unconvertable) + return FALSE revolutionaries += rev_mind if(iscarbon(rev_mind.current)) var/mob/living/carbon/carbon_mob = rev_mind.current @@ -271,7 +273,7 @@ update_rev_icons_added(rev_mind) if(jobban_isbanned(rev_mind.current, ROLE_REV)) INVOKE_ASYNC(src, .proc/replace_jobbaned_player, rev_mind.current, ROLE_REV, ROLE_REV) - return 1 + return TRUE ////////////////////////////////////////////////////////////////////////////// //Deals with players being converted from the revolution (Not a rev anymore)// // Modified to handle borged MMIs. Accepts another var if the target is being borged at the time -- Polymorph. ////////////////////////////////////////////////////////////////////////////// diff --git a/code/game/objects/items/implants/implant_loyality.dm b/code/game/objects/items/implants/implant_loyality.dm index a1e9a0e4d5..ffaebf5a63 100644 --- a/code/game/objects/items/implants/implant_loyality.dm +++ b/code/game/objects/items/implants/implant_loyality.dm @@ -19,12 +19,12 @@ /obj/item/implant/mindshield/implant(mob/living/target, mob/user, silent = 0) if(..()) - if((target.mind in (SSticker.mode.head_revolutionaries))) + if((target.mind in (SSticker.mode.head_revolutionaries)) || target.mind.unconvertable) if(!silent) target.visible_message("[target] seems to resist the implant!", "You feel something interfering with your mental conditioning, but you resist it!") removed(target, 1) qdel(src) - return 0 + return FALSE if(target.mind in SSticker.mode.revolutionaries) SSticker.mode.remove_revolutionary(target.mind, FALSE, user) if(!silent) @@ -32,8 +32,8 @@ to_chat(target, "You feel something interfering with your mental conditioning, but you resist it!") else to_chat(target, "You feel a sense of peace and security. You are now protected from brainwashing.") - return 1 - return 0 + return TRUE + return FALSE /obj/item/implant/mindshield/removed(mob/target, silent = 0, special = 0) if(..()) From 1782fbeed7e0059e82cf4b25368b61803dfee2e2 Mon Sep 17 00:00:00 2001 From: XDTM Date: Wed, 4 Oct 2017 01:15:43 +0200 Subject: [PATCH 111/141] Adds the advanced medical scanner, gives one to the CMO --- code/game/objects/items/devices/scanners.dm | 81 ++++++++++++++++-- .../crates_lockers/closets/secure/medical.dm | 28 ++++++ icons/obj/device.dmi | Bin 37754 -> 37498 bytes 3 files changed, 101 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index e9a622365a..e55c728121 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -73,6 +73,7 @@ MASS SPECTROMETER origin_tech = "magnets=1;biotech=1" var/mode = 1 var/scanmode = 0 + var/advanced = FALSE /obj/item/device/healthanalyzer/attack_self(mob/user) if(!scanmode) @@ -97,7 +98,7 @@ MASS SPECTROMETER user.visible_message("[user] has analyzed [M]'s vitals.") if(scanmode == 0) - healthscan(user, M, mode) + healthscan(user, M, mode, advanced) else if(scanmode == 1) chemscan(user, M) @@ -105,7 +106,7 @@ MASS SPECTROMETER // Used by the PDA medical scanner too -/proc/healthscan(mob/living/user, mob/living/M, mode = 1) +/proc/healthscan(mob/living/user, mob/living/M, mode = 1, advanced = FALSE) if(user.incapacitated() || user.eye_blind) return //Damage specifics @@ -115,8 +116,8 @@ MASS SPECTROMETER var/brute_loss = M.getBruteLoss() var/mob_status = (M.stat == DEAD ? "Deceased" : "[round(M.health/M.maxHealth,0.01)*100] % healthy") - if(M.status_flags & FAKEDEATH) - mob_status = "Deceased" + if(M.status_flags & FAKEDEATH && !advanced) + mob_status = "Deceased" oxy_loss = max(rand(1, 40), oxy_loss, (300 - (tox_loss + fire_loss + brute_loss))) // Random oxygen loss if(ishuman(M)) @@ -141,19 +142,77 @@ MASS SPECTROMETER if(oxy_loss > 10) to_chat(user, "\t[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected.") if(tox_loss > 10) - to_chat(user, "\t[tox_loss > 50 ? "Critical" : "Dangerous"] amount of toxins detected.") + to_chat(user, "\t[tox_loss > 50 ? "Severe" : "Minor"] amount of toxin damage detected.") if(M.getStaminaLoss()) to_chat(user, "\tSubject appears to be suffering from fatigue.") + if(advanced) + to_chat(user, "\tFatigue Level: [M.getStaminaLoss()]%.") 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.") + if(advanced) + to_chat(user, "\tCellular Damage Level: [M.getCloneLoss()].") if (M.getBrainLoss() >= 100 || !M.getorgan(/obj/item/organ/brain)) to_chat(user, "\tSubject brain function is non-existent.") else if (M.getBrainLoss() >= 60) to_chat(user, "\tSevere brain damage detected. Subject likely to have mental retardation.") else if (M.getBrainLoss() >= 10) to_chat(user, "\tBrain damage detected. Subject may have had a concussion.") + if(advanced) + to_chat(user, "\tBrain Activity Level: [100 - M.getBrainLoss()]%.") + if (M.radiation) + to_chat(user, "\tSubject is irradiated.") + if(advanced) + to_chat(user, "\tRadiation Level: [M.radiation]%.") + + if(advanced && M.hallucinating()) + to_chat(user, "\tSubject is hallucinating.") + + //Eyes and ears + if(advanced) + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/organ/ears/ears = C.getorganslot("ears") + to_chat(user, "\t==EAR STATUS==") + if(istype(ears)) + var/healthy = TRUE + if(C.disabilities & DEAF) + healthy = FALSE + to_chat(user, "\tSubject is genetically deaf.") + else + if(ears.ear_damage) + to_chat(user, "\tSubject has [ears.ear_damage > UNHEALING_EAR_DAMAGE? "permanent ": "temporary "]hearing damage.") + healthy = FALSE + if(ears.deaf) + to_chat(user, "\tSubject is [ears.ear_damage > UNHEALING_EAR_DAMAGE ? "permanently ": "temporarily "] deaf.") + healthy = FALSE + if(healthy) + to_chat(user, "\tHealthy.") + else + to_chat(user, "\tSubject does not have ears.") + var/obj/item/organ/eyes/eyes = C.getorganslot("eye_sight") + to_chat(user, "\t==EYE STATUS==") + if(istype(eyes)) + var/healthy = TRUE + if(C.disabilities & BLIND) + to_chat(user, "\tSubject is blind.") + healthy = FALSE + if(C.disabilities & NEARSIGHT) + to_chat(user, "\tSubject is nearsighted.") + healthy = FALSE + if(eyes.eye_damage > 30) + to_chat(user, "\tSubject has severe eye damage.") + healthy = FALSE + else if(eyes.eye_damage > 20) + to_chat(user, "\tSubject has significant eye damage.") + healthy = FALSE + else if(eyes.eye_damage) + to_chat(user, "\tSubject has minor eye damage.") + healthy = FALSE + if(healthy) + to_chat(user, "\tHealthy.") + else + to_chat(user, "\tSubject does not have eyes.") + if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -177,7 +236,7 @@ MASS SPECTROMETER to_chat(user, "Body temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)") // Time of death - if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) + if(M.tod && (M.stat == DEAD || ((M.status_flags & FAKEDEATH) && !advanced))) to_chat(user, "Time of Death: [M.tod]") var/tdelta = round(world.time - M.timeofdeath) if(tdelta < (DEFIB_TIME_LIMIT * 10)) @@ -251,6 +310,12 @@ MASS SPECTROMETER if(0) to_chat(usr, "The scanner no longer shows limb damage.") +/obj/item/device/healthanalyzer/advanced + name = "advanced health analyzer" + icon_state = "health_adv" + desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy." + origin_tech = "magnets=3;biotech=3" + advanced = TRUE /obj/item/device/analyzer desc = "A hand-held environmental scanner which reports current gas levels." diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index a2a055f464..bf42619280 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -50,6 +50,7 @@ /obj/structure/closet/secure_closet/CMO name = "\proper chief medical officer's locker" req_access = list(ACCESS_CMO) +<<<<<<< HEAD icon_state = "cmo" /obj/structure/closet/secure_closet/CMO/PopulateContents() @@ -74,6 +75,33 @@ /obj/structure/closet/secure_closet/animal name = "animal control" +======= + icon_state = "cmo" + +/obj/structure/closet/secure_closet/CMO/PopulateContents() + ..() + new /obj/item/clothing/neck/cloak/cmo(src) + new /obj/item/storage/backpack/duffelbag/med(src) + new /obj/item/clothing/suit/bio_suit/cmo(src) + new /obj/item/clothing/head/bio_hood/cmo(src) + new /obj/item/clothing/suit/toggle/labcoat/cmo(src) + new /obj/item/clothing/under/rank/chief_medical_officer(src) + new /obj/item/clothing/shoes/sneakers/brown (src) + new /obj/item/cartridge/cmo(src) + new /obj/item/device/radio/headset/heads/cmo(src) + new /obj/item/device/megaphone/command(src) + new /obj/item/defibrillator/compact/loaded(src) + new /obj/item/clothing/gloves/color/latex/nitrile(src) + new /obj/item/storage/belt/medical(src) + new /obj/item/device/healthanalyzer/advanced(src) + new /obj/item/device/assembly/flash/handheld(src) + new /obj/item/reagent_containers/hypospray/CMO(src) + new /obj/item/device/autosurgeon/cmo(src) + new /obj/item/door_remote/chief_medical_officer(src) + +/obj/structure/closet/secure_closet/animal + name = "animal control" +>>>>>>> 6ed612c... Adds the advanced medical scanner, gives one to the CMO (#31179) req_access = list(ACCESS_SURGERY) /obj/structure/closet/secure_closet/animal/PopulateContents() diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 79f0a207d41d802e2e87d718157c7a5ca1983ffd..71ce7d6df59dbbd0a098accb71015e2ebf531509 100644 GIT binary patch literal 37498 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 IM6N<$g4x~S{r~^~ literal 37754 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 aH-6%}!&bucoQ)y~JeO=8ZK`qJNq+-{0&jQ# From 67f0c2f41c37503b4eb9297c1b506da7d1b84ac9 Mon Sep 17 00:00:00 2001 From: AnturK Date: Wed, 4 Oct 2017 01:18:58 +0200 Subject: [PATCH 112/141] Fixes mech fab runtime (#31232) * Dunno what the initial was about, it's a list. * Proper fixup * Typo --- code/datums/components/material_container.dm | 10 ++++++++-- code/game/machinery/autolathe.dm | 11 +++++------ code/game/mecha/mech_fabricator.dm | 8 +------- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index c790dcc1aa..d4b75e3892 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -17,6 +17,7 @@ var/show_on_examine var/list/allowed_typecache var/last_inserted_type + var/last_inserted_id var/last_amount_inserted var/last_insert_success var/datum/callback/precondition @@ -116,7 +117,7 @@ if(!amt) return 0 - insert_materials(S,amt) + last_inserted_id = insert_materials(S,amt) last_inserted_type = S.type S.use(amt) last_amount_inserted = amt @@ -133,17 +134,22 @@ if(!material_amount || !has_space(material_amount)) return 0 - insert_materials(I, multiplier) + last_inserted_id = insert_materials(I, multiplier) last_inserted_type = I.type last_amount_inserted = material_amount return material_amount /datum/component/material_container/proc/insert_materials(obj/item/I, multiplier = 1) //for internal usage only var/datum/material/M + var/primary_mat + var/max_mat_value = 0 for(var/MAT in materials) M = materials[MAT] M.amount += I.materials[MAT] * multiplier total_amount += I.materials[MAT] * multiplier + if(I.materials[MAT] > max_mat_value) + primary_mat = MAT + return primary_mat //For consuming material //mats is a list of types of material to use and the corresponding amounts, example: list(MAT_METAL=100, MAT_GLASS=200) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 9fa53765ed..4894952a69 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -134,12 +134,11 @@ if(ispath(lit, /obj/item/ore/bluespace_crystal)) use_power(max(500,M.last_amount_inserted/10)) else - var/obj/item/stack/S = lit - var/list/initmats = initial(S.materials) - if (initmats[MAT_METAL]) - flick("autolathe_o",src)//plays metal insertion animation - if (initmats[MAT_GLASS]) - flick("autolathe_r",src)//plays glass insertion animation + switch(M.last_inserted_id) + if (MAT_METAL) + flick("autolathe_o",src)//plays metal insertion animation + if (MAT_GLASS) + flick("autolathe_r",src)//plays glass insertion animation use_power(M.last_amount_inserted*100) updateUsrDialog() diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 8efc14d966..747647b1a5 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -420,13 +420,7 @@ var/datum/component/material_container/M = C if(!M.last_insert_success) return - var/lit = M.last_inserted_type - var/stack_name - if(ispath(lit, /obj/item/ore/bluespace_crystal)) - stack_name = "bluespace" - else - var/obj/item/stack/S = lit - stack_name = material2name(initial(S.materials)[1]) + var/stack_name = material2name(M.last_inserted_id) add_overlay("fab-load-[stack_name]") addtimer(CALLBACK(src, /atom/proc/cut_overlay, "fab-load-[stack_name]"), 10) updateUsrDialog() From 037ea0ce13ef444feef3345468d5de43abda9bb5 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Tue, 3 Oct 2017 18:20:59 -0500 Subject: [PATCH 114/141] Nightmare organs --- code/modules/mob/living/brain/brain_item.dm | 4 + .../mob/living/carbon/human/species.dm | 4 + .../human/species_types/shadowpeople.dm | 109 +++++++++++++++--- .../modules/spells/spell_types/shadow_walk.dm | 5 +- 4 files changed, 106 insertions(+), 16 deletions(-) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 13a34b6bae..de66a03c11 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -44,7 +44,11 @@ //Update the body's icon so it doesnt appear debrained anymore C.update_hair() +<<<<<<< HEAD /obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0) +======= +/obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0, no_id_transfer = FALSE) +>>>>>>> 085632f... Nightmare organs (#31034) ..() if(!special) if(C.has_brain_worms()) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 07f3acea48..9da5572f0e 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -68,7 +68,11 @@ //Flight and floating var/override_float = 0 +<<<<<<< HEAD +======= + var/obj/item/organ/brain/mutant_brain = /obj/item/organ/brain +>>>>>>> 085632f... Nightmare organs (#31034) var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes var/obj/item/organ/ears/mutantears = /obj/item/organ/ears var/obj/item/mutanthands diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 5c635fb870..5f8f125965 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -1,3 +1,5 @@ +#define HEART_RESPAWN_THRESHHOLD 40 + /datum/species/shadow // Humans cursed to stay in the darkness, lest their life forces drain. They regain health in shadow and die in light. name = "???" @@ -32,19 +34,14 @@ no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_w_uniform, slot_s_store) species_traits = list(NOBREATH,RESISTCOLD,RESISTPRESSURE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER,NO_UNDERWEAR,NOHUNGER,NO_DNA_COPY,NOTRANSSTING) mutanteyes = /obj/item/organ/eyes/night_vision/nightmare - var/obj/effect/proc_holder/spell/targeted/shadowwalk/shadowwalk + mutant_organs = list(/obj/item/organ/heart/nightmare) + mutant_brain = /obj/item/organ/brain/nightmare - var/info_text = "You are a Nightmare. The ability shadow walk allows unlimited, unrestricted movement in the dark using. \ - Your light eater will destroy any light producing objects you attack, as well as destroy any lights a living creature may be holding. You will automatically dodge gunfire and melee attacks when on a dark tile." + var/info_text = "You are a Nightmare. The ability shadow walk allows unlimited, unrestricted movement in the dark while activated. \ + Your light eater will destroy any light producing objects you attack, as well as destroy any lights a living creature may be holding. You will automatically dodge gunfire and melee attacks when on a dark tile. If killed, you will eventually revive if left in darkness." /datum/species/shadow/nightmare/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() - var/obj/effect/proc_holder/spell/targeted/shadowwalk/SW = new - C.AddSpell(SW) - shadowwalk = SW - var/obj/item/light_eater/blade = new - C.put_in_hands(blade) - to_chat(C, "[info_text]") C.real_name = "Nightmare" @@ -53,11 +50,6 @@ C.mind.name = "Nightmare" C.dna.real_name = "Nightmare" -/datum/species/shadow/nightmare/on_species_loss(mob/living/carbon/C) - . = ..() - if(shadowwalk) - C.RemoveSpell(shadowwalk) - /datum/species/shadow/nightmare/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H) var/turf/T = H.loc if(istype(T)) @@ -68,6 +60,93 @@ return -1 return 0 + + +//Organs + +/obj/item/organ/brain/nightmare + name = "tumorous mass" + desc = "A fleshy growth that was dug out of the skull of a Nightmare." + icon_state = "brain-x-d" + var/obj/effect/proc_holder/spell/targeted/shadowwalk/shadowwalk + +/obj/item/organ/brain/nightmare/Insert(mob/living/carbon/M, special = 0) + ..() + if(M.dna.species.id != "nightmare") + M.set_species(/datum/species/shadow/nightmare) + visible_message("[M] thrashes as [src] takes root in their body!") + var/obj/effect/proc_holder/spell/targeted/shadowwalk/SW = new + M.AddSpell(SW) + shadowwalk = SW + + +/obj/item/organ/brain/nightmare/Remove(mob/living/carbon/M, special = 0) + if(shadowwalk) + M.RemoveSpell(shadowwalk) + ..() + + +/obj/item/organ/heart/nightmare + name = "heart of darkness" + desc = "An alien organ that twists and writhes when exposed to light." + icon = 'icons/obj/surgery.dmi' + icon_state = "demon_heart-on" + color = "#1C1C1C" + var/respawn_progress = 0 + var/obj/item/light_eater/blade + + +/obj/item/organ/heart/nightmare/attack(mob/M, mob/living/carbon/user, obj/target) + if(M != user) + return ..() + user.visible_message("[user] raises [src] to their mouth and tears into it with their teeth!", \ + "[src] feels unnaturally cold in your hands. You raise [src] your mouth and devour it!") + playsound(user, 'sound/magic/demon_consume.ogg', 50, 1) + + + user.visible_message("Blood erupts from [user]'s arm as it reforms into a weapon!", \ + "Icy blood pumps through your veins as your arm reforms itself!") + user.temporarilyRemoveItemFromInventory(src, TRUE) + Insert(user) + +/obj/item/organ/heart/nightmare/Insert(mob/living/carbon/M, special = 0) + ..() + blade = new/obj/item/light_eater + M.put_in_hands(blade) + START_PROCESSING(SSobj, src) + +/obj/item/organ/heart/nightmare/Remove(mob/living/carbon/M, special = 0) + STOP_PROCESSING(SSobj, src) + respawn_progress = 0 + if(blade) + QDEL_NULL(blade) + M.visible_message("\The [blade] disintegrates!") + ..() + +/obj/item/organ/heart/nightmare/Stop() + return 0 + +/obj/item/organ/heart/nightmare/update_icon() + return //always beating visually + +/obj/item/organ/heart/nightmare/process() + if(QDELETED(owner) || owner.stat != DEAD) + respawn_progress = 0 + return + var/turf/T = get_turf(owner) + if(istype(T)) + var/light_amount = T.get_lumcount() + if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) + respawn_progress++ + playsound(owner,'sound/effects/singlebeat.ogg',40,1) + if(respawn_progress >= HEART_RESPAWN_THRESHHOLD) + owner.revive(full_heal = TRUE) + owner.visible_message("[owner] staggers to their feet!") + playsound(owner, 'sound/hallucinations/far_noise.ogg', 50, 1) + respawn_progress = 0 + +//Weapon + /obj/item/light_eater name = "light eater" icon_state = "arm_blade" @@ -113,3 +192,5 @@ visible_message("[O] is disintegrated by [src]!") O.burn() playsound(src, 'sound/items/welder.ogg', 50, 1) + +#undef HEART_RESPAWN_THRESHHOLD \ No newline at end of file diff --git a/code/modules/spells/spell_types/shadow_walk.dm b/code/modules/spells/spell_types/shadow_walk.dm index 45ea521098..9f9b4ac223 100644 --- a/code/modules/spells/spell_types/shadow_walk.dm +++ b/code/modules/spells/spell_types/shadow_walk.dm @@ -25,8 +25,9 @@ if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) playsound(get_turf(user), 'sound/magic/ethereal_enter.ogg', 50, 1, -1) visible_message("[user] melts into the shadows!") - user.AdjustStun(-20, 0) - user.AdjustKnockdown(-20, 0) + user.SetStun(0, FALSE) + user.SetKnockdown(0, FALSE) + user.setStaminaLoss(0, 0) var/obj/effect/dummy/shadow/S2 = new(get_turf(user.loc)) user.forceMove(S2) S2.jaunter = user From dc41460926b9cbd04351113a1e12958715bf3916 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 3 Oct 2017 19:27:57 -0400 Subject: [PATCH 115/141] Issues created with the report issue button will contain the round ID (#30998) * Issues created with the report issue button will contain the round ID * Update interface.dm * More url encoding * URL ENCODE THE PLANET! * Server name * Fix trevis * Too many god damn fucking brackets here --- interface/interface.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/interface.dm b/interface/interface.dm index 9d420e9821..a67cc5d290 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -65,7 +65,9 @@ message += GLOB.revdata.GetTestMergeInfo(FALSE) if(tgalert(src, message, "Report Issue","Yes","No")=="No") return - src << link("[githuburl]/issues/new") + var/static/issue_template = file2text(".github/ISSUE_TEMPLATE.md") + var/servername = CONFIG_GET(string/servername) + src << link("[githuburl]/issues/new[GLOB.round_id ? "?body=[url_encode("Issue reported from Round ID: [GLOB.round_id][servername ? " ([servername])" : ""]\n\n[issue_template]")]" : ""]") else to_chat(src, "The Github URL is not set in the server configuration.") return From 65a73bcefa6374507418e497246df555cf5c3c49 Mon Sep 17 00:00:00 2001 From: Armhulen Date: Tue, 3 Oct 2017 16:40:53 -0700 Subject: [PATCH 117/141] Gives nightmares a random shadowling name (#31188) * fuck you ruined my !ONE COMMIT PR! * !ONE COMMIT PR! --- code/_globalvars/lists/names.dm | 1 + .../living/carbon/human/species_types/shadowpeople.dm | 8 ++++---- strings/names/nightmare.txt | 10 ++++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 strings/names/nightmare.txt diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index 522ff84ff0..d855c7f141 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -15,6 +15,7 @@ GLOBAL_LIST_INIT(carp_names, world.file2list("strings/names/carp.txt")) GLOBAL_LIST_INIT(golem_names, world.file2list("strings/names/golem.txt")) GLOBAL_LIST_INIT(plasmaman_names, world.file2list("strings/names/plasmaman.txt")) GLOBAL_LIST_INIT(posibrain_names, world.file2list("strings/names/posibrain.txt")) +GLOBAL_LIST_INIT(nightmare_names, world.file2list("strings/names/nightmare.txt")) GLOBAL_LIST_INIT(verbs, world.file2list("strings/names/verbs.txt")) diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 5c635fb870..de61ef7220 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -47,11 +47,11 @@ to_chat(C, "[info_text]") - C.real_name = "Nightmare" - C.name = "Nightmare" + C.real_name = "[pick(GLOB.nightmare_names)]" + C.name = C.real_name if(C.mind) - C.mind.name = "Nightmare" - C.dna.real_name = "Nightmare" + C.mind.name = C.real_name + C.dna.real_name = C.real_name /datum/species/shadow/nightmare/on_species_loss(mob/living/carbon/C) . = ..() diff --git a/strings/names/nightmare.txt b/strings/names/nightmare.txt new file mode 100644 index 0000000000..b8798b734d --- /dev/null +++ b/strings/names/nightmare.txt @@ -0,0 +1,10 @@ +U'ruan +Y`shej +Nex +Hel-uae +Noaey'gief +Mii`mahza +Amerziox +Gyrg-mylin +Kanet'pruunance +Vigistaezian \ No newline at end of file From e4d6219f1d43fdb4d8673c8f601ae163460b650b Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 3 Oct 2017 18:46:41 -0500 Subject: [PATCH 119/141] Update brain_item.dm --- code/modules/mob/living/brain/brain_item.dm | 8 -------- 1 file changed, 8 deletions(-) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index fbff6a5285..fd7b8a8db3 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -46,15 +46,7 @@ /obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0,no_id_transfer = FALSE) ..() -<<<<<<< HEAD - if(!special) - if(C.has_brain_worms()) - var/mob/living/simple_animal/borer/B = C.has_brain_worms() - B.leave_victim() //Should remove borer if the brain is removed - RR - if(!gc_destroyed || (owner && !owner.gc_destroyed)) -======= if((!gc_destroyed || (owner && !owner.gc_destroyed)) && !no_id_transfer) ->>>>>>> 85cd9e6... Organ initialization cleanup transfer_identity(C) C.update_hair() From dc9b438bd8527649f5c465edd918adb512b05776 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 3 Oct 2017 18:47:01 -0500 Subject: [PATCH 120/141] Update skeletons.dm --- .../carbon/human/species_types/skeletons.dm | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index f9c731a4ce..be03e591aa 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -1,18 +1,3 @@ -<<<<<<< HEAD -/datum/species/skeleton - // 2spooky - name = "Spooky Scary Skeleton" - id = "skeleton" - say_mod = "rattles" - blacklisted = 1 - sexes = 0 - meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton - species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYDISMEMBER,EASYLIMBATTACHMENT) - mutant_organs = list(/obj/item/organ/tongue/bone) - damage_overlay_type = ""//let's not show bloody wounds or burns over bones. - disliked_food = NONE - liked_food = NONE -======= /datum/species/skeleton // 2spooky name = "Spooky Scary Skeleton" @@ -25,5 +10,4 @@ mutanttongue = /obj/item/organ/tongue/bone damage_overlay_type = ""//let's not show bloody wounds or burns over bones. disliked_food = NONE - liked_food = GROSS | MEAT | RAW ->>>>>>> 85cd9e6... Organ initialization cleanup + liked_food = NONE From 2ec77d2d9b79052ee59c0990fa5a1eec0afbd2dd Mon Sep 17 00:00:00 2001 From: oranges Date: Wed, 4 Oct 2017 12:47:28 +1300 Subject: [PATCH 121/141] Merge pull request #31237 from Cyberboss/STAPIUpdate Server tools API update to 3.1.0.1 --- code/__DEFINES/server_tools.dm | 9 ++++++--- code/modules/server_tools/st_interface.dm | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/server_tools.dm b/code/__DEFINES/server_tools.dm index b86a54959f..2773965d9c 100644 --- a/code/__DEFINES/server_tools.dm +++ b/code/__DEFINES/server_tools.dm @@ -1,4 +1,4 @@ -// /tg/station 13 server tools API v3.1 +// /tg/station 13 server tools API v3.1.0.1 //CONFIGURATION //use this define if you want to do configuration outside of this file @@ -21,6 +21,8 @@ #define SERVER_TOOLS_LOG(message) log_world("SERVICE: [##message]") //Notify current in-game administrators of a string `event` #define SERVER_TOOLS_NOTIFY_ADMINS(event) message_admins(##event) +//The current amount of connected clients +#define SERVER_TOOLS_CLIENT_COUNT GLOB.clients.len #endif //Required hooks: @@ -62,7 +64,7 @@ //IMPLEMENTATION -#define SERVICE_API_VERSION_STRING "3.1.0.0" +#define SERVICE_API_VERSION_STRING "3.1.0.1" #define REBOOT_MODE_NORMAL 0 #define REBOOT_MODE_HARD 1 @@ -78,12 +80,13 @@ #define SERVICE_CMD_GRACEFUL_SHUTDOWN "graceful_shutdown" #define SERVICE_CMD_WORLD_ANNOUNCE "world_announce" #define SERVICE_CMD_LIST_CUSTOM "list_custom_commands" +#define SERVICE_CMD_API_COMPATIBLE "api_compat" +#define SERVICE_CMD_PLAYER_COUNT "client_count" #define SERVICE_CMD_PARAM_KEY "serviceCommsKey" #define SERVICE_CMD_PARAM_COMMAND "command" #define SERVICE_CMD_PARAM_SENDER "sender" #define SERVICE_CMD_PARAM_CUSTOM "custom" -#define SERVICE_CMD_API_COMPATIBLE "api_compat" #define SERVICE_JSON_PARAM_HELPTEXT "help_text" #define SERVICE_JSON_PARAM_ADMINONLY "admin_only" diff --git a/code/modules/server_tools/st_interface.dm b/code/modules/server_tools/st_interface.dm index 12fb5a85c2..10b7f920e8 100644 --- a/code/modules/server_tools/st_interface.dm +++ b/code/modules/server_tools/st_interface.dm @@ -89,6 +89,8 @@ SERVER_TOOLS_DEFINE_AND_SET_GLOBAL(server_tools_api_compatible, FALSE) return "No message set!" SERVER_TOOLS_WORLD_ANNOUNCE(msg) return "SUCCESS" + if(SERVICE_CMD_PLAYER_COUNT) + return "[SERVER_TOOLS_CLIENT_COUNT]" if(SERVICE_CMD_LIST_CUSTOM) return json_encode(ListServiceCustomCommands(FALSE)) else From 0206e3f77546b61ebf9724436807aae03ba07e91 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 3 Oct 2017 18:48:18 -0500 Subject: [PATCH 123/141] Update particle.dm --- .../particle_accelerator/particle.dm | 90 ++++++------------- 1 file changed, 28 insertions(+), 62 deletions(-) diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm index 6d663d1339..f04c61426b 100644 --- a/code/modules/power/singularity/particle_accelerator/particle.dm +++ b/code/modules/power/singularity/particle_accelerator/particle.dm @@ -1,67 +1,34 @@ -/obj/effect/accelerated_particle - name = "Accelerated Particles" - desc = "Small things moving very fast." - icon = 'icons/obj/machines/particle_accelerator.dmi' - icon_state = "particle" +/obj/effect/accelerated_particle + name = "Accelerated Particles" + desc = "Small things moving very fast." + icon = 'icons/obj/machines/particle_accelerator.dmi' + icon_state = "particle" anchored = TRUE density = FALSE - var/movement_range = 10 - var/energy = 10 - var/speed = 1 - -/obj/effect/accelerated_particle/weak - movement_range = 8 - energy = 5 - -/obj/effect/accelerated_particle/strong - movement_range = 15 - energy = 15 - -/obj/effect/accelerated_particle/powerful - movement_range = 20 - energy = 50 - - -/obj/effect/accelerated_particle/New(loc) - ..() - - addtimer(CALLBACK(src, .proc/move), 1) - - + var/movement_range = 10 + var/energy = 10 + var/speed = 1 + +/obj/effect/accelerated_particle/weak + movement_range = 8 + energy = 5 + +/obj/effect/accelerated_particle/strong + movement_range = 15 + energy = 15 + +/obj/effect/accelerated_particle/powerful + movement_range = 20 + energy = 50 + + +/obj/effect/accelerated_particle/New(loc) + ..() + + addtimer(CALLBACK(src, .proc/move), 1) + + /obj/effect/accelerated_particle/Collide(atom/A) -<<<<<<< HEAD - if(A) - if(isliving(A)) - toxmob(A) - else if(istype(A, /obj/machinery/the_singularitygen)) - var/obj/machinery/the_singularitygen/S = A - S.energy += energy - else if(istype(A, /obj/singularity)) - var/obj/singularity/S = A - S.energy += energy - - -/obj/effect/accelerated_particle/Crossed(atom/A) - if(isliving(A)) - toxmob(A) - - -/obj/effect/accelerated_particle/ex_act(severity, target) - qdel(src) - -/obj/effect/accelerated_particle/proc/toxmob(mob/living/M) - M.rad_act(energy*6) - -/obj/effect/accelerated_particle/proc/move() - if(!step(src,dir)) - forceMove(get_step(src,dir)) - movement_range-- - if(movement_range == 0) - qdel(src) - else - sleep(speed) - move() -======= if(A) if(isliving(A)) toxmob(A) @@ -96,4 +63,3 @@ else sleep(speed) move() ->>>>>>> 056be96... Blobs now take damage from particle accelerators (#31181) From b9967e64533992ae6636c4be50d399710333ef17 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 3 Oct 2017 18:48:43 -0500 Subject: [PATCH 124/141] Update medical.dm --- .../crates_lockers/closets/secure/medical.dm | 155 ++++++++---------- 1 file changed, 64 insertions(+), 91 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index bf42619280..ee9ecfc908 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -1,81 +1,55 @@ -/obj/structure/closet/secure_closet/medical1 - name = "medicine closet" - desc = "Filled to the brim with medical junk." - icon_state = "med" +/obj/structure/closet/secure_closet/medical1 + name = "medicine closet" + desc = "Filled to the brim with medical junk." + icon_state = "med" req_access = list(ACCESS_MEDICAL) - -/obj/structure/closet/secure_closet/medical1/PopulateContents() - ..() - new /obj/item/reagent_containers/glass/beaker(src) - new /obj/item/reagent_containers/glass/beaker(src) - new /obj/item/reagent_containers/dropper(src) - new /obj/item/reagent_containers/dropper(src) - new /obj/item/storage/belt/medical(src) - new /obj/item/storage/box/syringes(src) - new /obj/item/reagent_containers/glass/bottle/toxin(src) - new /obj/item/reagent_containers/glass/bottle/morphine(src) - new /obj/item/reagent_containers/glass/bottle/morphine(src) - for(var/i in 1 to 3) - new /obj/item/reagent_containers/glass/bottle/epinephrine(src) - for(var/i in 1 to 3) - new /obj/item/reagent_containers/glass/bottle/charcoal(src) - new /obj/item/storage/box/rxglasses(src) - -/obj/structure/closet/secure_closet/medical2 - name = "anesthetic closet" - desc = "Used to knock people out." + +/obj/structure/closet/secure_closet/medical1/PopulateContents() + ..() + new /obj/item/reagent_containers/glass/beaker(src) + new /obj/item/reagent_containers/glass/beaker(src) + new /obj/item/reagent_containers/dropper(src) + new /obj/item/reagent_containers/dropper(src) + new /obj/item/storage/belt/medical(src) + new /obj/item/storage/box/syringes(src) + new /obj/item/reagent_containers/glass/bottle/toxin(src) + new /obj/item/reagent_containers/glass/bottle/morphine(src) + new /obj/item/reagent_containers/glass/bottle/morphine(src) + for(var/i in 1 to 3) + new /obj/item/reagent_containers/glass/bottle/epinephrine(src) + for(var/i in 1 to 3) + new /obj/item/reagent_containers/glass/bottle/charcoal(src) + new /obj/item/storage/box/rxglasses(src) + +/obj/structure/closet/secure_closet/medical2 + name = "anesthetic closet" + desc = "Used to knock people out." req_access = list(ACCESS_SURGERY) - -/obj/structure/closet/secure_closet/medical2/PopulateContents() - ..() - for(var/i in 1 to 3) - new /obj/item/tank/internals/anesthetic(src) - for(var/i in 1 to 3) - new /obj/item/clothing/mask/breath/medical(src) - -/obj/structure/closet/secure_closet/medical3 - name = "medical doctor's locker" + +/obj/structure/closet/secure_closet/medical2/PopulateContents() + ..() + for(var/i in 1 to 3) + new /obj/item/tank/internals/anesthetic(src) + for(var/i in 1 to 3) + new /obj/item/clothing/mask/breath/medical(src) + +/obj/structure/closet/secure_closet/medical3 + name = "medical doctor's locker" req_access = list(ACCESS_SURGERY) - icon_state = "med_secure" - -/obj/structure/closet/secure_closet/medical3/PopulateContents() - ..() - new /obj/item/device/radio/headset/headset_med(src) - new /obj/item/defibrillator/loaded(src) - new /obj/item/clothing/gloves/color/latex/nitrile(src) - new /obj/item/storage/belt/medical(src) - new /obj/item/clothing/glasses/hud/health(src) - return - -/obj/structure/closet/secure_closet/CMO - name = "\proper chief medical officer's locker" + icon_state = "med_secure" + +/obj/structure/closet/secure_closet/medical3/PopulateContents() + ..() + new /obj/item/device/radio/headset/headset_med(src) + new /obj/item/defibrillator/loaded(src) + new /obj/item/clothing/gloves/color/latex/nitrile(src) + new /obj/item/storage/belt/medical(src) + new /obj/item/clothing/glasses/hud/health(src) + return + +/obj/structure/closet/secure_closet/CMO + name = "\proper chief medical officer's locker" req_access = list(ACCESS_CMO) -<<<<<<< HEAD - icon_state = "cmo" - -/obj/structure/closet/secure_closet/CMO/PopulateContents() - ..() - new /obj/item/clothing/neck/cloak/cmo(src) - new /obj/item/storage/backpack/duffelbag/med(src) - new /obj/item/clothing/suit/bio_suit/cmo(src) - new /obj/item/clothing/head/bio_hood/cmo(src) - new /obj/item/clothing/suit/toggle/labcoat/cmo(src) - new /obj/item/clothing/under/rank/chief_medical_officer(src) - new /obj/item/clothing/shoes/sneakers/brown (src) - new /obj/item/cartridge/cmo(src) - new /obj/item/device/radio/headset/heads/cmo(src) - new /obj/item/device/megaphone/command(src) - new /obj/item/defibrillator/compact/loaded(src) - new /obj/item/clothing/gloves/color/latex/nitrile(src) - new /obj/item/storage/belt/medical(src) - new /obj/item/device/assembly/flash/handheld(src) - new /obj/item/reagent_containers/hypospray/CMO(src) - new /obj/item/device/autosurgeon/cmo(src) - new /obj/item/door_remote/chief_medical_officer(src) - -/obj/structure/closet/secure_closet/animal - name = "animal control" -======= icon_state = "cmo" /obj/structure/closet/secure_closet/CMO/PopulateContents() @@ -101,21 +75,20 @@ /obj/structure/closet/secure_closet/animal name = "animal control" ->>>>>>> 6ed612c... Adds the advanced medical scanner, gives one to the CMO (#31179) req_access = list(ACCESS_SURGERY) - -/obj/structure/closet/secure_closet/animal/PopulateContents() - ..() - new /obj/item/device/assembly/signaler(src) - for(var/i in 1 to 3) - new /obj/item/device/electropack(src) - -/obj/structure/closet/secure_closet/chemical - name = "chemical closet" - desc = "Store dangerous chemicals in here." - icon_door = "chemical" - -/obj/structure/closet/secure_closet/chemical/PopulateContents() - ..() - new /obj/item/storage/box/pillbottles(src) - new /obj/item/storage/box/pillbottles(src) + +/obj/structure/closet/secure_closet/animal/PopulateContents() + ..() + new /obj/item/device/assembly/signaler(src) + for(var/i in 1 to 3) + new /obj/item/device/electropack(src) + +/obj/structure/closet/secure_closet/chemical + name = "chemical closet" + desc = "Store dangerous chemicals in here." + icon_door = "chemical" + +/obj/structure/closet/secure_closet/chemical/PopulateContents() + ..() + new /obj/item/storage/box/pillbottles(src) + new /obj/item/storage/box/pillbottles(src) From e66e99776f5764e2a36e9462c8b9dc7d31940607 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Oct 2017 18:49:24 -0500 Subject: [PATCH 125/141] Automatic changelog generation for PR #3096 [ci skip] --- html/changelogs/AutoChangeLog-pr-3096.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3096.yml diff --git a/html/changelogs/AutoChangeLog-pr-3096.yml b/html/changelogs/AutoChangeLog-pr-3096.yml new file mode 100644 index 0000000000..4031580453 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3096.yml @@ -0,0 +1,4 @@ +author: "Kor" +delete-after: True +changes: + - bugfix: "You can now tell when someone is in soft crit by examining them." From b7473ec008ed7c49f6c74e29da307a01674d376e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Oct 2017 19:11:26 -0500 Subject: [PATCH 126/141] Automatic changelog generation for PR #3102 [ci skip] --- html/changelogs/AutoChangeLog-pr-3102.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3102.yml diff --git a/html/changelogs/AutoChangeLog-pr-3102.yml b/html/changelogs/AutoChangeLog-pr-3102.yml new file mode 100644 index 0000000000..bc737b6a13 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3102.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - bugfix: "Bees now come with reduced amounts of free lag" From f8f278dfd58e6dfef752d3593ae474389fc429dd Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 3 Oct 2017 19:16:12 -0500 Subject: [PATCH 127/141] Automatic changelog generation for PR #3093 [ci skip] --- html/changelogs/AutoChangeLog-pr-3093.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3093.yml diff --git a/html/changelogs/AutoChangeLog-pr-3093.yml b/html/changelogs/AutoChangeLog-pr-3093.yml new file mode 100644 index 0000000000..bc2a009a41 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3093.yml @@ -0,0 +1,6 @@ +author: "Shock Collars" +delete-after: True +changes: + - rscadd: "Added Shock Collars to hacked autolathes." + - imageadd: "On character sprites, credit to Toriate" + - imageadd: "Object sprite, credit to Toriate" From 3a5e3bc53012ef0d726616506c4f81312977140f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 4 Oct 2017 01:13:37 -0500 Subject: [PATCH 128/141] Automatic changelog generation for PR #3104 [ci skip] --- html/changelogs/AutoChangeLog-pr-3104.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3104.yml diff --git a/html/changelogs/AutoChangeLog-pr-3104.yml b/html/changelogs/AutoChangeLog-pr-3104.yml new file mode 100644 index 0000000000..e6f9d22374 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3104.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - balance: "Blobs now take damage from particle accelerators" From 07e407a02f3dcb38424aeb61ca280f262b251e98 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 4 Oct 2017 01:14:09 -0500 Subject: [PATCH 129/141] Automatic changelog generation for PR #3108 [ci skip] --- html/changelogs/AutoChangeLog-pr-3108.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3108.yml diff --git a/html/changelogs/AutoChangeLog-pr-3108.yml b/html/changelogs/AutoChangeLog-pr-3108.yml new file mode 100644 index 0000000000..f1e03db19a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3108.yml @@ -0,0 +1,4 @@ +author: "XDTM" +delete-after: True +changes: + - rscadd: "The CMO now has an advanced health analyzer in his closet! It can give more precise readings on the non-standard damage types." From daa5bc6128c2437e61f3e69954d5a1b6cd25d2e5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 4 Oct 2017 01:14:23 -0500 Subject: [PATCH 130/141] Automatic changelog generation for PR #3110 [ci skip] --- html/changelogs/AutoChangeLog-pr-3110.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3110.yml diff --git a/html/changelogs/AutoChangeLog-pr-3110.yml b/html/changelogs/AutoChangeLog-pr-3110.yml new file mode 100644 index 0000000000..7d06447f99 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3110.yml @@ -0,0 +1,4 @@ +author: "Kor" +delete-after: True +changes: + - rscadd: "Nightmares now have mutant hearts and brains, with their own special properties when consumed or implanted in mobs. Experiment!" From cdc76957419834571baf3f90239417a956c58f2d Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Wed, 4 Oct 2017 12:11:24 +0300 Subject: [PATCH 131/141] Makes gutlunches hungry for gibs again (#31241) * gutlunch fix * combine ifs, removes unneeded check --- .../mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm index dda0b3abad..04282d12fd 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm @@ -62,6 +62,9 @@ return TRUE + if(isobj(the_target) && is_type_in_typecache(the_target, wanted_objects)) + return TRUE + return FALSE /mob/living/simple_animal/hostile/asteroid/gutlunch/Destroy() From 951c9d04f24b2e8e63762cb1452279c9f867563a Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 4 Oct 2017 08:11:42 -0300 Subject: [PATCH 133/141] Merge pull request #31261 from AnturK/lockedslot Fixes species locked slots alpha. --- code/_onclick/hud/human.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 1d36f7d31e..4d1ca2c778 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -313,11 +313,15 @@ inv.hud = src inv_slots[inv.slot_id] = inv inv.update_icon() + + update_locked_slots() /datum/hud/human/update_locked_slots() if(!mymob) return var/mob/living/carbon/human/H = mymob + if(!istype(H) || !H.dna.species) + return var/datum/species/S = H.dna.species for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) From 5b8eb58266dab2e84b9f5730b7d4948239b0001a Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 4 Oct 2017 08:14:04 -0300 Subject: [PATCH 135/141] Merge pull request #31260 from ShizCalev/alium-sheets Adds missing abductor metal sheet sprites --- icons/obj/abductor.dmi | Bin 55759 -> 56555 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi index 21ab5cf9f50e28dda0ac4ee04bd4d884fe0782a6..64a877c2a1257e30f83470f89495a34abbb82290 100644 GIT binary patch delta 25092 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 delta 24290 zcmYhiWmsHIuq_P1Jqf`bg1fr~cXthL0fPHRf&_QhV8JE0y99T4clTkqllPo^zwgh? zJhS)o^scV1u3Br=Ni)pEADGzB0F9Trwu`vAv#FD{ql>kJJrtBjW>)f;{R#`};KY?0 z;+Y1z9XFoSu(=%T?xaZV+nzuj=qtRgEWad>bna5$Vi+rRBE z-~05^lhqYEk6=u9>&epCVro5TNXJ6Rf<(MW@=b5-Qj6-CmtCfAqBYK4)hu(0zJyFB zzzq*NKMk>8=4pLi~UJ7wS4t4~rin6pC&h^qE z=uUYHwDxlPop@k8lNM=!HD!tyb2%DYLih2YK)kjlous^I&PkzcFMYl)&;8so>wX1V z7L6)#UR2i~GsoVIiwZA5wXik%4;fTPA%#;BVZrNNZUqLODIpmtu+wd!+2SIfsM_c9 zL`M8!OX_rR*Fv=)v%*>-+`rv9UAme>NjRCQa z{<1%`NJgqN9W+TP<+Olar~?CItEgm9MV9%*>apF+E`WRPbi41AHirD;BBnY{%1e#-WovX{`_Y!M_~`Hj=Q4!IC1$ZS*n zhK>68JAlMn?8_VY7XMWC_|L-N1?DU10Y>s%|4 z31%^Jb>6QfM*eGDZ-8g1p5BrI+qJY5j84RN*(i9oAzZctHHw9ULoF~LnRb+(AM)JJ zl>!j+0EC+?`Yg%M9h`Soe5kk&GO~|X%MU?Utr@!+R9x(~IdLC>ZqTyuDZAf>%Tm*t z#~pFOTbbM@0F^f2i`SKTwo=6p`quBD_}JO@{2gk%N_fjmR+xf&QOj>7< z(Zj1VlpkknXjLT8y@T?{^c3KUe8m{Jh=V$9I=`(N5q6nvTFZpdrkzb69D8x?aT4^o zNn<7Qw=pJw3XM7f?)(atqn>Vmpz}u#7BBnfz=6g<%dX?hTq~AuL~R-eZyPV599~nG zt2cs3jEtqI)a~4#wsUI>n>(#yNBuK7ao4_s7Sb{$dmwF0S^wlgWVP zqjx=qrehU=TZ>4}w=8^=*8lrUu6_FBa~3qwPF*4yS=k=4p^~Lb$lZA8lr&u7Vfk=< zQv-eAEG3Clbxv%X^ui-F}AtVS1V~2CC%dmf7KMi zlaXxmXOaHWQ6c^JV328cGCtlr0^h7^6JJs%B&pHx4E5p=J4E0V90HVlFcmh=eBnNs z-_a3J)pHqb6^qb(6Ye-H6Pc|yeQa%HHoE=reuee*3hr2`bKSzH^*nsz4z#j_;-lG) z;N{;96)0>BHKir;8#Xv6tOx25MuT(_$>+EgM-0m!QOFH(56%72mJM|O4zNY@eqZHu z^fhz)%PI61&e?mY7rI>jSs`%`MdkG zA&1i^t*-i|BMy91;pwI(9?_Pxf3MGLt4eD-axQz387`u(CVQ}j^%+)?B=a|c$K5Y% z>Wo{K;^NwbMy2#SRTx6R*7f&iri0{bCFTibgTsX?2@vBN<3*#Y(OG&Ed zP*9{$GUB4@X)7jv1KcATcyHdt=36B9fqPe8M7CZ?Oq>&fQzl>wRxwxgh1y4;rsw+c z+DUN3o2QA;>t%v*|KTJp&#ORcohTaXBAqI-ucz7m%8mSHn9E;C$y+#~ zVP-UadU;dTNIn9ll8&a1Zq<)QJeViv_HMZy>QWsd9+_v7E+?iA)Pwx&a&8xrlE1&r zqLj|@p7ky0khnv++Cc4>dVi67sZJ-!dHx>GHUTruEEbz&O0Z*Do>eufGU()V%Q`o| z+YNf6ET%7oZOWvn6mGsDo8f8B?<(q6oKAD@rWZY8SO7*l`j8}V&T;|O-Nm=si~ zc)C9!sPCiZFjd=$bAA-#@UCyr=oN=fA`Q%g*H5fA0-&uqFTGHn&|d9j_Xk7$(td#) z*l2E`9+I!l^towUo2hHJS3k`;>&VUoa^UbqR2O58?;z8>NWx*@;}mpHh+Nh@F?fN^ z=km@sS1|>c6KNL`4F;aV2zI0zB89(SEB$3$5i;FBa4%iIb6eF0)ov6a zxA@sa@!~TxUgBSb?xUE^B{V|ku6o$NiMbu`yZ{nq>_B&P!yO~b{v!QoSFbe0K}R9G zU7?Drc3&-LGO2*t1Ncj~pvdz9olC;R+@GQ0ys`B-d~Wc0!cuTrmBxdxUzC4mo9qrL zr9BPb_;B3N+>H14#vWo{CE;}|pFvw*i_!$k1x2Ze;GDs`Dh-_vI|Oo%Q*I{k!AUH> zkOFovQwX2n-``)^c2hZJKJRRoK?myfz3FR<;G90GPv-tk?W2oVv8P4o4ruK+m1hje ze-N?s#%-HxI$Uum%vD!_-5@F#Lc(Ycx}e3`hd;Kqeg9N9wMt6UfheS<`v`zmj78JK7=(-X-9)tReDWWxqZ}gOth4cT z-SHRZ8K!U#(iq`r&9Jo&@ zK|#_u<_x-`xyP6vdU2LA843IL4F{V}{-`3q6897bZ*jW_qQk)}BPpxGwJVCspt-of z7OQQ#1@kA?cGmj%x%93_(!0udzRn!?`VGx}p=uAVkcPK5{<#O}Miu9q?5RxttgE@bt*IF;dE& zxH&MT#j2UUsJ(lNlDT|%XdLFis5KjId73p0k(!SpOF)sE#{7L4d+Y=A!7Fj@nG$ij};*!ODgo%h=#E$!wQ+5%ydmoOIeb9b)8 zK4}2^6%Ml@s)&8%-fGLqLX|_JwS$90i<`mDMz)VmV-}yUWLLTA{TBkZ4r7kdeS@b_VW{ZnXtY`fSfHbPMG1Qcs!rFG znz1C^%Fux0jWH`BD{Ji#o0OAt?s#6Go4?a2{SP5nj}#RDIoeF#aw3~?Je4(n-P4s4 zZx4^%B9-deMtXnret)FJw-9Os2c^98^Yo?JQQoXgy*wR?l?%$kegn(K{E3Yx=1r(s zvva2(lvwTR3L}Ua7Km=G=ye#mjfsfBJhtFbtso;O4@4v2(q{Da_VkR4jTI3W|8Yb( zj5v`ks5fiHap=M~^P0iFlEHj(pCmZTj3&(-aZ8?FMMm4MO>y1!NaMiAs^R^UfmoqU zDA>_gc;>>>Zr9(EiEpj`>)8B!PutQ{C?PXzc~6Rv2JtPI3t;UG#()7#k5OQ7!5Bs% zIk(o>z-lpnQfp48aW$OqdOz+(Hm6O9#$yBTo7Z$Ftq`u<#y*~kt}edg7^0q@LJP$@g^DkVzP2H`vrNsEw&IA zcb&px*3j$zn+YqpCm2PdUN=g!jFN>VwxHm%+C^Gj9mn+aG$INLOk|;b)4rFCygY}2 z6kBybKtMrJ5xK$4D&j^M#AQ-o0RT|(q8SB@;vtTgAUxL=q3gVNcBWusQ+foAih*JI z`g~`_k?ys2Y3~M3r59RAPDtnl)I#5migT#AxlpdwdyQV{KmWSZa9|?6xlk=B zI8-;2ci-gRT$yAuRCFmqlupz6@zA2UyK3}hvIxB|dWPM*5hW*T>SmP~=QKbna7$@t zLL`7aDCS$ZysRu+g^!vR+Er^N5FV+6uNzW|Oh+Vcf~n7g(F8prnX;u!o9kZkwOk7A z(zmVQUARO5pE7PKRummecB=NVyBNeagGB;Z6@a zw*9|ra3IQh6bAv1><5yCZ6j2Td*xCnZ|G=`u2XewoOf~!y}fV5qg4;)y~b$m=K}pH zyq6*UfwKxuu9TlgY|=Uf@?_Z8je4{g93bbo8N<*gN1T}5WFh6!}M z6+lNHkstbypaMfoykqLZXHeiNQ$-5~6tlvQdfuIW%tJjycY%U80W!hG7R;Hj=TO%y zimqIQjvluvr3)217ns!7omu>z)1Cqu7}?=zn+FTzehZZbrX8gq64}C!d77JJDD{g9 zb@^ibRjWzo()DVb&m4k8*ZkFIo1&j~25MqFB%j92uXkO}&-Z)#B5;m4b-IgJ6#FCX z$=+t$r&xnSem)9a0q*2N-ce{9z(}3{3sS2`Ffmrv(H3lwa;`u_a+iVg;UdX8T}ePU zlcPIaqUhu=F&`g0T!Voq+wY)8{?4~{)(Jjl5o>_CiXIS2d&0)})H%`_(LINrdA8YA zDA3||zndSCf~yTFN0wPTDw~5!Q=-zY-3zW!CnoD{7bKqmSIVTWdR<1y4x!5NF^$*P zQbp^-=JdbcmXeV8>Ck>Rk9I^J9v;r->daa7fl;?kIxIRGyIY&0Mdjj6GEM@XG>Ku< zx2B5b+yczSX)8AJ+p%=7O1RWB+)j0#Q1T6@OR*ria>(Hl}tdRJC5 zc6ZI@%XMb9UlMyTz7Zho$Fm9RnfYjXL#I8YKT6$UKP$SDmo}x=3t#m5&C<+YtPGCq z4E{N>$=RmhBigCgoj+fe_`ovv2iw72JDDwL4ijZ5Zz`98$zr>JZ9J=WUaC1SWis;( zK;Ebh^yRq-{Q33k;>yaOnWeOv`a-({Ex&yXmls&Fw;<%VuTfqEvQJ&R%P~tw0-YD z!aqVjwlK!2ZX!<7;=&UWiMYCQ&ek!20NE|1)Jt|FpBJtOi?v?zH|dt5$ZaPt+WX2% zD`YY*134dcsne{0gxuA3`0dc1=IG6M7(*rob&Tzl>7QMk;C>{f78eJjj#3%Fv8=Xi zPj1st#l1aH14!6y^gEibs`N@RFfgjztH$=^*tnlPJv~2DQ|}xd$yiy@>`QV}Q-@AYD$jT} zaJ1|X7%qnd2mecKw6#-@ga83SK^a9wcv32=fo*(OfSQ_G?ZGcFC@78Jy>c;LUWBbp zbznyK`{b-(+w1)bgHgvSl}`lf=6YGeo?l=6-f;5bMiBG|t?uYnkIadw8^Rd11{Aj+ zMhV?ak@P{wFTw)txc?~B#NJUhleTHd;!Og zTCT-=S|CQ2`FoFxNRWn=txKHz9x(WkV2RFl@1C+96il z(ScXwqF5SD$;(#&B#NHk@td5r(R}~Cg-7q>+!)?W2Dby^rm?iKEx9x$h!a=}uZo@mrqHI`O8(}(IaIe# zGM}lae$Ckc3Req+9R-=0gj{xu{$_{WRsv%W^&wM9sAYYKh=@=u-`d;SF7NLLMn=lk zeWg*4e3X=wW?Tz5AU?LcyBnL5V!6DLS`hDIP;WuVAr*fG+|6mlu^n!VaGOIV{C$U; zdTIo4|>#v__`CuV26B?86yfXzgK zSTMMor8{UlRR5=vpwxyiBu`dIxMS)rYtT!(*E@1w8#dmcp&l=@BNRVp;d2 z9y#4-ExuO)8=zIb`%xmI17dvfNIgKKc%-@V|2|cy`dEnr`VLFu_v6>jW%s9(vbfnS zTm^h-N<31Cb39u-$DhVY+St&cqoZq9QQYyc%_FjyzjLiZ&~}0O7S7Ch{I0;aDG0#A zd$?Q*&nmd5qYx6x?s8USm_W3=3cX^P?RF_oMB?ZVwWSfByW5{ZfH9_wUS^ew|&@sOL zk{j}LH-E$UZoi!cYM1RUsd>2ZYbJ_#;QQ_g^5scfQPDmXA6@Feg}>iwyc9)dr40P%N&>RP2v$L7aZ6THL;eqbtaGc(`viji%<`KK(_YNu&j_9@> zkaWADlw9=MSR0XzrUGr@GI1h2bTAY=f1D++?RLzIOR+QmO%f!?R2p?9iYk``|B#tH zgPICA5ZFYX4OAm*+nbDP^4I<-Sl71lAY*tx;!mbAdPM^hM3lG;+&q9f?2g=m{n;&# zug0RPX4dH)?+lz)z5DClAjgfeHN$s)s(D->qr{EH_9HN(+JdBXBZoTpcTvKM)Zy?(got|L}pV*~6}< z5n*wLH^EOU^XE|$j=z}(7lOXCC_+0G(Cdv1*MdxR@)3B5M*|@^uEDWO#Za}f#ocad zta_Vp3JZXdZl9q$ND#~|jSDG2jVPw5aznr0X(9N#A8QB`>~s#l1M^v+uIb;iFy~_r z3X$>!0bHvaZ@x`+F^7~BJ7P2#ErM`hu|vIEs=uO}`|l_%x7a_S0=pju%*^A`bUL3` zaDmBn93W$D#OkclU^I&-E<7B$w87Z`uk2L#QC|?qKb?E${7LGAf01v%gSO$#>gHg53;9mii%=dx@fEFP1e) z37W-0hILkP@3F8bWeaUeelR96jZIjOR)dL28ad}UFIA~Xn|bW!^kiBtc%An-c;XDL ztbWs~)wvQfKnfV`4xeUReEh%VI)9`U00qweM)mlVX;L1Z#aWg&@5jK-&Q9Dd9>NWM zDe?#@nD;Z^tE_om)v^=tPUolx1UI6EPu&MlwD}~Jnj=s;@CJWh!gQlC`Jp`c9V4aa zYqx!lk^lSX70f)Fc(cO)gbUwoA*Q&yd^4yp=WYGj!W1-K_~3ZSl#}Xr!dJ7+1T@vY z;C91onV_#eRTHcp!T;p^WHgkw!*6)`6>Fult>-=Sq8mO~hclHS7jtv+N!+aFBpLgP zKY6_u`z1ZKhp#=7Mzgw1zWWhU5tX0xy?pgDly?+$asr(x5(Uy+?=n})!*3TQUQhfv ziYx1T_KA`d>*TPE_;~4NX+1s!7O+YRp1vMFu&;2G~qXN%FpL< zAPTgv1Xl&oT@5wnk2Yf$isqWu2)ZXB^SB7T_Z)UzQ0NDocUcSt`B?XRFq?f|({L~z znz}FmhOKoMZzd1Tge};?9D-5je5Uwk1^4im-mqh{M_%0Xfkk%@6}pL00Hfd~tYGME z*S>5p#Sp$;cWigLL;u)vbuWYb(qQRp0?HvI3aM*qLcpEzhHonjh6Te3)R-hBF+o8v zuWY_DSIy#Izmj3_U~n2#y;uhro%-2Uqm=4aSlGA%;~2l8a}Q|wxzq{8D>N~Qi4{YC ze9R<&r_=Hki%3$l3(8{)I7jd>{6p9&{B-pMlXG(t|E7Y!90viHT=2Lki(9&M(R|SEfu9#^3YhXc-T2)9ZmJ`@P$nNp3=PN@1xA)z4;rPK246zg5 z-;+>`n+Lzmc)~GC2giq?;!a+qSM;9zaUQI7F)ay!Q@7%(9Ui9rp5Nh$U4QQEf3bGx zOvR$_J=qQ ztDrf>1qN}Xn#u>@{QUe=P6Y{4)YZk=Z;C_36zS3t&&z8j%_PF@M$=2LH!x`L*7}#% z-S!(_&Q4Oeq5Oppy1#?h{q7i>R5qV)xYYVE@@lBo|(xMq*XcqN? zr|<3`9pj_UpW0-pP*p{iQ}Whmu-Q)M{3QsXK}ZS!~lm2Fq+e8%#!Zs}Pm?QMUogrkq!9Y#jTtwht20?*f3raquyw;s-ND3+{euA<*huQ;gWgGZ|~eilE$#^D*3 zwZM42OtWF`Z$1E)luRhDoARtKi`*P zu^4bO)A>$is~+GeqtM@#C!me;Wg{=_od7CsA~`P%f~w;{KzX$3((d_R(~>v)Sd7?@ z#^uM(cWa4{Il|yil*=}XRuJerwboDUa8I+h`6EB!cawCr`6G2p)49@%1EifB12vMJU&>X z7C?ufnIni`sb=gz%Coq2TA#J!Yq+%`Wm<7vXyf{OJcfH_@W#@O4Eb{Y==&#c!>!1o z9*)Mz9%zj3-JS6eBs%aqa$*E&f*uwYc9LQ(AgQ>63<6X`N}Z5>&-6-!OU=I?e}Px} zM-}&J8;Z-OY2vml);KNJ7XNkdH*zh3DrMB)Bxe(?NP~{ihy`N%*oPQc!b>~SoFunz z=+)GxByWSQa^O(gLnx-=Le`pcoHyy5u8(epdrG;ZRhbp8kNfem$@`LTlAPf9<-ar= z;kAeGHtCZir_I0h6zo;eW1B$7?toM-h~)}TL~;g2nY;h3`tn#&O>h1yCT8#4S#ue% z2ZJ8^RNdvVYAaQl^OpL_4}mAs%B^Q^oRq|z!$}2UQ4hvjt;zw~9tAviLiE>e7Z$;T z_U^bniJYP|9r{4t(00r~pz1Zy8S#_6jzICDm`IeL^xLf-JvyZY2PiX!9QTDgyOOn`1 zQJ%tfHvzK$f9cHsr<`e9K9QFW3R8NU-G!mNG57Pn92+!Gj5>m~4qoUmGO*zOwPPjJ zUKb@hA+o=}){QbQd@c1xQk4zsd;<*B4BQ|ZSrmPo`p!WR{xIK~?I%wiR@F&W!`u0} z9HwB;=%r(Q8t(SI%&6;k83G0r(^o=!jL&V)aLgA(quZm5R5;4kR#MXRP$D?XQ*=i2 zXY>)MU8|N>9ls_8+XEjR7u#vr#BD;66zma_-OUZxm2E=ta#$rohPJ8SXt@A$STl&s zN2%lU4fq;r;toh1?6@Xf5sqMnQRUss93*xPDd}w2EZc*7BjL@XHBok>HdG|}@j$WO z=6b1CwqX1BabA$Pvf2O3Ms|NFJusm1yWuw+6ps|_b)_Tf!X#LqOYc)rA%t>?VPJ#0 z+1gPp`TW0Xpb<_3ks6@psKO`|eO3|Y{XM>IWBm-=v)#$;?%0q|8id>9=H`ZwIxQcY z=EH2pytvF%3Xd`iFDvw$Yejcf-U~zcIkP?(7?_gLI!l=cN1>)BBzS)c3no$(maG}o zf6U%pNTDo7&Qstjx~Srq-;+%-iWyI0?jj9&H1>Nbf`^=8fVniHmhK-*7?G2erC@Aq z+#Vo8uLz7m{E@ek*2F^BNJu(I7P8w#m$GmZ*M2Hzk&qN9nM1yhwhi}SzU85>Y=Dst zhtPNFY#nG6UH6L#Seh-k|KnWDq{4$1tI zgOGSXK%*_?;8}Qd$6HWmC+)|d1Wbn_d8o~aSGQV-HvvN^-QP2rN7OnRyrPO`afLUZ zehNH%6#!n{&?w)IMFv>|cplYZ?$s@p*#Y5G(M&1NEB$$FFJa-h5iJDz`X3N(F+os2 z18>p?P1CwMa#q9cn*{meJ1mZNIH4;A4&Ol>E3;?U|Djf8bR8wqy>y(!j$HU4)T{RQ zXWJiPp~I&~qLR8u7tI7xqZTe$D)1hc8#kT|N>9rs>)>Pt)1`llmjnR?0jJQ?R1WKp zD~%3~0yUxEKQ_amV87?#h+Wrrh8~XS9I=tVcRV9wHKJCx@lU{y)Sbqf)m@kxz|S`G z>jj;!wU(8Zl?{)NSK2TEbHOO3mfpA3Jm8-B3OZ!u#8z7yRK~5)kdV?_FF~mo;%{7U zJr5gYUh)|h!*36r8ZPJMz^d<_Y{cVCk%2Pf#sjP1^@a`CTMeME?Ay`D1`-kyDjmz9 zrnzW!uoUe0{8R6NcvNm5Vp#Yc4^ep(4QwO!rhf`I*FSZoI?eYZX6#UFYiMOlSJTa&iOe4-@o}-h=b8LOc!u!8+Ay%xV-+b*NM)n zf>eqjnWD0#KeDgRDR$cBi!8uHn<>)QM!qzDS z><%w1KJMF^fu1Ht%{UZ)VXja=eN0atsLG*^YdeI3k%()q6rF7%+D|;}g9?K78{Y|Q za@rYeiB!>Y?JxNes{5_@dBP?4vYkn4_%kq3#sw8c%qACqz5)h zA;yW5p&5`|#qM*-!5Pu0oLg2DkxyY}5g3Zls+4W_;VmIxLT#-PUrI`<1slhCcnJ@J zajPcM-kzjB6f6Gj1jWaUh!gv<$Ar4p%e(V+mFabUeLP)~9}eF+FST(~ z0isq53JTz74A^?uEk;R&ggSIkW+zfvgYHfixPcd)TDT1#K<=s5-Utbj7GhUMH)tAY zMT|D8&r5kHDI_(K2p@~j`OA*Vtx{mspH^vBGpP>}6cd$bbUEDkF4owk=23zsAKYkF zv_zAT)$5h%{fQ5?VG5C-L7QV~OInCOPewBytfmCrvyUv#n&mmI*K&i{SHClarP$th z0uSMVL|Z$$eL1Oj3GsBeCr15McmsJ0VhD-OJl$~5>Y_!0{5iB{JrDM=yI<-Y(4C3l z&5PpG*by%6aEMI3HLq5{5#?osqlxve$5$B%_l)>x8`2)-291J{Cvre)bvv`U@V3&b zzwNKB*WKB3h_D@rr##tDnX}JrO!)Ez_`-la6^s8_0mV^2>FL+1ssoxeiuP$jr8U!y zD{uF6I+VhirQG9KyPtO`L{|zq75sdf;U{}OR-5Tp;4LNNuMhZiqOF2>yr^06i;BYSSpLC(8o-W;U z!?gsT>MSApn>-^?uBmND!99BCe@f9;$Z+tJnMrB?sT^L*3wK@$c{BVn00h&V)1r@} z*ZrJQ72PSb>s$ZHUmHo@8YZ9$R{xMO>NhE)qN18X!~{PgM1RlOP$j`#s;s*}-n4zR z%I1Cm5u)Wro!MPoU6Po2&7A)8+Z#0hZ;%!?|HDHo6&wj}WnIr^XZGIMlEF z{Qkwo#S^p{H0laXTh~s{-57cRh0KuWYq%8)(+0K7GZUp`n`7X2bF$78GAnvNwXKU( z<<7Eo}Pc6u=e)2Pyp}2&e6tk92jGLYm9-Udl5p~ zRky81tWF6$5eOaF~kqPvpvP#T3+8JC&W#Auy*Fd_`!uQYYu=DD|l7iy>L@x z+v{Vz8gAt5EV<<8ACp~RWM&j&G zVI%RDwfpF2dnHUhQMT?Xx$9Xk3u<(K-UtJ25w$%*k{<@GkUy(0LPD9&!oA)$_8FHe z@f+p#x$&*k92|+f&cHs@KNu&S+l&bU&BR8J3=h{F{hD?@7{`K!@Q)PY5)x_eOi(&J zxfziqTd3kw1e*8#{ z1RNb%fCwDs23(iwuf6c(=B4N21^yg(@1VYE{qSpvkX)!jB5+>Jo`K&VBNah5V`9qtuSv&sVkpI0LD#3wpNO zD|hp?xhKE9@PZhhAp8`d?cq^3H7P6@yC~Ccd}e+;1G5A%12!@7SV677 zCepu6W(L9*z?YPt6T&9g*0BqtF0vs(Ax1NmZn7=AqDDXNor3Xd(3k((?ayi_m>jr$ zhySU}R)%iOdr4zE?Q`o3{`*2Ur>;gwODrfIkevvmPyVyA?7g-$V zunZM=_}3R3CW6#G;UA0P?LHTd4GPnMhZ5Qvz}FmKRb`j(_%QeTQLnf)Ot3zbGZcNM zK8JnIkkd{mNmfCHGp;^A3@19CS#v4z!d=QzQ|N{zO{01AnCnNuG{b<X|hsS%0fz?H1P)`2lW-{9$NFI@=ex z*XelNMuFs~5X*Af&LbvJDdlL%M1upQHAV{q@X};0B^6; z5a~q1RZ7Q7U?*fX3V+e4LQL)9!Gj$9PV_yGVO%$@29r0RW%_wVX(=)g6w;$u2oVkr zBn59eOgd_gid1OkPq~wcr3J|Xh3`mv^HTHm%^-+TASr1$IYcT4Ay!jAiY#v|L(tlw z&Q4(psc5r}4qwRnp~A!PWmPIXHb7|0ms>B8Pfh9EQzv$g#E`~~%zS_sC_y3^m#I|S zu)6(!3|vNG>3DG&K&a3v-O*7y*L&eCGv@30`n1t()^hLMunE{cXt8pZaSQKeQjJJh zs&%|QMXx$HafdpwZ|66#-#StO! z<4$2HI#Ej{>OeYvDKu*5>fA46_ys59l0I+EQBtuqQ>V~J0uF56YEP{4+&_5|lu&v% z^sj_^>M%`ly%%LFam<=Jm!a;Ll5N|Qr6B3XIB`W{#V9p2>Ih`UN9Q21FhVxM7eF6Q zs?=Fm@b%^{39?8-7@>;aFMZrH`T*`I`UiC4uIB7u$S$zy&iRPn#bRW{g+gnlacuV& z2WGR9HUN|>x3#|9VRxluejFKK_j>-xx^s{HE&$q&EO_1C;IVs)yT=F}B2ZEXO}MvF z_H3jd88O4e%7WvsV#2~Uy8>VUsvw4D9jAOs91EQy-# zbP0%-2$zUR!OM%U!6aMA*UMT`65iF<5hqcLq10G4$;iekE;3iPu=Y6z^71>dxupfN z8?+}77K)WfmIIA+b#12LW8>mPbA)^yU0uInc2x8Te_l;8f4zVN3_xx-LIdL1A?}wJ zu8S^goSrQQb0*58qPc_cKJ`!2rv(9_qzu_wG| zlW4;Z@i854Hb@Kskeh-EFjH{f{s{Zl5!($5jH%~zNP?jQ7Qq+hXx*;EdVW zwB>bFjIM!QTK2L128D-*_idn2;*q3{ee&@a5le^FN29iFk)nY|6AR6~T4BMpeULgU zPAe1~B-|Q9>@s>y61ep%oa}z>Cm~yA1-~MDy`_-}{rz?D)*)I7xM7<=(~bHMUCPk1 ziu~9yFs9xrgnDyFc|S`WVIRvC^VXwJ+?L;1Qg-kv1oM87?!D#Wl-`!&DVZtvq`U^x zi6UY1UeAW^KR?oLv|pQsMA3wiVpg09$Zkqz)TuQqDJwgx4{wc25E#BUIgS zHZl1%CPhjj;NfWf_3PJmLR@26bJCh63?OzpaYBcz%8e&{5Voi<%=F)vaZ<)+Wop`-Ol!~ZgdimLSGJWEdqDe?!ntEC*59~}_DeWJeFM7%KlC!EU4a%V2x+e>Y8y$*66)}*QG$PTtU7`uARe&w1o9A#}Qt3@E7`XJ|ny6aq+s+(g;Oe^p<&p4c$2+h5fGic9KK+x! zVs+kFl(6!|qm;P#=Krc2k7kx1-a{rV9hVRr>(49YubO(fZSQ}*i&iHito~0S3gRfYCEwc`L7wlh65iW)MLapM#l+S zJo5_p;A!ZS$erbxO#m&wf#I>wR#}JeZ`u1ZAjvHQYSq&x)Oq5t`TdRatrXy2yC%Wh zu9;(F*)dfhM_POVWG$(3s-E1tT{?|v!eVtKH+;vv^uRpPr zDL6DVBg97Rb!*uMs9)w7)xB=!wD1`#p0>yEb9SNspF*FR8F`~%yOL{M8jamJauaeq zN5nh1V$YkI!@o&AoTb5BaK}_ub0|fT#f+$8eR9e{M|IXQ)rg;&WQZ}-7AC$L1KO} z+EelIE%!*xWy3U^4aZZ;Y0i8Ey}m+v4#xf_(KEs$bGWIlp;FM%$)cj5^p1@1$n!!P z10ci?FJ>&{tS=|f{>SD2p0b*>sV~=WR*lsSgA^6Q|FGhMxl@R)Ep}WEkd-y*4MEHN z<*(r2``Pjxq=6>h73S|RwA{)o3`E4-HZ`)6l9EJsI*up~m>tKRe-$P~EA3x1o0FI* zuB!SG(tQC*QTQTDH^IL>8ILJdw5dx1T*Q@}3l70l>*XB6lEt zOv*Az#4;|$3UMX+>z=ff>bM`7urq`+yu7?t7t`DBT``dl?1wy5u@G%_Yob83qT-L>;1BrtvJjadBs4#s z-fY2jzFhHdB6O`dbSkK;&oZiD#_F5z=OjnZCj7JOeR2tW?#vM)5)vyT;k);{LV-qL zC;x~Sl*#Dw&qKbj))JBrijW4Cl1dzp`U~{ghli>KMAYirtsL#=yH|$2VhaU77j|hj zu&RO#5TA%N#0mZH@fq0e-o+=Qz(Q6FQfhE{#Me!VK=f-6YeOao4N;ZuMXDeI;UGxwf>Jfodv8iF(xvy_ zo2Y<*)Py^H?|1L|-L>xhBUxu9b7s!$v*(%T*|TS~D;w(s7t3o8fm4)(F_=8&)iZeh zP}D&KjTZ+jeeX87C|h3wNOQLBhmBrMMMZ@ZuTNBra4#6-hd4HJ{k>ieKabnNUi=Kf~+jZ(6*i5)bx z@{V47J+M&E=c&wzPS#JR(|6HV8DyP%)sBuTppomyv~u!PLqsfa8OZT~Ft zu-nZ*;Q~C7RDbp`Kuo&AuH+c&k8$D_l9OX<$5k?yj}yjd1L zoF((h>Zf+Sp*)7}jm#?|7p01k;slBuy}Je~@cK>6dvYH*rzR^qyTwH0^PfL2#Jqsk z_~QD@z|_<93El1Iu!J8whgoWt(XUjXx~l#W2%4}YZ-)>BiJ5#O~;v>EDyx`EZ=5)-TZKgO8J)#(Eu;rwjWo*Ba%3Ri1QLf zjr37Hsbz#9M&`4F2|U11VaoI+MAWg95WTUQyf_dRPifDN=72sM*AYSH65sL!if_HZ ze3JIjDP(*5fac=^=2^ER;nQUJN!DRkwy^)6*X8H8!xL8771n!X`-g|qAKFtEdx2}M zohh@Nb>qh`Lw=0Hj{Sl;>w|a=0zp}Vs8kYqwwsYiS&){d7{eZf*#u3$WqC6gA0AE} z_T^M|W7X@=ce*_ONs>@SZO*%0R6g6WU9_zq{IL5C=Dh;anaP?uIM{{HLg#&4_cKbj zh~|yGg`s(^Ji@N*weq<6ox?c?l-o$Epzd;DCj4XT8YHY|tf>sEhq3cS^O=S|=!=+w zg)fQcI^$oSM%SNe-IFI$$@=hn&t2=u6G8FIEMcu#Q=4PA%-ojr(arY$;AE1^_;hMv ziLb>#C-9Lr%{y#?{6qDo)r^v^)%(Y;zb5&29ge?DDZqtQ;0Q+byHfs|B!S$D~ zRdBndkI62;MJ$3q!3}TSgq9$F)>K7H=;1F$k9EvPh~el3knKCUqX;N zX{LYOu=R3oZY~1CK5kda`J&mTt5L8uFrTMsq5^`u`dyn!w5b5mVM*H{l z^hn2s?5d(C_pa)bB=S9JUZMK&^QR)%Wpi|N^mfOmk#nTbI3iU!VnOPlR)lT$Wmto@ zzk%H|c=CEsx|}JQETU6`th@6Op_iP=LysUDD3mg~@`CbNef)?>{;7vH6mhHllv~_~Dk?k1QRhjA%=3 zS24-Bh$Oj?K(7)y!58<~bYmp{q}9gGzs~()8EhbEU}#7$V}JbjS6p0N!}C=Sx9vYx zW##4F>z^WTuUl3VVxk)4%-sX@FHtVEG2XjUY1-P>=12O}kqU?JrMwzKo`xj#-EzAL zzICiuv{PN8$9YE*C>B)YD49-&cDkizKd%l<7MWfI?PxuI94e9A^8DoU1!(TTOBhmw zYj3xNeJ(G*sF!>3R_qK9USJ4EJ%Ia2h+*j4Cu5v5S=*c+I2HbxicTuQ1|G8+JrW57 zZ*pmMH5Kgh0Bh}Dt61lkhLhPntV+@gQ)Lf7jzMCm~s?rPZp1kc|!N)1j zESH`JdEB9- zqPqH0$m0Nk40~D{)(2eO`3|f`(qQ6$+qG-POeOv0!auh)Y(0T12`{VIotjE}w~o;TiA zJOxV%r$HAsSw#sXcWAvcDl7GWiPC~geh~{vO&?AqmlP+N9860Rl^RLRiS%jLYDa*- zm#!^ANFPoo1}6xVl_r;lK=rJCtk4}=#c+9QZ*ZUTKV))ex7~k4>(4pV3Sb0G5Rj&^ zaUnSFr-@Z-;r$dd3yT$o*GI)CZH1_0-1a8)W!g^HD=-ar>qs&&O!)eB-`-UP50C01 z_??!%KBK^;5Qn6$Wg^+|MU=Rtq;*^~@Mf!D3P~WA-hC}%xufhsMwU~>c@%ZBCX%%+`Cp)E`XKH5(urJff@@TM zjRHftb->wIx^Dhnt6wx|Z!-26mb#v;o+j*!K?K1?-|5<^#ANdHP<@`PA<)<>C4OC= z==0^}u_NYcOO|R+m10UjDil|#?d5es<@F-kdvE;Tz)HPh!1=5LXxGoN57e= z%qFaWYjMGc5kA%Tq+J^qFAQp1&VXR`LQ#xKFhSUDX3#LFO6STDFPx2Ru!}g^dLk72 zlg>M4n{WCx?|mM6YV-l+ZHe`{okNq#$T1Bu)Fy;)M*t>zjq*tc6;TV(^d?tb})Ab0)-%pJKcl zL+fFbu3{^WbEPMb4caI!ZfCjV)W`8;r(|pK!N7TQ9VwN8*o=aLa58TPl)z6jYPrn8 zsBPZBD=O`XqLv8?3JN-MzXt2m1tqyl=NwoAC>VvH&n=@tLrvP60_S214!wNZ8J^ja zR2bxYIy&CS$;sL3;N^x2D0{}O8t2Jy2wGSb;o{;lKjR@q1Oee5YStFsXkGqii6rm= zrzAmu2n;vrj4&uq@4E4mCsfed=BBc`I+c-!pwmfTpLFteVQwx(OG_67y_(VrY7U@D zt*K#!`o_mqqo61T?N*%iDM{4LK_v*lI~yAtIYgV4EVLt;*L<0eptqtTcq_Jsn%6rfqVaS4 z$9~w%FHvvFf9xL@15W=`PuV9<(5}+ZtaRKBJmdvRQa>eEI9ssIQC>ZUigfSLQ;WMK zbE=e{BPSOf<;JvBMJWFwlPubPh;RGwj~#hdWo0ax_q|x5$EsfyDtQ`}_+0@7v^BJ^`_KUpj;9bL*ZBY8bd0nx zxkj4Q20tFNy%Ak2H56U+>W-1cEB;dc-tLI`>lMb>?7vpGleR5H4sev3`4AzZiV{Mro4r5-u=5i@ptIVezJm zIJ?C+Ad4*?w%?3YGHk{iZKqe4;!nYQ&|D1H}`y$P5wZqX9&xr*%3-& zLB8wX0c?{(T=$XO%Wm1x0^Dx;9s-GxQ^jUv|K00N!)Z~^{mf7{w6?K%Dw(KzqbcIk zt=t^1n;9Ml&UZK>B?)R)xmbJ}&ge)Dm9)NV>5OMuhA<~X4`J7>{!1WbEtpR76AIRX z_e(t<490TxCkk6qYpY|k%R&Z@tc`);y820@!bgSg%6Oh?A2E$1J?#`Cb^yZsNJvQN zo0zUPQo&Yw-VBD5zFrvT`l%hQPbT-FMLv!&t{zd5bdc>BO!z(Ty|c)>-;sf) zw>~|9)T#j&%nTts9>iFEB(k=*Z>!rVEIbxGUCsJnli1yg19j-@>5*1XQzv%w+~d!v ztz{dnFDm@~x3hr(AAy_Vt@gUf%*^a2!BOY$PimyTh@&0_EEWd~9d(pRr{xo86&8+) zOG!1`RW2^S@YtZHgx5)U7}ZI+YMsX3J$L$HY+O?Kd&-~v?%v|O1L^>zjSy+B&U0gd zFx&0dsA!aa!3NRZXkw2bbFF4;Ci8ky>4DOwx1{hZJ$>JY{&JLGrGSPFwD1pEsmbg` zE`#{p1CIk091J)+b~pNJJ{u%r^)@jfpmDbsi4#!DHnQhrfxiK0^v>$*ey#=GcR8S{V3#(GWsB?>09 zaacxCtE;Pz6`PSk4bR27E>ory7i*2MOT%g#A-B-ghiZRixX$|WbGSDUDHl5VYotin zq%E8c8PMF`+Z)ik>f2}%Sz%&Pv;zr6={d_l^QgO}jU8cs?42upsqo4BFxsB6V=np1=oxz|G1>Ku(P3<1W%c3Xkb$t6Z)F zh4UbU00&fF`@eU5&HV2jpdsHDQ!T*@aUpe%%W7}s z|8c7|a$wCI`)|2yVJ1XTe?g-OEvfI*&JX1(QfCC~jZR6%E&4njn4R1YPz>F(_Ij-m zwrRKlXUeGCK;ql2YdAtdmtoR2$E>U@2-@A-Qc}c#!veFD3M-nWHkk~u# z!}-i~gpV_PvB8nGv$KSL!*cEH7u5enVLNrL8NJ(I0Omg|M096KfZ>1A zT$o{8TkijW=e3Hr%%FlBVkIbVm-k+)#JssFf7uLPeOJYt5nrszYjPFalX}8h=+=Hi zM-HDB0+dc>=W~IITj9m#LR0V|FYGuEcyt;K-#vsX)2W5*)1CO`gL377TV)Fg>|lXitDuIIp#+t$A~{;vfKm5WOaCih|}>}E+qnoXYD8QpDf>i4nB^uNNfhCV1k0MOHB4BQ+(n7q;-}S!#vW>R z-5YJ9q;B+ZI{{0zhm4~|7YCP|h!O>8cph|lC2xF<`5~qtEJ-Nd4B+LV-Qc|NMu~|2 zt^0RrqPQ0myn|tA-~6DhVVZE0b9QZLBNvI21M^yE?%h$Nfd1ao;8(phxW3mvS^qM1 zpb%~J8qb+=?!k;wM?`Yq%&6y{Klo<0ztJ;8UoKNqz?)k9ft;egk7UnyZ>jEvbN2yp zG+l$r!K~!kw%Am}=DaA+mPIhPxB3UNL$E^@41@E>4@qb#oN2YgK{SKwDu&aQBZR~i zO+cM)w<9I(X9Q|Sr>E6{$B24Al0K`Jg_0ET(fN&tp3h*`i-`Rlooj0qR5Vk}BLnx^ z?;IYKl$69MK?1eS*1M*bB5W5gUi9IPRHIAx!3zp97jJL={(WgC1Pj=#`@14ylh)bQ zoi~eL0=Ikb$S2b_&5KmnjyDl|8x@k#I#S-o2`{@#<=1It_4jh1ahjFWb#-<1EuXHF zeLtw*9;t>PYygEtb8LU@F`ey94J@7OahFa}GBOg>i>5^?3XpWSC$MMNJHySdr=!H#R!@Z@~ZaK-h6#}^i zZADjKcX+yV<7DYKd5y;k_G$eTB@P{u3tKd;CBB+pTJ61_qDrgy=ROMp^&bKFIY0k} z=)Pd;cICLO=c7kVKKkxM-|VorImV8|!oqT7lULD)&^}yTV!;tUN<~ebv0G}q=8h@t z_`_N6@P>y!;uM}XyxnS_i6j1zrTb#-=%9IX}RF&QA~YC|XVHwe(%QJ`!iB&sT>T@8n%!PEq8wR6)g z4uP|5ULM|4Q=_dLSa$4sw`q2KGCO?Z#aC^!%}=j6U_Cu3L7Lw5Q@DQm4N2H zOi8XJ?nXelF!$+yP6D~zWCwd$|A1jpIhhaC z`U%WpUxR=iUh-l-YH?3aVr@$o7k#Sb?Kb&K3M=kK)BP=e40D1Af`KnYl+8~h zBP%NbK;yow?{#M)sQrLmk@TPY=lcJjlhqiF!Oda$n*1}kW=EOY)$ZwmSZCaQ9=F<= zYl}2s|DBn$vly^vbU4YG7lX+>`MyE^CHGpRkunBn5(>uWTP-aeU6vA_*;ZWI@kdWF za{T19vVr5_=aaKJk@B}vxS++(_b7aiESN-sM^2bZhnZQuYSPozj5k15T@MZoB2mOp z)5yjid0Po~0ddcH`EV6C3LNOuUEXv!JsmKg*gcPgj<_}@itL_av1Xx*R7(SLaz5=m zDLlSrS`f>6?#pX96?2wYOvR^@*z-pl)NkeC+W0Gdw%jYpYir0Wz+Y1ba z{%+0|CeYn0ql;sLO`K>yeEH}-d^8TSNfz3pxIv_jPmBPiv?^St^nc(9U%5m3Hl@Af z+R0vlG=OkN_;lm<%T?u z$t$HRcW$1w$~CCULIz!%U5TVzK+1(ndjt8f#B Date: Wed, 4 Oct 2017 11:59:44 -0400 Subject: [PATCH 137/141] Fixes Carpsie nullrod from being invisible (#31268) --- code/game/objects/items/holy_weapons.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 1badef90cf..634fbee9d2 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -335,8 +335,8 @@ /obj/item/nullrod/carp name = "carp-sie plushie" desc = "An adorable stuffed toy that resembles the god of all carp. The teeth look pretty sharp. Activate it to receive the blessing of Carp-Sie." - icon = 'icons/obj/toy.dmi' - icon_state = "carpplushie" + icon = 'icons/obj/plushes.dmi' + icon_state = "carpplush" item_state = "carp_plushie" lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi' From cbf7ff0fc7a2da2eb3f26834bf61e0b0483ef364 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 4 Oct 2017 12:03:32 -0400 Subject: [PATCH 139/141] Dummies used for preference setup always compile overlays (#31267) --- code/modules/mob/dead/new_player/preferences_setup.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index cc98fd827e..831fde141e 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -59,6 +59,7 @@ if(previewJob && !nude) mannequin.job = previewJob.title previewJob.equip(mannequin, TRUE) + mannequin.compile_overlays() CHECK_TICK preview_icon = icon('icons/effects/effects.dmi', "nothing") preview_icon.Scale(48+32, 16+32) From 67bf519df526720c011ee77cf58d415ed61c8068 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 4 Oct 2017 11:28:16 -0500 Subject: [PATCH 141/141] Automatic changelog generation for PR #3115 [ci skip] --- html/changelogs/AutoChangeLog-pr-3115.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3115.yml diff --git a/html/changelogs/AutoChangeLog-pr-3115.yml b/html/changelogs/AutoChangeLog-pr-3115.yml new file mode 100644 index 0000000000..c3a194f971 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3115.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - bugfix: "Gutlunches will now once again look for gibs to eat."

Abductors