From 1dccef300f333c13f438617751dacc3ba4d3725d Mon Sep 17 00:00:00 2001 From: Kyep Date: Fri, 26 Apr 2019 02:33:20 -0700 Subject: [PATCH 01/45] Adds message if someone tries to join with no available slots. --- code/modules/mob/new_player/new_player.dm | 40 +++++++++++++---------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index a46b9a94fc7..559393ef307 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -464,8 +464,7 @@ dat += " [a.title].
" - dat += "Choose from the following open positions:

" - + var/num_jobs_available = 0 var/list/activePlayers = list() var/list/categorizedJobs = list( "Command" = list(jobs = list(), titles = command_positions, color = "#aac1ee"), @@ -480,6 +479,7 @@ ) for(var/datum/job/job in SSjobs.occupations) if(job && IsJobAvailable(job.title) && !job.barred_by_disability(client)) + num_jobs_available++ activePlayers[job] = 0 var/categorized = 0 // Only players with the job assigned and AFK for less than 10 minutes count as active @@ -502,23 +502,27 @@ if(!categorized) categorizedJobs["Miscellaneous"]["jobs"] += job - dat += "
" - for(var/jobcat in categorizedJobs) - if(categorizedJobs[jobcat]["colBreak"]) - dat += "" - if(length(categorizedJobs[jobcat]["jobs"]) < 1) - continue - var/color = categorizedJobs[jobcat]["color"] - dat += "
" - dat += "[jobcat]" - for(var/datum/job/job in categorizedJobs[jobcat]["jobs"]) - if(job in SSjobs.prioritized_jobs) - dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" - else - dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" - dat += "

" + if(num_jobs_available) + dat += "Choose from the following open positions:

" + dat += "
" + for(var/jobcat in categorizedJobs) + if(categorizedJobs[jobcat]["colBreak"]) + dat += "" + if(length(categorizedJobs[jobcat]["jobs"]) < 1) + continue + var/color = categorizedJobs[jobcat]["color"] + dat += "
" + dat += "[jobcat]" + for(var/datum/job/job in categorizedJobs[jobcat]["jobs"]) + if(job in SSjobs.prioritized_jobs) + dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" + else + dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]])
" + dat += "

" - dat += "
" + dat += "
" + else + dat += "

Unfortunately, there are no job slots free currently.
Wait a few minutes, then try again.
Or, try observing the round.
" // Removing the old window method but leaving it here for reference // src << browse(dat, "window=latechoices;size=300x640;can_close=1") // Added the new browser window method From 6351c3fba1640a18a2e96064ce80fac4e8c3d0db Mon Sep 17 00:00:00 2001 From: Kyep Date: Mon, 29 Apr 2019 01:18:41 -0700 Subject: [PATCH 02/45] Makes active internals visible on inventory examine --- code/modules/mob/living/carbon/human/human.dm | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index bd5817e8867..a5df3916210 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -414,8 +414,22 @@ if(has_breathable_mask && istype(belt, /obj/item/tank)) dat += " [internal ? "Disable Internals" : "Set Internals"]" dat += "" - dat += " ↳Pockets:[(l_store && !(l_store.flags&ABSTRACT)) ? "Left (Full)" : "Left (Empty)"]" - dat += " [(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "Right (Empty)"]" + // Pockets + dat += " ↳Pockets:" + if(l_store && internal && l_store == internal) + dat += "[l_store]" + else if(l_store && !(l_store.flags&ABSTRACT)) + dat += "Left (Full)" + else + dat += "Left (Empty)" + dat += " " + if(r_store && internal && r_store == internal) + dat += "[r_store]" + else if(r_store && !(r_store.flags&ABSTRACT)) + dat += "Right (Full)" + else + dat += "Right (Empty)" + dat += "" dat += " ↳ID:[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Empty"]" dat += " ↳PDA:[(wear_pda && !(wear_pda.flags&ABSTRACT)) ? wear_pda : "Empty"]" From 726e0af91a2e302cbf8f6c71d04a228a6ab86fe5 Mon Sep 17 00:00:00 2001 From: Twinmold93 Date: Mon, 29 Apr 2019 23:43:32 -0500 Subject: [PATCH 03/45] rebase --- code/modules/mob/mob.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 482bf85491d..14004fa4a5b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1001,6 +1001,8 @@ var/list/slot_equipment_priority = list( \ /mob/proc/show_stat_station_time() stat(null, "Round Time: [worldtime2text()]") stat(null, "Station Time: [station_time_timestamp()]") + if(client.holder && (client.holder.rights & R_ADMIN)) + stat(null, "Server Time: [time_stamp()]") // this function displays the shuttles ETA in the status panel if the shuttle has been called /mob/proc/show_stat_emergency_shuttle_eta() From 66baa9e41b2e5435371e4fde45a3d35f10486b74 Mon Sep 17 00:00:00 2001 From: KasparoVy <12377767+KasparoVy@users.noreply.github.com> Date: Tue, 30 Apr 2019 01:00:24 -0400 Subject: [PATCH 04/45] Adds Eyewear Adjustment: Wearing Over/Under Masks Adds a verb that'll let you adjust eyewear to be worn above or below a mask. Purely cosmetic. --- code/__DEFINES/misc.dm | 57 ++++++++++--------- code/modules/clothing/clothing.dm | 23 ++++++++ .../mob/living/carbon/human/update_icons.dm | 8 ++- 3 files changed, 59 insertions(+), 29 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index dff9426c641..94e4ee780cf 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -208,33 +208,34 @@ #define MFOAM_IRON 2 //Human Overlays Indexes///////// -#define BODY_LAYER 37 -#define MUTANTRACE_LAYER 36 -#define TAIL_UNDERLIMBS_LAYER 35 //Tail split-rendering. -#define LIMBS_LAYER 34 -#define INTORGAN_LAYER 33 -#define MARKINGS_LAYER 32 -#define UNDERWEAR_LAYER 31 -#define MUTATIONS_LAYER 30 -#define H_DAMAGE_LAYER 29 -#define UNIFORM_LAYER 28 -#define ID_LAYER 27 -#define SHOES_LAYER 26 -#define GLOVES_LAYER 25 -#define EARS_LAYER 24 -#define SUIT_LAYER 23 -#define BELT_LAYER 22 //Possible make this an overlay of somethign required to wear a belt? -#define SUIT_STORE_LAYER 21 -#define BACK_LAYER 20 -#define HEAD_ACCESSORY_LAYER 19 -#define FHAIR_LAYER 18 -#define GLASSES_LAYER 17 -#define HAIR_LAYER 16 //TODO: make part of head layer? -#define HEAD_ACC_OVER_LAYER 15 //Select-layer rendering. -#define FHAIR_OVER_LAYER 14 //Select-layer rendering. -#define GLASSES_OVER_LAYER 13 //Select-layer rendering. -#define TAIL_LAYER 12 //bs12 specific. this hack is probably gonna come back to haunt me -#define FACEMASK_LAYER 11 +#define BODY_LAYER 38 +#define MUTANTRACE_LAYER 37 +#define TAIL_UNDERLIMBS_LAYER 36 //Tail split-rendering. +#define LIMBS_LAYER 35 +#define INTORGAN_LAYER 34 +#define MARKINGS_LAYER 33 +#define UNDERWEAR_LAYER 32 +#define MUTATIONS_LAYER 31 +#define H_DAMAGE_LAYER 30 +#define UNIFORM_LAYER 29 +#define ID_LAYER 28 +#define SHOES_LAYER 27 +#define GLOVES_LAYER 26 +#define EARS_LAYER 25 +#define SUIT_LAYER 24 +#define BELT_LAYER 23 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 22 +#define BACK_LAYER 21 +#define HEAD_ACCESSORY_LAYER 20 +#define FHAIR_LAYER 19 +#define GLASSES_LAYER 18 +#define HAIR_LAYER 17 //TODO: make part of head layer? +#define HEAD_ACC_OVER_LAYER 16 //Select-layer rendering. +#define FHAIR_OVER_LAYER 15 //Select-layer rendering. +#define GLASSES_OVER_LAYER 14 //Select-layer rendering. +#define TAIL_LAYER 13 //bs12 specific. this hack is probably gonna come back to haunt me +#define FACEMASK_LAYER 12 +#define OVER_MASK_LAYER 11 //Select-layer rendering. #define HEAD_LAYER 10 #define COLLAR_LAYER 9 #define HANDCUFF_LAYER 8 @@ -245,7 +246,7 @@ #define FIRE_LAYER 3 //If you're on fire #define MISC_LAYER 2 #define FROZEN_LAYER 1 -#define TOTAL_LAYERS 37 +#define TOTAL_LAYERS 38 ///Access Region Codes/// #define REGION_ALL 0 diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 9613ce173af..b73c22800e7 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -159,6 +159,7 @@ var/list/color_view = null//overrides client.color while worn var/prescription = 0 var/prescription_upgradable = 0 + var/over_mask = FALSE //Whether or not the eyewear is rendered above the mask. Purely cosmetic. strip_delay = 20 // but seperated to allow items to protect but not impair vision, like space helmets put_on_delay = 25 burn_state = FIRE_PROOF @@ -173,6 +174,28 @@ SEE_PIXELS// if an object is located on an unlit area, but some of its pixels ar BLIND // can't see anything */ +/obj/item/clothing/glasses/verb/adjust_eyewear() //Adjust eyewear to be worn above or below the mask. + set name = "Adjust Eyewear" + set category = "Object" + set desc = "Adjust your eyewear to be worn over or under a mask." + set src in usr + + var/mob/living/carbon/human/user = usr + if(!istype(user)) + return + if(user.incapacitated()) //Dead spessmen adjust no glasses. Resting/buckled ones do, though + return + + var/action_fluff = "You adjust \the [src]" + if(user.glasses == src) + if(!user.canUnEquip(src)) + to_chat(usr, "[src] is stuck to you!") + return + if(attack_hand(user)) //Remove the glasses for this action. Prevents logic-defying instances where glasses phase through your mask as it ascends/descends to another plane of existence. + action_fluff = "You remove \the [src] and adjust it" + + over_mask = !over_mask + to_chat(user, "[action_fluff] to be worn [over_mask ? "over" : "under"] a mask.") //Gloves /obj/item/clothing/gloves diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e55eee62dbc..6e540c4cf5a 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -659,6 +659,7 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_inv_glasses(var/update_icons=1) remove_overlay(GLASSES_LAYER) remove_overlay(GLASSES_OVER_LAYER) + remove_overlay(OVER_MASK_LAYER) if(client && hud_used) var/obj/screen/inventory/inv = hud_used.inv_slots[slot_glasses] @@ -681,7 +682,12 @@ var/global/list/damage_icon_parts = list() new_glasses = mutable_appearance('icons/mob/eyes.dmi', "[glasses.icon_state]", layer = -GLASSES_LAYER) var/datum/sprite_accessory/hair/hair_style = GLOB.hair_styles_full_list[head_organ.h_style] - if(hair_style && hair_style.glasses_over) //Select which layer to use based on the properties of the hair style. Hair styles with hair that don't overhang the arms of the glasses should have glasses_over set to a positive value. + var/obj/item/clothing/glasses/G = glasses + if(istype(G) && G.over_mask) //If the user's used the 'wear over mask' verb on the glasses. + new_glasses.layer = -OVER_MASK_LAYER + overlays_standing[OVER_MASK_LAYER] = new_glasses + apply_overlay(OVER_MASK_LAYER) + else if(hair_style && hair_style.glasses_over) //Select which layer to use based on the properties of the hair style. Hair styles with hair that don't overhang the arms of the glasses should have glasses_over set to a positive value. new_glasses.layer = -GLASSES_OVER_LAYER overlays_standing[GLASSES_OVER_LAYER] = new_glasses apply_overlay(GLASSES_OVER_LAYER) From 1e363bfb88b3de2da9a3f6dae4493a3689c39564 Mon Sep 17 00:00:00 2001 From: Arkatos1 Date: Tue, 30 Apr 2019 19:51:01 +0200 Subject: [PATCH 05/45] Craftable patch pack --- code/game/objects/items/stacks/sheets/sheet_types.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index abc328a8bf1..2c1222154b0 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -240,6 +240,7 @@ var/global/list/datum/stack_recipe/cloth_recipes = list ( \ var/global/list/datum/stack_recipe/cardboard_recipes = list ( new /datum/stack_recipe("box", /obj/item/storage/box), new /datum/stack_recipe("large box", /obj/item/storage/box/large, 4), + new /datum/stack_recipe("patch pack", /obj/item/storage/pill_bottle/patch_pack, 2), new /datum/stack_recipe("light tubes", /obj/item/storage/box/lights/tubes), new /datum/stack_recipe("light bulbs", /obj/item/storage/box/lights/bulbs), new /datum/stack_recipe("mouse traps", /obj/item/storage/box/mousetraps), From 0d73736be2a166d7a9f5789b8b32ebe93b542501 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Wed, 1 May 2019 02:30:18 +0200 Subject: [PATCH 06/45] Make the traitor reviver implant EMP-proof --- code/datums/uplink_item.dm | 6 +++--- code/modules/surgery/organs/augments_internal.dm | 11 +++++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index a714e17d236..d1377fef558 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1544,10 +1544,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 12 /datum/uplink_item/cyber_implants/reviver - name = "Reviver Implant" - desc = "This implant will attempt to revive you if you lose consciousness. Comes with an automated implanting tool." + name = "Hardened Reviver Implant" + desc = "This implant will attempt to revive you if you lose consciousness. It is invulnerable to EMPs. Comes with an automated implanting tool." reference = "CIR" - item = /obj/item/organ/internal/cyberimp/chest/reviver + item = /obj/item/organ/internal/cyberimp/chest/reviver/hardened cost = 8 // POINTLESS BADASSERY diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 73d54003fc5..995b1b9811d 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -256,9 +256,16 @@ origin_tech = "materials=5;programming=4;biotech=4" slot = "heartdrive" var/revive_cost = 0 - var/reviving = 0 + var/reviving = FALSE var/cooldown = 0 +/obj/item/organ/internal/cyberimp/chest/reviver/hardened + name = "Hardened reviver implant" + emp_proof = TRUE + +/obj/item/organ/internal/cyberimp/chest/reviver/hardened/Initialize(mapload) + desc += " The implant has been hardened. It is invulnerable to EMPs." + /obj/item/organ/internal/cyberimp/chest/reviver/on_life() if(reviving) if(owner.stat == UNCONSCIOUS && (owner.sleeping == 0)) //!owner.sleeping didn't work for whatever dumb reason @@ -320,7 +327,7 @@ /obj/item/storage/box/cyber_implants/bundle name = "boxed cybernetic implants" var/list/boxed = list(/obj/item/organ/internal/cyberimp/eyes/xray,/obj/item/organ/internal/cyberimp/eyes/thermals, - /obj/item/organ/internal/cyberimp/brain/anti_stun, /obj/item/organ/internal/cyberimp/chest/reviver) + /obj/item/organ/internal/cyberimp/brain/anti_stun, /obj/item/organ/internal/cyberimp/chest/reviver/hardened) var/amount = 5 /obj/item/storage/box/cyber_implants/bundle/New() From a03603775b214a01e6322961630cd0b9da993e6c Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Wed, 1 May 2019 02:35:26 +0200 Subject: [PATCH 07/45] Initialize fix --- code/modules/surgery/organs/augments_internal.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 995b1b9811d..71a06d8e013 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -264,6 +264,7 @@ emp_proof = TRUE /obj/item/organ/internal/cyberimp/chest/reviver/hardened/Initialize(mapload) + . = ..() desc += " The implant has been hardened. It is invulnerable to EMPs." /obj/item/organ/internal/cyberimp/chest/reviver/on_life() From 791bebf51c55a1796f241f3b5fa95c442ec32ded Mon Sep 17 00:00:00 2001 From: Arkatos1 Date: Wed, 1 May 2019 15:50:30 +0200 Subject: [PATCH 08/45] Tweaks to Examine tooltips --- code/game/objects/items.dm | 2 +- code/game/objects/items/weapons/storage/storage.dm | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 9d199a404d0..0873be67772 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -593,7 +593,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/MouseEntered(location, control, params) if(in_inventory) - var/timedelay = 5 + var/timedelay = 7 var/user = usr tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, user), timedelay, TIMER_STOPPABLE) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 507d6fdb9f3..9908cc2542f 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -312,7 +312,9 @@ if(usr.s_active) usr.s_active.show_to(usr) W.mouse_opacity = MOUSE_OPACITY_OPAQUE //So you can click on the area around the item to equip it, instead of having to pixel hunt + W.in_inventory = TRUE update_icon() + W.in_inventory = TRUE return 1 //Call this proc to handle the removal of an item from the storage item. The item will be moved to the atom sent as new_target From c6a91eafddbbc7ef08d6abd836393ff12903aebf Mon Sep 17 00:00:00 2001 From: Arkatos1 Date: Wed, 1 May 2019 16:04:07 +0200 Subject: [PATCH 09/45] Tweaks --- code/game/objects/items.dm | 2 +- code/game/objects/items/weapons/storage/storage.dm | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 0873be67772..089317524e9 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -593,7 +593,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/MouseEntered(location, control, params) if(in_inventory) - var/timedelay = 7 + var/timedelay = 8 var/user = usr tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, user), timedelay, TIMER_STOPPABLE) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 9908cc2542f..581ace78ef9 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -314,7 +314,6 @@ W.mouse_opacity = MOUSE_OPACITY_OPAQUE //So you can click on the area around the item to equip it, instead of having to pixel hunt W.in_inventory = TRUE update_icon() - W.in_inventory = TRUE return 1 //Call this proc to handle the removal of an item from the storage item. The item will be moved to the atom sent as new_target From 24b0eb0c0cef05932ef63ab0f9b53ecf08cd309c Mon Sep 17 00:00:00 2001 From: Arkatos1 Date: Wed, 1 May 2019 16:57:54 +0200 Subject: [PATCH 10/45] toolbelt update --- code/game/objects/items/weapons/storage/belt.dm | 16 ++++------------ icons/mob/inhands/equipment/belt_lefthand.dmi | Bin 0 -> 4431 bytes icons/mob/inhands/equipment/belt_righthand.dmi | Bin 0 -> 4428 bytes 3 files changed, 4 insertions(+), 12 deletions(-) create mode 100644 icons/mob/inhands/equipment/belt_lefthand.dmi create mode 100644 icons/mob/inhands/equipment/belt_righthand.dmi diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index e406b097bee..9b1e89769cb 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -4,23 +4,22 @@ icon = 'icons/obj/clothing/belts.dmi' icon_state = "utilitybelt" item_state = "utility" + lefthand_file = 'icons/mob/inhands/equipment/belt_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/belt_righthand.dmi' slot_flags = SLOT_BELT attack_verb = list("whipped", "lashed", "disciplined") var/use_item_overlays = 0 // Do we have overlays for items held inside the belt? - /obj/item/storage/belt/update_icon() if(use_item_overlays) overlays.Cut() for(var/obj/item/I in contents) overlays += "[I.name]" - ..() /obj/item/storage/belt/proc/can_use() return is_equipped() - /obj/item/storage/belt/MouseDrop(obj/over_object as obj, src_location, over_location) var/mob/M = usr if(!istype(over_object, /obj/screen)) @@ -68,7 +67,7 @@ new /obj/item/weldingtool(src) new /obj/item/crowbar(src) new /obj/item/wirecutters(src) - new /obj/item/stack/cable_coil(src, 30, pick(COLOR_RED, COLOR_YELLOW, COLOR_ORANGE)) + new /obj/item/stack/cable_coil/random(src, 30) update_icon() /obj/item/storage/belt/utility/full/multitool/New() @@ -99,7 +98,7 @@ new /obj/item/crowbar/power(src) new /obj/item/weldingtool/experimental(src)//This can be changed if this is too much new /obj/item/multitool(src) - new /obj/item/stack/cable_coil(src, 30, pick(COLOR_RED, COLOR_YELLOW, COLOR_ORANGE)) + new /obj/item/stack/cable_coil/random(src, 30) new /obj/item/extinguisher/mini(src) new /obj/item/analyzer(src) update_icon() @@ -184,7 +183,6 @@ new /obj/item/reagent_containers/food/pill/salicylic(src) update_icon() - /obj/item/storage/belt/botany name = "botanist belt" desc = "Can hold various botanical supplies." @@ -207,7 +205,6 @@ /obj/item/wrench, ) - /obj/item/storage/belt/security name = "security belt" desc = "Can hold security gear like handcuffs and flashes." @@ -472,7 +469,6 @@ ..() update_icon() - /obj/item/storage/belt/holster name = "shoulder holster" desc = "A holster to conceal a carried handgun. WARNING: Badasses only." @@ -510,7 +506,6 @@ W.charges = W.max_charges update_icon() - /obj/item/storage/belt/fannypack name = "fannypack" desc = "A dorky fannypack for keeping small items in." @@ -599,7 +594,6 @@ // Bluespace Belt // ------------------------------------- - /obj/item/storage/belt/bluespace name = "Belt of Holding" desc = "The greatest in pants-supporting technology." @@ -632,8 +626,6 @@ var/bolacount = 0 var/cooldown = 0 - - /obj/item/storage/belt/bluespace/owlman/New() ..() new /obj/item/grenade/smokebomb(src) diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..366493eebded21555e327fda2d08eac2628f5442 GIT binary patch literal 4431 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 literal 0 HcmV?d00001 diff --git a/icons/mob/inhands/equipment/belt_righthand.dmi b/icons/mob/inhands/equipment/belt_righthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..81b075f706e521b3bde7eb7cbc5fce5d1066c6a3 GIT binary patch literal 4428 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 NqM@P#$0 Date: Wed, 1 May 2019 20:59:41 +0200 Subject: [PATCH 11/45] Chameleon overhaul --- .../RandomZLevels/stationCollision.dmm | 2 +- .../map_files/RandomZLevels/terrorspiders.dmm | 2 +- _maps/map_files/cyberiad/z2.dmm | 8 +- code/__DEFINES/misc.dm | 9 +- code/__HELPERS/lists.dm | 15 +- code/datums/action.dm | 14 + code/datums/outfits/outfit.dm | 9 +- code/datums/outfits/outfit_admin.dm | 8 +- code/datums/uplink_item.dm | 28 +- .../game/objects/effects/spawners/lootdrop.dm | 4 +- .../effects/spawners/random_spawners.dm | 2 +- code/game/objects/items.dm | 6 + code/game/objects/items/devices/megaphone.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 1 - code/game/objects/items/devices/voice.dm | 44 ++ .../objects/items/weapons/dna_injector.dm | 23 + .../objects/items/weapons/storage/backpack.dm | 3 +- .../admin/verbs/infiltratorteam_syndicate.dm | 2 +- code/modules/clothing/clothing.dm | 8 +- code/modules/clothing/masks/gasmask.dm | 5 - code/modules/clothing/masks/voice.dm | 38 -- code/modules/clothing/shoes/miscellaneous.dm | 18 - .../spacesuits/rig/modules/utility.dm | 13 +- code/modules/clothing/under/chameleon.dm | 522 +++++++++++++++--- code/modules/flufftext/Hallucination.dm | 4 +- code/modules/mob/living/carbon/human/say.dm | 22 +- code/modules/mob/mob_defines.dm | 1 + code/modules/ninja/suit/mask.dm | 12 +- code/modules/ninja/suit/suit.dm | 4 +- code/modules/paperwork/stamps.dm | 24 - icons/mob/actions/actions.dmi | Bin 93208 -> 96413 bytes icons/obj/device.dmi | Bin 41315 -> 41577 bytes paradise.dme | 2 +- 33 files changed, 646 insertions(+), 209 deletions(-) create mode 100644 code/game/objects/items/devices/voice.dm delete mode 100644 code/modules/clothing/masks/voice.dm diff --git a/_maps/map_files/RandomZLevels/stationCollision.dmm b/_maps/map_files/RandomZLevels/stationCollision.dmm index a8e3a533033..cc1767248cf 100644 --- a/_maps/map_files/RandomZLevels/stationCollision.dmm +++ b/_maps/map_files/RandomZLevels/stationCollision.dmm @@ -4123,7 +4123,7 @@ /turf/simulated/floor/plasteel, /area/awaymission/arrivalblock) "kG" = ( -/obj/item/clothing/shoes/syndigaloshes, +/obj/item/clothing/shoes/chameleon/noslip, /obj/item/clothing/under/syndicate, /obj/effect/decal/remains/human{ desc = "This guy seemed to have died in terrible way! Half his remains are dust."; diff --git a/_maps/map_files/RandomZLevels/terrorspiders.dmm b/_maps/map_files/RandomZLevels/terrorspiders.dmm index 1a64a0d7f0a..ed0bb019b83 100644 --- a/_maps/map_files/RandomZLevels/terrorspiders.dmm +++ b/_maps/map_files/RandomZLevels/terrorspiders.dmm @@ -13398,7 +13398,7 @@ /area/awaymission/UO71/loot) "zt" = ( /obj/structure/chair/wood/normal, -/obj/item/clothing/shoes/syndigaloshes, +/obj/item/clothing/shoes/chameleon/noslip, /turf/simulated/floor/carpet, /area/awaymission/UO71/loot) "zu" = ( diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index ee6ca15f83d..c1764ddf1c6 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -8543,7 +8543,7 @@ pixel_y = 3 }, /obj/item/clothing/mask/gas/cyborg, -/obj/item/clothing/mask/gas/voice, +/obj/item/clothing/mask/chameleon, /obj/item/clothing/mask/balaclava{ pixel_x = 3; pixel_y = -3 @@ -8729,7 +8729,7 @@ /area/admin) "uY" = ( /obj/structure/rack, -/obj/item/clothing/under/chameleon/all{ +/obj/item/clothing/mask/chameleon{ pixel_x = -3; pixel_y = 3 }, @@ -9036,7 +9036,7 @@ pixel_y = 3 }, /obj/item/clothing/shoes/centcom, -/obj/item/clothing/shoes/syndigaloshes{ +/obj/item/clothing/shoes/chameleon/noslip{ pixel_x = 3; pixel_y = -3 }, @@ -12275,7 +12275,7 @@ "Hv" = ( /obj/structure/rack, /obj/item/katana/energy, -/obj/item/clothing/mask/gas/voice/space_ninja, +/obj/item/clothing/mask/gas/space_ninja, /turf/unsimulated/floor{ icon_state = "engine" }, diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index dff9426c641..479a936489e 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -401,4 +401,11 @@ #define GHOST_ORBIT_TRIANGLE "triangle" #define GHOST_ORBIT_HEXAGON "hexagon" #define GHOST_ORBIT_SQUARE "square" -#define GHOST_ORBIT_PENTAGON "pentagon" \ No newline at end of file +#define GHOST_ORBIT_PENTAGON "pentagon" + +//suit sensors: sensor_mode defines + +#define SENSOR_OFF 0 +#define SENSOR_LIVING 1 +#define SENSOR_VITALS 2 +#define SENSOR_COORDS 3 \ No newline at end of file diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index f1e6f38a2d4..6b5807deaef 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -124,9 +124,13 @@ . += A //Like typesof() or subtypesof(), but returns a typecache instead of a list -/proc/typecacheof(path, ignore_root_path) +/proc/typecacheof(path, ignore_root_path, only_root_path = FALSE) if(ispath(path)) - var/list/types = ignore_root_path ? subtypesof(path) : typesof(path) + var/list/types = list() + if(only_root_path) + types = list(path) + else + types = ignore_root_path ? subtypesof(path) : typesof(path) var/list/L = list() for(var/T in types) L[T] = TRUE @@ -140,8 +144,11 @@ L[T] = TRUE else for(var/P in pathlist) - for(var/T in typesof(P)) - L[T] = TRUE + if(only_root_path) + L[P] = TRUE + else + for(var/T in typesof(P)) + L[T] = TRUE return L //Removes any null entries from the list diff --git a/code/datums/action.dm b/code/datums/action.dm index d316bd29b41..5972579834b 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -107,6 +107,7 @@ /datum/action/item_action check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS var/use_itemicon = TRUE + /datum/action/item_action/New(Target, custom_icon, custom_icon_state) ..() var/obj/item/I = target @@ -406,6 +407,19 @@ name = "Use [target.name]" button.name = name +/datum/action/item_action/voice_changer/toggle + name = "Toggle Voice Changer" + +/datum/action/item_action/voice_changer/voice + name = "Set Voice" + +/datum/action/item_action/voice_changer/voice/Trigger() + if(!IsAvailable()) + return FALSE + + var/obj/item/voice_changer/V = target + V.set_voice(usr) + // for clothing accessories like holsters /datum/action/item_action/accessory check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 8c172f3592f..184f1155da2 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -25,6 +25,7 @@ var/list/implants = null var/list/cybernetic_implants = null + var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns /datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) //to be overriden for customization depending on client prefs,species etc @@ -151,4 +152,10 @@ H.r_store.add_fingerprint(H, 1) if(H.wear_pda) H.wear_pda.add_fingerprint(H, 1) - return 1 \ No newline at end of file + return 1 + +/datum/outfit/proc/get_chameleon_disguise_info() + var/list/types = list(uniform, suit, back, belt, gloves, shoes, head, mask, l_ear, r_ear, glasses, id, l_pocket, r_pocket, suit_store, r_hand, l_hand, pda) + types += chameleon_extras + listclearnulls(types) + return types diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index 3ac473edfeb..09282ec77b1 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -123,7 +123,7 @@ /datum/outfit/admin/syndicate/spy name = "Syndicate Spy" uniform = /obj/item/clothing/under/suit_jacket/really_black - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip uplink_uses = 40 id_access = "Syndicate Agent" @@ -228,7 +228,7 @@ back = /obj/item/storage/backpack belt = /obj/item/storage/belt/utility/full/multitool gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/centcom id = /obj/item/card/id pda = /obj/item/pda @@ -990,7 +990,7 @@ suit = /obj/item/clothing/suit/hooded/chaplain_hoodie back = /obj/item/storage/backpack gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/syndicate id = /obj/item/card/id/syndicate l_hand = /obj/item/twohanded/dualsaber/red @@ -1021,7 +1021,7 @@ suit = /obj/item/clothing/suit/draculacoat back = /obj/item/storage/backpack gloves = /obj/item/clothing/gloves/combat - shoes = /obj/item/clothing/shoes/syndigaloshes/black + shoes = /obj/item/clothing/shoes/chameleon/noslip l_ear = /obj/item/radio/headset/syndicate id = /obj/item/card/id backpack_contents = list( diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index a714e17d236..aaeffa08b02 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1092,20 +1092,19 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 35 /datum/uplink_item/stealthy_tools/syndigaloshes - name = "No-Slip Syndicate Shoes" - desc = "These allow you to run on wet floors. They do not work on lubricated surfaces." + name = "No-Slip Chameleon Shoes" + desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \ + They do not work on heavily lubricated surfaces." reference = "NSSS" - item = /obj/item/clothing/shoes/syndigaloshes + item = /obj/item/clothing/shoes/chameleon/noslip cost = 2 excludefrom = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/syndigaloshes/nuke - name = "Tactical No-Slip Brown Shoes" - desc = "These allow you to run on wet floors. They do not work on lubricated surfaces, and the maker swears they're better than normal ones, somehow." - reference = "NNSSS" + reference = "TNSSS" cost = 4 //but they aren't - gamemodes = list(/datum/game_mode/nuclear) excludefrom = list() + gamemodes = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_tools/chamsechud name = "Chameleon Security HUD" @@ -1146,12 +1145,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/card/id/syndicate cost = 2 -/datum/uplink_item/stealthy_tools/voice_changer - name = "Voice Changer" - desc = "A conspicuous gas mask that mimics the voice named on your identification card. When no identification is worn, the mask will render your voice unrecognisable." - reference = "VC" - item = /obj/item/clothing/mask/gas/voice - cost = 3 +/datum/uplink_item/stealthy_tools/chameleon + name = "Chameleon Kit" + desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \ + Due to budget cuts, the shoes don't provide protection against slipping." + reference = "CHAM" + item = /obj/item/storage/box/syndie_kit/chameleon + cost = 2 /datum/uplink_item/stealthy_tools/chameleon_proj name = "Chameleon-Projector" @@ -1210,7 +1210,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_tools/clownkit name = "Honk Brand Infiltration Kit" - desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer clown mask, magnetic clown shoes, and standard clown outfit, tools, and backpack." + desc = "All the tools you need to play the best prank Nanotrasen has ever seen. Includes a voice changer mask, magnetic clown shoes, and standard clown outfit, tools, and backpack." reference = "HBIK" item = /obj/item/storage/backpack/clown/syndie cost = 6 diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 057c52a2a4c..b7311519f7a 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -140,8 +140,8 @@ /obj/item/suppressor = 4, /obj/item/clothing/under/chameleon = 2, /obj/item/stamp/chameleon = 2, - /obj/item/clothing/shoes/syndigaloshes = 5, - /obj/item/clothing/mask/gas/voice = 2, + /obj/item/clothing/shoes/chameleon/noslip = 5, + /obj/item/clothing/mask/chameleon = 2, /obj/item/dnascrambler = 1, /obj/item/storage/backpack/satchel_flat = 2, /obj/item/storage/toolbox/syndicate = 2, diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index 510e5b90380..03e49c56a50 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -214,7 +214,7 @@ /obj/item/storage/pill_bottle/zoom = 1, /obj/item/storage/pill_bottle/random_drug_bottle = 2, /obj/item/storage/backpack/duffel/syndie/surgery = 1, - /obj/item/clothing/shoes/syndigaloshes = 1, + /obj/item/clothing/shoes/chameleon/noslip = 1, /obj/item/storage/belt/military = 1, /obj/item/clothing/under/chameleon = 1, /obj/item/storage/backpack/satchel_flat = 1, diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 9d199a404d0..6d91b4c8778 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -600,3 +600,9 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/MouseExited() deltimer(tip_timer) //delete any in-progress timer if the mouse is moved off the item before it finishes closeToolTip(usr) + +/obj/item/proc/update_slot_icon() + if(!ismob(loc)) + return + var/mob/owner = loc + owner.regenerate_icons() diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 59a7a650383..941e90a31ef 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -35,7 +35,7 @@ return if(H.mind) span = H.mind.speech_span - if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice) || istype(H.get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown)) + if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice)) span = "sans" if(spamcheck) to_chat(user, "\The [src] needs to recharge!") diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 83a8c9304a1..00efc83668b 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -397,7 +397,6 @@ var/global/list/default_medbay_channels = list( var/mob/living/carbon/human/H = M displayname = H.voice if(H.voice != real_name) - jobname = "Unknown" voicemask = TRUE if(syndiekey && syndiekey.change_voice && connection.frequency == SYND_FREQ) diff --git a/code/game/objects/items/devices/voice.dm b/code/game/objects/items/devices/voice.dm new file mode 100644 index 00000000000..339271cdcca --- /dev/null +++ b/code/game/objects/items/devices/voice.dm @@ -0,0 +1,44 @@ +/obj/item/voice_changer + name = "voice changer" + desc = "A voice scrambling module." + icon = 'icons/obj/device.dmi' + icon_state = "voice_changer_off" + + actions_types = list(/datum/action/item_action/voice_changer/toggle, /datum/action/item_action/voice_changer/voice) + + var/obj/item/parent + + var/voice + var/active + +/obj/item/voice_changer/New() + . = ..() + + if(isitem(loc)) + parent = loc + parent.actions |= actions + +/obj/item/voice_changer/Destroy() + if(isitem(parent)) + parent.actions -= actions + + return ..() + +/obj/item/voice_changer/attack_self(mob/user) + active = !active + icon_state = "voice_changer_[active ? "on" : "off"]" + to_chat(user, "You toggle [src] [active ? "on" : "off"].") + + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/voice_changer/proc/set_voice(mob/user) + var/chosen_voice = input(user, "What voice would you like to mimic? Leave this empty to use the voice on your ID card.", "Set Voice Changer", voice) as text + if(!chosen_voice) + voice = null + to_chat(user, "You are now mimicking the voice on your ID card.") + return + + voice = sanitize(copytext(chosen_voice, 1, MAX_MESSAGE_LEN)) + to_chat(user, "You are now mimicking [voice].") \ No newline at end of file diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index d2f2ed2c54d..04206e1f5b2 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -668,4 +668,27 @@ /obj/item/dnainjector/m2h/Initialize() block = MONKEYBLOCK + ..() + + +/obj/item/dnainjector/comic + name = "DNA-Injector (Comic)" + desc = "Honk!" + datatype = DNA2_BUF_SE + value = 0xFFF + forcedmutation = TRUE + +/obj/item/dnainjector/comic/Initialize() + block = COMIC + ..() + +/obj/item/dnainjector/anticomic + name = "DNA-Injector (Ant-Comic)" + desc = "Honk...?" + datatype = DNA2_BUF_SE + value = 0x001 + forcedmutation = TRUE + +/obj/item/dnainjector/anticomic/Initialize() + block = COMIC ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index e5ee3562228..56ae2864071 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -112,7 +112,7 @@ ..() new /obj/item/clothing/under/rank/clown(src) new /obj/item/clothing/shoes/magboots/clown(src) - new /obj/item/clothing/mask/gas/voice/clown(src) + new /obj/item/clothing/mask/chameleon(src) new /obj/item/radio/headset/headset_service(src) new /obj/item/pda/clown(src) new /obj/item/storage/box/survival(src) @@ -124,6 +124,7 @@ new /obj/item/reagent_containers/food/drinks/bottle/bottleofbanana(src) new /obj/item/instrument/bikehorn(src) new /obj/item/bikehorn(src) + new /obj/item/dnainjector/comic(src) /obj/item/storage/backpack/mime name = "Parcel Parceaux" diff --git a/code/modules/admin/verbs/infiltratorteam_syndicate.dm b/code/modules/admin/verbs/infiltratorteam_syndicate.dm index 551076be62a..4597a838733 100644 --- a/code/modules/admin/verbs/infiltratorteam_syndicate.dm +++ b/code/modules/admin/verbs/infiltratorteam_syndicate.dm @@ -170,7 +170,7 @@ var/global/sent_syndicate_infiltration_team = 0 equip_or_collect(new /obj/item/pda(src), slot_in_backpack) // Other gear - equip_to_slot_or_del(new /obj/item/clothing/shoes/syndigaloshes(src), slot_shoes) + equip_to_slot_or_del(new /obj/item/clothing/shoes/chameleon/noslip(src), slot_shoes) var/obj/item/card/id/syndicate/W = new(src) if (flag_mgmt) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 9613ce173af..a0e3b169c7e 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -574,8 +574,9 @@ BLIND // can't see anything "Drask" = 'icons/mob/species/drask/uniform.dmi', "Grey" = 'icons/mob/species/grey/uniform.dmi' ) - var/has_sensor = 1//For the crew computer 2 = unable to change mode - var/sensor_mode = 0 + var/has_sensor = TRUE//For the crew computer 2 = unable to change mode + var/sensor_mode = SENSOR_OFF + var/random_sensor = TRUE /* 1 = Report living/dead 2 = Report detailed damages @@ -587,7 +588,8 @@ BLIND // can't see anything var/basecolor /obj/item/clothing/under/rank/New() - sensor_mode = pick(0,1,2,3) + if(random_sensor) + sensor_mode = pick(SENSOR_OFF, SENSOR_LIVING, SENSOR_VITALS, SENSOR_COORDS) ..() /obj/item/clothing/under/Destroy() diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 0c4dba9ae49..1bd53217770 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -162,11 +162,6 @@ item_state = "sexymime" burn_state = FLAMMABLE -/obj/item/clothing/mask/gas/death_commando - name = "Death Commando Mask" - icon_state = "death_commando_mask" - item_state = "death_commando_mask" - /obj/item/clothing/mask/gas/cyborg name = "cyborg visor" desc = "Beep boop" diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm deleted file mode 100644 index b5b6298dcb2..00000000000 --- a/code/modules/clothing/masks/voice.dm +++ /dev/null @@ -1,38 +0,0 @@ -/obj/item/voice_changer - name = "voice changer" - desc = "A voice scrambling module. If you can see this, report it as a bug on the tracker." - var/voice //If set and item is present in mask/suit, this name will be used for the wearer's speech. - var/active - -/obj/item/clothing/mask/gas/voice - name = "gas mask" -// desc = "A face-covering mask that can be connected to an air supply. It seems to house some odd electronics." - var/obj/item/voice_changer/changer - burn_state = FIRE_PROOF - -/obj/item/clothing/mask/gas/voice/verb/Toggle_Voice_Changer() - set category = "Object" - set src in usr - - changer.active = !changer.active - to_chat(usr, "You [changer.active ? "enable" : "disable"] the voice-changing module in \the [src].") - -/obj/item/clothing/mask/gas/voice/verb/Set_Voice(name as text) - set category = "Object" - set src in usr - - var/voice = sanitize(copytext(name,1,MAX_MESSAGE_LEN)) - if(!voice || !length(voice)) return - changer.voice = voice - to_chat(usr, "You are now mimicking [changer.voice].") - -/obj/item/clothing/mask/gas/voice/New() - ..() - changer = new(src) - -/obj/item/clothing/mask/gas/voice/clown - name = "clown wig and mask" - desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask." - icon_state = "clown" - item_state = "clown_hat" - flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR \ No newline at end of file diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index f3a2efed260..d4411fbdbe6 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -1,21 +1,3 @@ -/obj/item/clothing/shoes/syndigaloshes - desc = "A pair of brown shoes. They seem to have extra grip." - name = "brown shoes" - icon_state = "brown" - item_state = "brown" - permeability_coefficient = 0.05 - flags = NOSLIP - origin_tech = "syndicate=2" - burn_state = FIRE_PROOF - var/list/clothing_choices = list() - silence_steps = 1 - -/obj/item/clothing/shoes/syndigaloshes/black - name = "black shoes" - icon_state = "black" - item_color = "black" - desc = "A pair of black shoes. They seem to have extra grip." - /obj/item/clothing/shoes/mime name = "mime shoes" icon_state = "mime" diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index aa62763a6d3..bfb326eae1d 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -269,14 +269,13 @@ /obj/item/rig_module/voice/New() ..() voice_holder = new(src) - voice_holder.active = 0 + voice_holder.active = FALSE /obj/item/rig_module/voice/installed() ..() holder.speech = src /obj/item/rig_module/voice/engage() - if(!..()) return 0 @@ -287,17 +286,17 @@ switch(choice) if("Enable") - active = 1 - voice_holder.active = 1 + active = TRUE + voice_holder.active = TRUE to_chat(usr, "You enable the speech synthesiser.") if("Disable") - active = 0 - voice_holder.active = 0 + active = FALSE + voice_holder.active = FALSE to_chat(usr, "You disable the speech synthesiser.") if("Set Name") var/raw_choice = sanitize(input(usr, "Please enter a new name.") as text|null, MAX_NAME_LEN) if(!raw_choice) - return 0 + return FALSE voice_holder.voice = raw_choice to_chat(usr, "You are now mimicking [voice_holder.voice].") return 1 diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm index b320237996e..b08a1ce72c9 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/under/chameleon.dm @@ -1,86 +1,478 @@ +#define EMP_RANDOMISE_TIME 300 + +/datum/action/chameleon_outfit + name = "Select Chameleon Outfit" + button_icon_state = "chameleon_outfit" + var/list/outfit_options //By default, this list is shared between all instances. It is not static because if it were, subtypes would not be able to have their own. If you ever want to edit it, copy it first. + +/datum/action/chameleon_outfit/New() + ..() + initialize_outfits() + +/datum/action/chameleon_outfit/proc/initialize_outfits() + var/static/list/standard_outfit_options + if(!standard_outfit_options) + standard_outfit_options = list() + for(var/path in subtypesof(/datum/outfit/job)) + var/datum/outfit/O = path + standard_outfit_options[initial(O.name)] = path + sortTim(standard_outfit_options, /proc/cmp_text_asc) + outfit_options = standard_outfit_options + +/datum/action/chameleon_outfit/Trigger() + return select_outfit(owner) + +/datum/action/chameleon_outfit/proc/select_outfit(mob/user) + if(!user || !IsAvailable()) + return FALSE + var/selected = input("Select outfit to change into", "Chameleon Outfit") as null|anything in outfit_options + if(!IsAvailable() || QDELETED(src) || QDELETED(user)) + return FALSE + var/outfit_type = outfit_options[selected] + if(!outfit_type) + return FALSE + var/datum/outfit/O = new outfit_type() + var/list/outfit_types = O.get_chameleon_disguise_info() + + for(var/V in user.chameleon_item_actions) + var/datum/action/item_action/chameleon/change/A = V + var/done = FALSE + for(var/T in outfit_types) + for(var/name in A.chameleon_list) + if(A.chameleon_list[name] == T) + A.update_look(user, T) + outfit_types -= T + done = TRUE + break + if(done) + break + //hardsuit helmets/suit hoods + if(ispath(O.suit, /obj/item/clothing/suit/hooded) && ishuman(user)) + var/mob/living/carbon/human/H = user + //make sure they are actually wearing the suit, not just holding it, and that they have a chameleon hat + if(istype(H.wear_suit, /obj/item/clothing/suit/chameleon) && istype(H.head, /obj/item/clothing/head/chameleon)) + var/helmet_type + var/obj/item/clothing/suit/hooded/hooded = O.suit + helmet_type = initial(hooded.hoodtype) + + if(helmet_type) + var/obj/item/clothing/head/chameleon/hat = H.head + hat.chameleon_action.update_look(user, helmet_type) + qdel(O) + return TRUE + + +/datum/action/item_action/chameleon/change + name = "Chameleon Change" + var/list/chameleon_blacklist = list() //This is a typecache + var/list/chameleon_list = list() + var/chameleon_type = null + var/chameleon_name = "Item" + + var/emp_timer + +/datum/action/item_action/chameleon/change/Grant(mob/M) + if(M && (owner != M)) + if(!M.chameleon_item_actions) + M.chameleon_item_actions = list(src) + var/datum/action/chameleon_outfit/O = new /datum/action/chameleon_outfit() + O.Grant(M) + else + M.chameleon_item_actions |= src + ..() + +/datum/action/item_action/chameleon/change/Remove(mob/M) + if(M && (M == owner)) + LAZYREMOVE(M.chameleon_item_actions, src) + if(!LAZYLEN(M.chameleon_item_actions)) + var/datum/action/chameleon_outfit/O = locate(/datum/action/chameleon_outfit) in M.actions + qdel(O) + ..() + +/datum/action/item_action/chameleon/change/proc/initialize_disguises() + if(button) + button.name = "Change [chameleon_name] Appearance" + + chameleon_blacklist |= typecacheof(target.type) + for(var/V in typesof(chameleon_type)) + if(ispath(V) && ispath(V, /obj/item)) + var/obj/item/I = V + if(chameleon_blacklist[V] || (initial(I.flags) & ABSTRACT) || !initial(I.icon_state)) + continue + var/chameleon_item_name = "[initial(I.name)] ([initial(I.icon_state)])" + chameleon_list[chameleon_item_name] = I + +/datum/action/item_action/chameleon/change/proc/select_look(mob/user) + var/obj/item/picked_item + var/picked_name + picked_name = input("Select [chameleon_name] to change into", "Chameleon [chameleon_name]", picked_name) as null|anything in chameleon_list + if(!picked_name) + return + picked_item = chameleon_list[picked_name] + if(!picked_item) + return + update_look(user, picked_item) + +/datum/action/item_action/chameleon/change/proc/random_look(mob/user) + var/picked_name = pick(chameleon_list) + // If a user is provided, then this item is in use, and we + // need to update our icons and stuff + + if(user) + update_look(user, chameleon_list[picked_name]) + + // Otherwise, it's likely a random initialisation, so we + // don't have to worry + + else + update_item(chameleon_list[picked_name]) + +/datum/action/item_action/chameleon/change/proc/update_look(mob/user, obj/item/picked_item) + if(isliving(user)) + var/mob/living/C = user + if(C.stat != CONSCIOUS) + return + + update_item(picked_item) + var/obj/item/thing = target + thing.update_slot_icon() + UpdateButtonIcon() + +/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) + target.name = initial(picked_item.name) + target.desc = initial(picked_item.desc) + target.icon_state = initial(picked_item.icon_state) + if(isitem(target)) + var/obj/item/I = target + I.item_state = initial(picked_item.item_state) + I.item_color = initial(picked_item.item_color) + if(istype(I, /obj/item/clothing) && istype(initial(picked_item), /obj/item/clothing)) + var/obj/item/clothing/CL = I + var/obj/item/clothing/PCL = picked_item + CL.flags_cover = initial(PCL.flags_cover) + target.icon = initial(picked_item.icon) + +/datum/action/item_action/chameleon/change/Trigger() + if(!IsAvailable()) + return + + select_look(owner) + return 1 + +/datum/action/item_action/chameleon/change/proc/emp_randomise(var/amount = EMP_RANDOMISE_TIME) + START_PROCESSING(SSprocessing, src) + random_look(owner) + + var/new_value = world.time + amount + if(new_value > emp_timer) + emp_timer = new_value + +/datum/action/item_action/chameleon/change/process() + if(world.time > emp_timer) + STOP_PROCESSING(SSprocessing, src) + return + random_look(owner) + /obj/item/clothing/under/chameleon //starts off as black name = "black jumpsuit" icon_state = "black" item_state = "bl_suit" item_color = "black" - desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist." - origin_tech = "syndicate=2" - var/list/clothing_choices = list() - burn_state = FIRE_PROOF - armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0) + desc = "It's a plain jumpsuit. It has a small dial on the wrist." + sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? + random_sensor = FALSE + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - New() - ..() - var/blocked = list(/obj/item/clothing/under/color/random, /obj/item/clothing/under/rank/centcom) // Stops random coloured jumpsuit and undefined centcomm suit appearing in the list. - for(var/U in subtypesof(/obj/item/clothing/under/color) - blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V + var/datum/action/item_action/chameleon/change/chameleon_action - for(var/U in subtypesof(/obj/item/clothing/under/rank) - blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V - return +/obj/item/clothing/under/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/under + chameleon_action.chameleon_name = "Jumpsuit" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/under, /obj/item/clothing/under/color, /obj/item/clothing/under/rank), only_root_path = TRUE) + chameleon_action.initialize_disguises() +/obj/item/clothing/under/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() - attackby(obj/item/clothing/under/U as obj, mob/user as mob, params) - ..() - if(istype(U, /obj/item/clothing/under/chameleon)) - to_chat(user, "Nothing happens.") - return - if(istype(U, /obj/item/clothing/under)) - if(src.clothing_choices.Find(U)) - to_chat(user, "Pattern is already recognised by the suit.") - return - src.clothing_choices += U - to_chat(user, "Pattern absorbed by the suit.") +/obj/item/clothing/under/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) +/obj/item/clothing/suit/chameleon + name = "armor" + desc = "A slim armored vest that protects against most types of damage." + icon_state = "armor" + item_state = "armor" + blood_overlay_type = "armor" + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - emp_act(severity) - name = "psychedelic" - desc = "Groovy!" - icon_state = "psyche" - item_color = "psyche" - usr.update_inv_w_uniform() - spawn(200) - name = initial(name) - icon_state = initial(icon_state) - item_color = initial(item_color) - desc = initial(desc) - usr.update_inv_w_uniform() - ..() + var/datum/action/item_action/chameleon/change/chameleon_action +/obj/item/clothing/suit/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/suit + chameleon_action.chameleon_name = "Suit" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor), only_root_path = TRUE) + chameleon_action.initialize_disguises() - verb/change() - set name = "Change Color" - set category = "Object" - set src in usr +/obj/item/clothing/suit/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() - if(icon_state == "psyche") - to_chat(usr, "Your suit is malfunctioning") - return +/obj/item/clothing/suit/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) - var/obj/item/clothing/under/A - A = input("Select Colour to change it to", "BOOYEA", A) in clothing_choices - if(!A) - return +/obj/item/clothing/glasses/chameleon + name = "Optical Meson Scanner" + desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." + icon_state = "meson" + item_state = "meson" + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - desc = null - permeability_coefficient = 0.90 + var/datum/action/item_action/chameleon/change/chameleon_action - desc = A.desc - name = A.name - icon_state = A.icon_state - item_state = A.item_state - item_color = A.item_color - usr.update_inv_w_uniform() //so our overlays update. +/obj/item/clothing/glasses/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/glasses + chameleon_action.chameleon_name = "Glasses" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() +/obj/item/clothing/glasses/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() +/obj/item/clothing/glasses/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) -/obj/item/clothing/under/chameleon/all/New() - ..() - var/blocked = list(/obj/item/clothing/under/chameleon, /obj/item/clothing/under/chameleon/all) - //to prevent an infinite loop - for(var/U in typesof(/obj/item/clothing/under)-blocked) - var/obj/item/clothing/under/V = new U - src.clothing_choices += V +/obj/item/clothing/gloves/chameleon + desc = "These gloves will protect the wearer from electric shock." + name = "insulated gloves" + icon_state = "yellow" + item_state = "ygloves" + + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/gloves/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/gloves + chameleon_action.chameleon_name = "Gloves" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/gloves, /obj/item/clothing/gloves/color), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/clothing/gloves/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/gloves/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/head/chameleon + name = "grey cap" + desc = "It's a baseball hat in a tasteful grey colour." + icon_state = "greysoft" + item_color = "grey" + + resistance_flags = NONE + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/head/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/head + chameleon_action.chameleon_name = "Hat" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/head/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/head/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/mask/chameleon + name = "gas mask" + desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate + icon_state = "gas_alt" + item_state = "gas_alt" + resistance_flags = NONE + armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + flags = AIRTIGHT | BLOCK_GAS_SMOKE_EFFECT + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + gas_transfer_coefficient = 0.01 + permeability_coefficient = 0.01 + flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH + + var/obj/item/voice_changer/voice_changer + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/mask/chameleon/Initialize() + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/mask + chameleon_action.chameleon_name = "Mask" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + + voice_changer = new(src) + +/obj/item/clothing/mask/chameleon/Destroy() + QDEL_NULL(voice_changer) + return ..() + +/obj/item/clothing/mask/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/mask/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/shoes/chameleon + name = "black shoes" + icon_state = "black" + item_color = "black" + desc = "A pair of black shoes." + permeability_coefficient = 0.05 + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/shoes/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/shoes + chameleon_action.chameleon_name = "Shoes" + chameleon_action.chameleon_blacklist = list() + chameleon_action.initialize_disguises() + +/obj/item/clothing/shoes/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/clothing/shoes/chameleon/noslip + name = "black shoes" + icon_state = "black" + item_color = "black" + desc = "A pair of black shoes." + flags = NOSLIP + +/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/storage/backpack/chameleon + name = "backpack" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/backpack/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/backpack + chameleon_action.chameleon_name = "Backpack" + chameleon_action.initialize_disguises() + +/obj/item/storage/backpack/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/storage/backpack/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/storage/belt/chameleon + name = "toolbelt" + desc = "Holds tools." + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/belt/chameleon/Initialize() + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/belt + chameleon_action.chameleon_name = "Belt" + chameleon_action.initialize_disguises() + +/obj/item/storage/belt/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/storage/belt/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/radio/headset/chameleon + name = "radio headset" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/radio/headset/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/radio/headset + chameleon_action.chameleon_name = "Headset" + chameleon_action.initialize_disguises() + +/obj/item/radio/headset/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/radio/headset/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/pda/chameleon + name = "PDA" + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/pda/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/pda + chameleon_action.chameleon_name = "PDA" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/pda/heads), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +/obj/item/pda/chameleon/emp_act(severity) + . = ..() + chameleon_action.emp_randomise() + +/obj/item/pda/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/stamp/chameleon + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/stamp/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/stamp + chameleon_action.chameleon_name = "Stamp" + chameleon_action.initialize_disguises() + +/obj/item/stamp/chameleon/broken/Initialize() + . = ..() + chameleon_action.emp_randomise(INFINITY) \ No newline at end of file diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index e937ec25ef9..6be1d3bcf70 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -671,8 +671,8 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ /obj/item/gun/energy/kinetic_accelerator/crossbow,\ /obj/item/storage/box/syndicate, /obj/item/storage/box/emps,\ /obj/item/cartridge/syndicate, /obj/item/clothing/under/chameleon,\ - /obj/item/clothing/shoes/syndigaloshes, /obj/item/card/id/syndicate,\ - /obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\ + /obj/item/clothing/shoes/chameleon/noslip, /obj/item/card/id/syndicate,\ + /obj/item/clothing/mask/chameleon, /obj/item/clothing/glasses/thermal,\ /obj/item/chameleon, /obj/item/card/emag,\ /obj/item/storage/toolbox/syndicate, /obj/item/aiModule,\ /obj/item/radio/headset/syndicate, /obj/item/grenade/plastic/c4,\ diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 1be6fc60a25..2f181d77077 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -62,27 +62,38 @@ return ..() /mob/living/carbon/human/proc/HasVoiceChanger() - if(istype(back,/obj/item/rig)) + if(istype(back, /obj/item/rig)) var/obj/item/rig/rig = back if(rig.speech && rig.speech.voice_holder && rig.speech.voice_holder.active && rig.speech.voice_holder.voice) return rig.speech.voice_holder.voice - for(var/obj/item/gear in list(wear_mask,wear_suit,head)) + for(var/obj/item/gear in list(wear_mask, wear_suit, head)) if(!gear) continue + var/obj/item/voice_changer/changer = locate() in gear - if(changer && changer.active && changer.voice) - return changer.voice - return 0 + if(changer && changer.active) + if(changer.voice) + return changer.voice + else if(wear_id) + var/obj/item/card/id/idcard = wear_id.GetID() + if(istype(idcard)) + return idcard.registered_name + + return FALSE /mob/living/carbon/human/GetVoice() var/has_changer = HasVoiceChanger() + if(has_changer) return has_changer + if(mind && mind.changeling && mind.changeling.mimicing) return mind.changeling.mimicing + if(GetSpecialVoice()) return GetSpecialVoice() + return real_name /mob/living/carbon/human/IsVocal() @@ -124,7 +135,6 @@ span = mind.speech_span if((COMIC in mutations) \ || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs) \ - || istype(get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown) \ || GetComponent(/datum/component/jestosterone)) span = "sans" diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 3e9ff0b7ba6..e3b9b516909 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -196,6 +196,7 @@ var/list/permanent_huds = list() var/list/actions = list() + var/list/datum/action/chameleon_item_actions var/list/progressbars = null //for stacking do_after bars diff --git a/code/modules/ninja/suit/mask.dm b/code/modules/ninja/suit/mask.dm index 910ccbc953c..bfc87e0104c 100644 --- a/code/modules/ninja/suit/mask.dm +++ b/code/modules/ninja/suit/mask.dm @@ -6,7 +6,7 @@ Contents: */ -/obj/item/clothing/mask/gas/voice/space_ninja +/obj/item/clothing/mask/gas/space_ninja name = "ninja mask" desc = "A close-fitting mask that acts both as an air filter and a post-modern fashion statement." icon_state = "s-ninja(norm)" @@ -19,3 +19,13 @@ Contents: "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) + + var/obj/item/voice_changer/voice_changer + +/obj/item/clothing/mask/gas/space_ninja/Initialize(mapload) + . = ..() + voice_changer = new(src) + +/obj/item/clothing/mask/gas/space_ninja/Destroy() + QDEL_NULL(voice_changer) + return ..() \ No newline at end of file diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index f03a08d237a..dfd430a5754 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -24,7 +24,7 @@ Contents: var/obj/item/clothing/head/helmet/space/space_ninja/suitHood var/obj/item/clothing/gloves/space_ninja/suitGloves var/obj/item/clothing/shoes/space_ninja/suitShoes - var/obj/item/clothing/mask/gas/voice/space_ninja/suitMask + var/obj/item/clothing/mask/gas/space_ninja/suitMask var/mob/living/carbon/human/suitOccupant /obj/item/clothing/suit/space/space_ninja/proc/toggle_suit_lock(mob/living/carbon/human/user) @@ -41,7 +41,7 @@ Contents: if(!istype(user.shoes, /obj/item/clothing/shoes/space_ninja)) to_chat(user, "ERROR: Unable to locate foot gear.\nABORTING...") return 0 - if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) + if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/space_ninja)) to_chat(user, "ERROR: Unable to locate mask.\nABORTING...") return 0 diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 8e78f0ce230..8c24cc55c9d 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -92,27 +92,3 @@ icon_state = "stamp-syndicate" item_color = "syndicate" -// Syndicate stamp to forge documents. - -/obj/item/stamp/chameleon/attack_self(mob/user as mob) - - var/list/stamp_types = typesof(/obj/item/stamp) - src.type // Get all stamp types except our own - var/list/stamps = list() - - // Generate them into a list - for(var/stamp_type in stamp_types) - var/obj/item/stamp/S = new stamp_type - stamps[capitalize(S.name)] = S - - var/list/show_stamps = list("EXIT" = null) + sortList(stamps) // the list that will be shown to the user to pick from - - var/input_stamp = input(user, "Choose a stamp to disguise as.", "Choose a stamp.") in show_stamps - - if(user && src in user.contents) - - var/obj/item/stamp/chosen_stamp = stamps[capitalize(input_stamp)] - - if(chosen_stamp) - name = chosen_stamp.name - icon_state = chosen_stamp.icon_state - item_color = chosen_stamp.item_color diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index b4d8a34a6e0b807b6381a3c8b92e6418718498df..7bc556c628c06f6152ba38303a766e421d6cc105 100644 GIT binary patch delta 16795 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 Z{J88D&`D(`1ONa9P>@lUE|WA0_&+_~S_uFE delta 13563 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 diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 02de48a6f41b9a525915b8893d89b6bc6b3802cc..469934ca9329fa755799091b1a95bb3396e463f4 100644 GIT binary patch delta 20405 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 diff --git a/paradise.dme b/paradise.dme index 1b7a691c820..f96d9d6da59 100644 --- a/paradise.dme +++ b/paradise.dme @@ -853,6 +853,7 @@ #include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\uplinks.dm" +#include "code\game\objects\items\devices\voice.dm" #include "code\game\objects\items\devices\whistle.dm" #include "code\game\objects\items\devices\radio\beacon.dm" #include "code\game\objects\items\devices\radio\electropack.dm" @@ -1319,7 +1320,6 @@ #include "code\modules\clothing\masks\breath.dm" #include "code\modules\clothing\masks\gasmask.dm" #include "code\modules\clothing\masks\miscellaneous.dm" -#include "code\modules\clothing\masks\voice.dm" #include "code\modules\clothing\patreon\glasses.dm" #include "code\modules\clothing\patreon\hats.dm" #include "code\modules\clothing\shoes\colour.dm" From 86b90bab2cae948cb0de0ad7fe0f12af75e67ab6 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Wed, 1 May 2019 21:01:16 +0200 Subject: [PATCH 12/45] And fix the uplink kits --- .../items/weapons/storage/uplink_kits.dm | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index ecf1acd701e..56db11ad058 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -5,7 +5,7 @@ if("bloodyspai") // 28TC new /obj/item/twohanded/garrote(src) new /obj/item/pinpointer/advpinpointer(src) - new /obj/item/clothing/mask/gas/voice(src) + new /obj/item/clothing/mask/chameleon(src) new /obj/item/clothing/under/chameleon(src) new /obj/item/card/id/syndicate(src) new /obj/item/flashlight/emp(src) @@ -19,7 +19,7 @@ new /obj/item/chameleon(src) new /obj/item/clothing/gloves/color/black/thief(src) new /obj/item/card/id/syndicate(src) - new /obj/item/clothing/shoes/syndigaloshes(src) + new /obj/item/clothing/shoes/chameleon/noslip(src) new /obj/item/storage/box/syndie_kit/safecracking(src) return @@ -83,14 +83,14 @@ new /obj/item/dnainjector/telemut/darkbundle(src) new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) new /obj/item/card/id/syndicate(src) - new /obj/item/clothing/shoes/syndigaloshes(src) - new /obj/item/clothing/mask/gas/voice(src) + new /obj/item/clothing/shoes/chameleon/noslip(src) + new /obj/item/clothing/mask/chameleon(src) return if("gadgets") // 30TC new /obj/item/clothing/gloves/color/yellow/power(src) new /obj/item/pen/sleepy(src) - new /obj/item/clothing/shoes/syndigaloshes(src) + new /obj/item/clothing/shoes/chameleon/noslip(src) new /obj/item/clothing/glasses/thermal/syndi(src) new /obj/item/flashlight/emp(src) new /obj/item/stamp/chameleon(src) @@ -340,4 +340,21 @@ To apply, hold the injector a short distance away from the outer thigh before ap new /obj/item/clothing/gloves/color/latex/nitrile(src) new /obj/item/clothing/mask/balaclava(src) new /obj/item/clothing/accessory/stethoscope(src) - new /obj/item/book/manual/engineering_hacking(src) \ No newline at end of file + new /obj/item/book/manual/engineering_hacking(src) + +/obj/item/storage/box/syndie_kit/chameleon + name = "chameleon kit" + +/obj/item/storage/box/syndie_kit/chameleon/New() + ..() + new /obj/item/clothing/under/chameleon(src) + new /obj/item/clothing/suit/chameleon(src) + new /obj/item/clothing/gloves/chameleon(src) + new /obj/item/clothing/shoes/chameleon(src) + new /obj/item/clothing/glasses/chameleon(src) + new /obj/item/clothing/head/chameleon(src) + new /obj/item/clothing/mask/chameleon(src) + new /obj/item/storage/backpack/chameleon(src) + new /obj/item/radio/headset/chameleon(src) + new /obj/item/stamp/chameleon(src) + new /obj/item/pda/chameleon(src) \ No newline at end of file From f7a52dcec0b301a9cabf7b0c780beda0f1809919 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Wed, 1 May 2019 21:07:43 +0200 Subject: [PATCH 13/45] COMIC injector fix --- code/game/objects/items/weapons/dna_injector.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 04206e1f5b2..c7627688b5e 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -679,7 +679,7 @@ forcedmutation = TRUE /obj/item/dnainjector/comic/Initialize() - block = COMIC + block = COMICBLOCK ..() /obj/item/dnainjector/anticomic @@ -690,5 +690,5 @@ forcedmutation = TRUE /obj/item/dnainjector/anticomic/Initialize() - block = COMIC + block = COMICBLOCK ..() \ No newline at end of file From 0d81c2da7c12a9578bb675dbb2d5e45f9503bc25 Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 1 May 2019 14:19:43 -0500 Subject: [PATCH 14/45] Adds Pig Crate --- code/datums/supplypacks.dm | 6 ++++++ code/game/objects/structures/crates_lockers/crittercrate.dm | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index ec43330a8eb..8fdaf8c25df 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1073,6 +1073,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containertype = /obj/structure/closet/critter/cow containername = "cow crate" +/datum/supply_packs/organic/pig + name = "Pig Crate" + cost = 25 + containertype = /obj/structure/closet/critter/pig + containername = "pig crate" + /datum/supply_packs/organic/goat name = "Goat Crate" cost = 25 diff --git a/code/game/objects/structures/crates_lockers/crittercrate.dm b/code/game/objects/structures/crates_lockers/crittercrate.dm index ffaff75288d..50d9b056e96 100644 --- a/code/game/objects/structures/crates_lockers/crittercrate.dm +++ b/code/game/objects/structures/crates_lockers/crittercrate.dm @@ -44,6 +44,10 @@ name = "cow crate" content_mob = /mob/living/simple_animal/cow +/obj/structure/closet/critter/pig + name = "pig crate" + content_mob = /mob/living/simple_animal/pig + /obj/structure/closet/critter/goat name = "goat crate" content_mob = /mob/living/simple_animal/hostile/retaliate/goat From 1f2c3819bd58ab9d8ea75d190e3f4cf6fcade6ab Mon Sep 17 00:00:00 2001 From: Arkatos1 Date: Wed, 1 May 2019 21:43:32 +0200 Subject: [PATCH 15/45] Adds 4 new plushies --- code/game/objects/items/toys.dm | 26 ++++++++++++++++++++++++++ code/modules/arcade/arcade_prize.dm | 4 ++-- code/modules/arcade/prize_datums.dm | 4 ++-- icons/obj/toy.dmi | Bin 73506 -> 75141 bytes 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 19864e0ba18..393ca1f3c0b 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1066,6 +1066,32 @@ obj/item/toy/cards/deck/syndicate/black name = "tuxedo cat plushie" icon_state = "tuxedocat" +//New generation TG plushies + +/obj/item/toy/plushie/lizardplushie + name = "lizard plushie" + desc = "An adorable stuffed toy that resembles a lizardperson." + icon_state = "plushie_lizard" + item_state = "plushie_lizard" + +/obj/item/toy/plushie/snakeplushie + name = "snake plushie" + desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing." + icon_state = "plushie_snake" + item_state = "plushie_snake" + +/obj/item/toy/plushie/nukeplushie + name = "operative plushie" + desc = "An stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious." + icon_state = "plushie_nuke" + item_state = "plushie_nuke" + +/obj/item/toy/plushie/slimeplushie + name = "slime plushie" + desc = "An adorable stuffed toy that resembles a slime. It is practically just a hacky sack." + icon_state = "plushie_slime" + item_state = "plushie_slime" + /* * Foam Armblade */ diff --git a/code/modules/arcade/arcade_prize.dm b/code/modules/arcade/arcade_prize.dm index 94c265848b7..a91e392e125 100644 --- a/code/modules/arcade/arcade_prize.dm +++ b/code/modules/arcade/arcade_prize.dm @@ -42,8 +42,8 @@ possible_contents = list(/obj/random/carp_plushie) /obj/item/toy/prizeball/plushie - name = "animal plushie capsule" - desc = "Contains one cuddly animal plushie!" + name = "plushie capsule" + desc = "Contains one cuddly plushie!" possible_contents = list(/obj/random/plushie) /obj/item/toy/prizeball/figure diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm index a68071f8f44..4d2e062677a 100644 --- a/code/modules/arcade/prize_datums.dm +++ b/code/modules/arcade/prize_datums.dm @@ -157,8 +157,8 @@ var/global/datum/prizes/global_prizes = new cost = 65 /datum/prize_item/plushie - name = "Random Animal Plushie" - desc = "A colorful animal-shaped plush toy." + name = "Random Plushie" + desc = "A colorful plush toy." typepath = /obj/item/toy/prizeball/plushie cost = 75 diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 524418ba0e90152a11ee6bbcddb955770e0be0d9..ccfa57790d9779f44f283f21c4cfae994d527306 100644 GIT binary patch delta 15954 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 B=i2}P delta 14306 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 f^*@rbMf6VWQkn0Umw%231rZquMe!O@ Date: Thu, 2 May 2019 05:32:05 +0200 Subject: [PATCH 16/45] fixed typo --- code/modules/shuttle/syndicate.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 0a40901059f..0ec9e614110 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -42,7 +42,7 @@ ..() /obj/machinery/computer/shuttle/sst - name = "Syndicate Strike Time Shuttle Console" + name = "Syndicate Strike Team Shuttle Console" desc = "Used to call and send the SST shuttle." icon_keyboard = "syndie_key" icon_screen = "syndishuttle" From fe0c04534f8d4287d10f11b660b611613dfc3327 Mon Sep 17 00:00:00 2001 From: Twinmold93 Date: Thu, 2 May 2019 12:59:05 -0500 Subject: [PATCH 17/45] Moved to MC Tab Moves the time stamp to the MC Tab per Fox's request. --- code/modules/mob/mob.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 14004fa4a5b..779ed6bf900 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -981,6 +981,7 @@ var/list/slot_equipment_priority = list( \ stat("CPU:", "[world.cpu]") stat("Instances:", "[num2text(world.contents.len, 10)]") GLOB.stat_entry() + stat("Server Time:", time_stamp()) stat(null) if(Master) Master.stat_entry() @@ -1001,8 +1002,6 @@ var/list/slot_equipment_priority = list( \ /mob/proc/show_stat_station_time() stat(null, "Round Time: [worldtime2text()]") stat(null, "Station Time: [station_time_timestamp()]") - if(client.holder && (client.holder.rights & R_ADMIN)) - stat(null, "Server Time: [time_stamp()]") // this function displays the shuttles ETA in the status panel if the shuttle has been called /mob/proc/show_stat_emergency_shuttle_eta() From 05cad803bbcee8c595e1b3df7115bdccc3b30b32 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Thu, 2 May 2019 22:29:46 +0200 Subject: [PATCH 18/45] Allow admin access to airlock buttons --- code/game/machinery/doors/airlock_control.dm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 5a53381ef07..3b12c6f554a 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -255,10 +255,15 @@ return ..() +/obj/machinery/access_button/attack_ghost(mob/user) + if(user.can_advanced_admin_interact()) + return attack_hand(user) + /obj/machinery/access_button/attack_hand(mob/user) add_fingerprint(usr) - if(!allowed(user)) - to_chat(user, "Access Denied") + + if(!allowed(user) && !user.can_advanced_admin_interact()) + to_chat(user, "Access denied.") else if(radio_connection) var/datum/signal/signal = new From 5c2608330c736218b17fd33ee9ae7251edbc24d0 Mon Sep 17 00:00:00 2001 From: EvadableMoxie Date: Thu, 2 May 2019 20:17:50 -0400 Subject: [PATCH 19/45] Adds Nanotrasen Hospital ship, admin shuttle templates system. --- _maps/map_files/cyberiad/cyberiad.dmm | 648 ++++---- _maps/map_files/cyberiad/z2.dmm | 289 ++-- _maps/map_files/shuttles/admin_admin.dmm | 1094 +++++++++++++ _maps/map_files/shuttles/admin_hospital.dmm | 1589 +++++++++++++++++++ code/datums/shuttles.dm | 15 + code/game/area/Space Station 13 areas.dm | 2 +- code/modules/shuttle/shuttle.dm | 23 +- 7 files changed, 3196 insertions(+), 464 deletions(-) create mode 100644 _maps/map_files/shuttles/admin_admin.dmm create mode 100644 _maps/map_files/shuttles/admin_hospital.dmm diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 15154bd85d3..7d2cc96b6fe 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -50861,7 +50861,7 @@ icon_state = "diagonalWall3" }, /area/shuttle/administration) -"bPM" = ( +"bPN" = ( /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; name = "Shuttle Hatch"; @@ -50874,25 +50874,17 @@ id = "admin"; name = "administration shuttle"; roundstart_move = "admin_away"; + timid = 1; width = 18 }, /obj/docking_port/stationary{ dir = 2; - dwidth = 8; - height = 15; + dwidth = 9; + height = 18; id = "admin_home"; name = "port bay 1"; - width = 18 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) -"bPN" = ( -/obj/machinery/door/airlock/external{ - id_tag = "s_docking_airlock"; - name = "Shuttle Hatch"; - req_access_txt = "106" + timid = 1; + width = 19 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -52067,21 +52059,6 @@ icon_state = "wall3" }, /area/shuttle/administration) -"bRH" = ( -/obj/machinery/door_control{ - id = "adminshuttleblast"; - name = "blast door control"; - pixel_x = -30; - req_access_txt = "106" - }, -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "bRI" = ( /obj/structure/plasticflaps/mining, /obj/machinery/conveyor/east{ @@ -54159,28 +54136,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel, /area/engine/gravitygenerator) -"bVk" = ( -/obj/machinery/door_control{ - id = "adminshuttleblast"; - name = "blast door control"; - pixel_x = -30; - req_access_txt = "106" - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) -"bVl" = ( -/obj/machinery/door/airlock/centcom{ - id_tag = "adminshuttle"; - name = "Workshop"; - opacity = 1; - req_access_txt = "105" - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "bVm" = ( /obj/machinery/light/spot{ tag = "icon-tube1 (WEST)"; @@ -55150,14 +55105,6 @@ icon_state = "floor4" }, /area/shuttle/administration) -"bWO" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion_l"; - tag = "icon-propulsion_l (EAST)" - }, -/turf/simulated/shuttle/plating, -/area/shuttle/administration) "bWP" = ( /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; @@ -56132,14 +56079,6 @@ icon_state = "floor4" }, /area/shuttle/administration) -"bYu" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion_r"; - tag = "icon-propulsion_r (EAST)" - }, -/turf/simulated/shuttle/plating, -/area/shuttle/administration) "bYv" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -57422,17 +57361,6 @@ "cam" = ( /turf/simulated/wall, /area/quartermaster/miningdock) -"can" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/spot{ - tag = "icon-tube1 (NORTH)"; - icon_state = "tube1"; - dir = 1 - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "cao" = ( /obj/structure/filingcabinet, /turf/simulated/floor/plasteel, @@ -58236,23 +58164,6 @@ icon_state = "floor4" }, /area/shuttle/administration) -"cby" = ( -/obj/machinery/computer/shuttle/admin, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) -"cbz" = ( -/obj/machinery/door/airlock/centcom{ - id_tag = "adminshuttle"; - name = "Bridge"; - opacity = 1; - req_access_txt = "106" - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "cbA" = ( /obj/machinery/door/poddoor/shutters{ density = 0; @@ -59505,18 +59416,9 @@ icon_state = "floor3" }, /area/shuttle/administration) -"cdq" = ( -/obj/machinery/computer/card/centcom, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "cdr" = ( -/obj/structure/table/reinforced, -/obj/machinery/door_control{ - id = "adminshuttleshutters"; - name = "remote shutter control"; - req_access_txt = "106" +/obj/machinery/computer/camera_advanced/shuttle_docker/admin{ + name = "NTV Argos shuttle navigation computer" }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -60290,17 +60192,6 @@ tag = "icon-cafeteria (NORTHEAST)" }, /area/crew_quarters/hor) -"ceT" = ( -/obj/machinery/door/airlock/centcom{ - id_tag = "adminshuttle"; - name = "Medbay"; - opacity = 1; - req_access_txt = "103" - }, -/turf/simulated/shuttle/floor{ - icon_state = "floor4" - }, -/area/shuttle/administration) "ceU" = ( /obj/structure/shuttle/engine/propulsion, /turf/simulated/shuttle/plating, @@ -96572,6 +96463,12 @@ }, /turf/simulated/floor/plating, /area/toxins/mixing) +"gQL" = ( +/obj/machinery/computer/card, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "hsy" = ( /obj/machinery/atmospherics/pipe/simple/insulated{ dir = 4 @@ -96626,6 +96523,35 @@ /area/toxins/launch{ name = "Toxins Launch Room" }) +"jnJ" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "Blast door control"; + pixel_x = -5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/machinery/door_control{ + id = "adminshuttleshutters"; + name = "Shutter control"; + pixel_x = 5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "kOE" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{ dir = 4 @@ -96639,22 +96565,90 @@ }, /turf/space, /area/space) +"oZV" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Medbay"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"pwN" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "pZO" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 10 }, /turf/space, /area/space) +"qgG" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "101" + }, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "qUv" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging, /turf/space, /area/space) +"rEw" = ( +/obj/machinery/computer/shuttle/admin{ + name = "NTV Argos shuttle console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"rSv" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_l"; + tag = "icon-propulsion_l (EAST)" + }, +/turf/space, +/area/shuttle/administration) +"rYq" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Bridge"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) "uxy" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 4 }, /turf/space, /area/space) +"uBM" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_r"; + tag = "icon-propulsion_r (EAST)" + }, +/turf/space, +/area/shuttle/administration) "uDK" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ tag = "icon-intact (NORTHEAST)"; @@ -96685,6 +96679,32 @@ }, /turf/space, /area/space) +"yeP" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ylx" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Workshop"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) (1,1,1) = {" aaa @@ -105049,15 +105069,15 @@ aaa aaa aaa aaa +bPL +rSv +uBM +cae aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bPL +rSv +uBM +cae aaa aaa aaa @@ -105305,18 +105325,18 @@ aaa aaa aaa aaa -aaa bPL -bWO -bYu +bPI +bWG +bWG +bPI +bPI +bPI +bWG +bWG +bPI cae aaa -bPL -bWO -bYu -cae -aaa -aaa aaa aaa aaa @@ -105561,16 +105581,17 @@ aaa aaa aaa aaa -aaa bPL bPI -bWG -bWG +bVe +bRA +bRA +caf bPI -bPI -bPI -bWG -bWG +cdl +ceR +ceR +cig bPI cae aaa @@ -105679,7 +105700,6 @@ aaa aaa aaa aaa -aaa "} (36,1,1) = {" aaa @@ -105813,22 +105833,23 @@ bCd bCd bCd bAR -aaa -aaa +bjQ aaa aaa aaa bPL -bPI -bVe +bRu +bRA +bVf bRA bRA -caf +cag bPI -cdl +cdm ceR ceR -cig +ceR +ckd bPI cae aaa @@ -105936,7 +105957,6 @@ aaa aaa aaa aaa -aaa "} (37,1,1) = {" aaa @@ -106070,25 +106090,25 @@ bCc bDG bEK bAR -bjQ +aLd aaa aaa aaa -bPL -bRu -bRA -bVf -bRA -bRA -cag bPI -cdm -ceR -ceR -ceR -ckd +bRv +bRA +bVg +cuH +bRA +cah +bPI +cdp +ceR +ceR +ceR +ceR +clC bPI -cae aaa aaa aaa @@ -106327,24 +106347,24 @@ aAi bCb bCl bAR -aLd +aSd aaa aaa aaa bPI -bRv +bRw bRA -bVg +bVh cuH bRA -cah +cai bPI -cdp +cdl ceR +cgw +cih ceR -ceR -ceR -clC +clD bPI aaa aaa @@ -106589,19 +106609,19 @@ aaa aaa aaa bPI -bRw -bRA -bVh +bRx +bTl +bVi cuH bRA -cai +bRA bPI -cdl +cdo ceR -cgw -cih -ceR -clD +cgx +cii +ckf +clE bPI aaa aaa @@ -106842,23 +106862,23 @@ bCb bEL bAR aSd -aaa -aaa -aaa +aSd +aSd +aSd bPI -bRx -bTl -bVi -cuH -bRA -bRA -bPI -cdo -ceR -cgx -cii -ckf -clE +bRG +bRG +bRG +bRG +bYt +bRG +bRG +bRG +oZV +bRG +bRG +bRG +bRG bPI aaa aaa @@ -107099,23 +107119,23 @@ bCb bEL bAR aSd -aSd -aSd -aSd -bPI -bRG -bRG -bRG -bRG -bYt -bRG -bRG -bRG -ceT -bRG -bRG -bRG -bRG +bGm +bLY +bKp +qgG +yeP +bTn +pwN +bRA +bRA +bRA +bTo +bRA +bRA +bRA +bRA +bRA +bRA bPI aaa aaa @@ -107356,23 +107376,23 @@ bCb bEL bAR aSd -bGm -bLY +bGl +bLX bKp bPN -bRH +bRA bTn -bVk -bRA -bRA -bRA -bTo bRA bRA bRA bRA bRA bRA +bRA +bRA +bRA +bRA +clF bPI aaa aaa @@ -107613,23 +107633,23 @@ bCb bEL bAR aSd -bGl -bLX bKp -bPM -bRA -bTn -bRA -bRA -bRA -bRA -bRA -bRA -bRA -bRA -bRA -bRA -clF +bKp +bOb +bPI +bRG +bRG +ylx +bRG +bRG +bRG +rYq +bRG +bRG +bRG +cik +bRG +bRG bPI aaa aaa @@ -107870,23 +107890,23 @@ bCb bAR bER aSd -bKp -bKp -bOb +aMd +bLZ +aSd bPI -bRG -bRG -bVl -bRG -bRG -bRG -cbz -bRG -bRG -bRG -cik -bRG -bRG +bRB +bTo +bRA +bWI +bPI +gQL +bRA +bRA +bPI +bRA +bRA +ckg +clG bPI aaa aaa @@ -108131,19 +108151,19 @@ aMd bLZ aSd bPI -bRB -bTo +bRC bRA -bWI +bRA +bWJ +bPI +jnJ +cbx +cbx bPI bRA bRA bRA -bPI -bRA -bRA -ckg -clG +clI bPI aaa aaa @@ -108388,19 +108408,19 @@ aMd bLZ aSd bPI -bRC +bRD bRA bRA -bWJ +bWK bPI -can -cbx +cak +rEw cdr bPI bRA bRA bRA -clI +bRA bPI aaa aaa @@ -108644,21 +108664,21 @@ aSd aMd bMa bjQ +bPR bPI -bRD -bRA -bRA -bWK -bPI -cak -cby -cdq -bPI -bRA -bRA +bTp bRA bRA bPI +car +cbA +cds +bPI +cgz +cio +ckj +bPI +bYv aaa aaa aaa @@ -108901,21 +108921,21 @@ bLs bmS bMb aLd -bPR +aaa +bPI +bWL +bRA +bWM +bPI +aaa +aaa +aaa bPI -bTp bRA bRA +ckh bPI -car -cbA -cds -bPI -cgz -cio -ckj -bPI -bYv +aaa aaa aaa aaa @@ -109159,19 +109179,19 @@ aSf bLZ aSd aaa +bPR bPI -bWL -bRA -bWM +bTl +bWN bPI aaa aaa aaa bPI -bRA -bRA -ckh +cgA +cil bPI +bYv aaa aaa aaa @@ -109416,22 +109436,22 @@ aSf bMc aSd aaa +aaa bPR -bPI -bTl -bWN -bPI -aaa -aaa -aaa -bPI -cgA -cil -bPI +bRG +bRG bYv aaa aaa aaa +bPR +bRG +bRG +bYv +aaa +aaa +aaa +aaa aaa aaa aaa @@ -109674,17 +109694,17 @@ bCf bCf aaa aaa -bPR -bRG -bRG -bYv aaa aaa aaa -bPR -bRG -bRG -bYv +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index ee6ca15f83d..190f9ef72ee 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -8030,11 +8030,12 @@ "tH" = ( /obj/docking_port/stationary{ dir = 2; - dwidth = 8; - height = 15; + dwidth = 9; + height = 18; id = "admin_away"; name = "centcom bay 1"; - width = 18 + timid = 1; + width = 19 }, /turf/space, /area/space) @@ -35340,9 +35341,9 @@ wK wK wK wK -aN -aN -aN +wK +wK +wK aN aN aN @@ -35581,21 +35582,24 @@ aN aN cp cj -yt -yt -yt -cr aN aN -cr -yt -cr aN aN -cr -yt -yt -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -35638,9 +35642,6 @@ aN aN aN aN -aN -aN -aN jZ kz kM @@ -35838,9 +35839,6 @@ aN aN cp cj -yt -yt -cr aN aN aN @@ -35850,9 +35848,15 @@ aN aN aN aN -cr -yt -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -35918,9 +35922,6 @@ aN aN aN aN -aN -aN -aN "} (91,1,1) = {" aN @@ -36095,8 +36096,6 @@ aN aN cp cj -yt -cr aN aN aN @@ -36108,8 +36107,13 @@ aN aN aN aN -cr -yt +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -36152,9 +36156,6 @@ aN aN aN aN -aN -aN -aN jU kw kE @@ -36352,7 +36353,6 @@ aN aN cp cj -cr aN aN aN @@ -36366,7 +36366,11 @@ aN aN aN aN -cr +aN +aN +aN +aN +aN wK aN aN @@ -36408,9 +36412,6 @@ aN aN aN aN -aN -aN -aN jQ jW kD @@ -36624,6 +36625,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -36665,9 +36669,6 @@ aN aN aN aN -aN -aN -aN jP kt kx @@ -36881,6 +36882,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -36922,9 +36926,6 @@ aN aN aN aN -aN -aN -aN jS kv kx @@ -37138,6 +37139,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37179,9 +37183,6 @@ aN aN aN aN -aN -aN -aN jR ku kx @@ -37395,6 +37396,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37436,9 +37440,6 @@ aN aN aN aN -aN -aN -aN jT ka kA @@ -37652,6 +37653,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37694,9 +37698,6 @@ aN aN aN aN -aN -aN -aN jZ kz kM @@ -37909,6 +37910,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -37974,9 +37978,6 @@ aN aN aN aN -aN -aN -aN "} (99,1,1) = {" aN @@ -38166,6 +38167,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38231,9 +38235,6 @@ aN aN aN aN -aN -aN -aN "} (100,1,1) = {" aN @@ -38423,6 +38424,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38488,9 +38492,6 @@ aN aN aN aN -aN -aN -aN "} (101,1,1) = {" aN @@ -38680,6 +38681,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38713,9 +38717,6 @@ aN aN aN aN -aN -aN -aN mr mr mr @@ -38937,6 +38938,9 @@ aN aN aN aN +aN +aN +aN wK aN aN @@ -38970,9 +38974,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39179,7 +39180,6 @@ qo qs tx wK -cr aN aN aN @@ -39193,7 +39193,11 @@ aN aN aN aN -cr +aN +aN +aN +aN +aN wK aN aN @@ -39227,9 +39231,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39436,21 +39437,24 @@ qo qs tA wK -yt aN aN aN aN aN -yt -yt -yt aN aN aN aN aN -yt +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -39484,9 +39488,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39693,21 +39694,24 @@ tq tv tz wK -yt -cr aN aN aN aN -yt -yt -yt aN aN aN aN -cr -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -39741,9 +39745,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -39950,21 +39951,24 @@ wK wK wK wK -yt -yt -cr aN aN -cr -yt -yt -yt -cr aN aN -cr -yt -yt +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN wK aN aN @@ -39998,9 +40002,6 @@ aN aN aN aN -aN -aN -aN mr aN aN @@ -40207,22 +40208,6 @@ aN aN aN wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK -wK aN aN aN @@ -40241,6 +40226,22 @@ aN aN aN aN +wK +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN aN aN aN @@ -40463,26 +40464,26 @@ aN aN aN aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN -aN +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK +wK aN aN aN diff --git a/_maps/map_files/shuttles/admin_admin.dmm b/_maps/map_files/shuttles/admin_admin.dmm new file mode 100644 index 00000000000..36badb71d1b --- /dev/null +++ b/_maps/map_files/shuttles/admin_admin.dmm @@ -0,0 +1,1094 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/space, +/area/space) +"ab" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + dir = 8; + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"ac" = ( +/turf/simulated/shuttle/wall{ + icon_state = "wall3" + }, +/area/shuttle/administration) +"ad" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "101" + }, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ae" = ( +/obj/machinery/door/airlock/external{ + id_tag = "s_docking_airlock"; + name = "Shuttle Hatch"; + req_access_txt = "101" + }, +/obj/docking_port/mobile{ + dir = 2; + dwidth = 8; + height = 15; + id = "admin"; + name = "admin"; + roundstart_move = null; + timid = 1; + width = 18 + }, +/obj/structure/fans/tiny, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"af" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + dir = 1; + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"ag" = ( +/obj/machinery/vending/boozeomat, +/turf/simulated/shuttle/wall{ + icon_state = "wall3" + }, +/area/shuttle/administration) +"ah" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/beer, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ai" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/drinkingglasses, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aj" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/soda, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ak" = ( +/turf/simulated/shuttle/wall{ + dir = 4; + icon_state = "wall3" + }, +/area/shuttle/administration) +"al" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"am" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"an" = ( +/obj/machinery/cell_charger, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ao" = ( +/obj/item/storage/toolbox/mechanical, +/obj/item/multitool, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ap" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aq" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ar" = ( +/obj/machinery/door/poddoor/preopen{ + id_tag = "adminshuttleblast"; + name = "Blast Doors"; + req_access_txt = "101" + }, +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "General Access"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"as" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"at" = ( +/obj/item/stack/sheet/metal, +/obj/structure/table, +/obj/item/stack/sheet/glass{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"au" = ( +/obj/machinery/mecha_part_fabricator/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"av" = ( +/obj/machinery/kitchen_machine/microwave/upgraded, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aw" = ( +/obj/machinery/door/window/northright{ + name = "bar" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ax" = ( +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"ay" = ( +/obj/item/ashtray/glass, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"az" = ( +/obj/item/storage/fancy/cigarettes/dromedaryco, +/obj/item/lighter/zippo{ + pixel_x = 5 + }, +/obj/structure/table, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aA" = ( +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "blast door control"; + pixel_x = -30; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aB" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Workshop"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aC" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_l"; + tag = "icon-propulsion_l (EAST)" + }, +/turf/space, +/area/shuttle/administration) +"aD" = ( +/obj/structure/shuttle/engine/heater{ + tag = "icon-heater (WEST)"; + icon_state = "heater"; + dir = 8 + }, +/obj/structure/window/plasmareinforced{ + color = "#FF0000"; + dir = 4 + }, +/turf/simulated/shuttle/wall{ + icon_state = "wall3" + }, +/area/shuttle/administration) +"aE" = ( +/obj/structure/chair/stool/bar, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aF" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aG" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aH" = ( +/obj/machinery/recharge_station/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aI" = ( +/obj/machinery/autolathe/upgraded{ + hacked = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aJ" = ( +/obj/structure/dispenser, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aK" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_r"; + tag = "icon-propulsion_r (EAST)" + }, +/turf/space, +/area/shuttle/administration) +"aL" = ( +/obj/machinery/door/airlock/public/glass, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aM" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + dir = 4; + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"aN" = ( +/turf/space, +/turf/simulated/shuttle/wall{ + icon_state = "diagonalWall3" + }, +/area/shuttle/administration) +"aO" = ( +/obj/machinery/vending/snack, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aP" = ( +/obj/machinery/vending/cola, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aQ" = ( +/obj/machinery/vending/coffee, +/obj/machinery/light/spot, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aR" = ( +/obj/machinery/vending/cigarette, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aS" = ( +/obj/machinery/computer/card, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aT" = ( +/obj/machinery/computer/communications, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aU" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "adminshuttleshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_end (WEST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 8 + }, +/turf/simulated/floor/plating, +/area/shuttle/administration) +"aV" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/machinery/door_control{ + id = "adminshuttleblast"; + name = "Blast door control"; + pixel_x = -5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/machinery/door_control{ + id = "adminshuttleshutters"; + name = "Shutter control"; + pixel_x = 5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aW" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aX" = ( +/obj/machinery/computer/shuttle/admin{ + name = "NTV Argos shuttle console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"aY" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "adminshuttleshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + dir = 4; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + tag = "icon-window5 (EAST)" + }, +/turf/simulated/floor/plating, +/area/shuttle/administration) +"aZ" = ( +/obj/machinery/dna_scannernew/upgraded, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ba" = ( +/obj/machinery/computer/cloning, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bb" = ( +/obj/machinery/clonepod/upgraded, +/obj/machinery/light/spot{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bc" = ( +/obj/machinery/computer/scan_consolenew, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bd" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Bridge"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"be" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/admin{ + name = "NTV Argos shuttle navigation computer" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bf" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 4; + icon_state = "open"; + id_tag = "adminshuttleshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_end (EAST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 4 + }, +/turf/simulated/floor/plating, +/area/shuttle/administration) +"bg" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bh" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Medbay"; + opacity = 1; + req_access_txt = "101" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bi" = ( +/obj/machinery/bodyscanner, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bj" = ( +/obj/machinery/body_scanconsole, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bk" = ( +/obj/structure/window/plasmareinforced{ + color = "#FF0000"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bl" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bm" = ( +/obj/machinery/sleeper/upgraded{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bn" = ( +/obj/machinery/chem_master, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bo" = ( +/obj/machinery/chem_dispenser, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bp" = ( +/obj/machinery/door/airlock/centcom{ + id_tag = "adminshuttle"; + name = "Holding Cell"; + opacity = 1; + req_access_txt = "104" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bq" = ( +/obj/machinery/door/window/brigdoor/westleft{ + color = "#d70000"; + req_access_txt = "104" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"br" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bs" = ( +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bt" = ( +/obj/machinery/light/spot{ + tag = "icon-tube1 (EAST)"; + icon_state = "tube1"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bu" = ( +/obj/structure/table, +/obj/item/storage/box/handcuffs, +/obj/machinery/light/spot{ + tag = "icon-tube1 (WEST)"; + icon_state = "tube1"; + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bv" = ( +/obj/structure/window/plasmareinforced{ + color = "#FF0000"; + dir = 8 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bw" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bx" = ( +/obj/structure/table, +/obj/item/bonegel, +/obj/item/bonesetter, +/obj/item/hemostat, +/obj/item/cautery, +/obj/item/surgicaldrill, +/obj/item/circular_saw, +/obj/item/scalpel, +/obj/item/retractor, +/obj/item/FixOVein, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"by" = ( +/obj/machinery/optable, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bz" = ( +/obj/machinery/vending/medical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bA" = ( +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bB" = ( +/obj/structure/table, +/obj/item/storage/lockbox/mindshield, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) +"bC" = ( +/obj/structure/table, +/obj/item/storage/box/chemimp{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/storage/box/trackimp, +/turf/simulated/shuttle/floor{ + icon_state = "floor4" + }, +/area/shuttle/administration) + +(1,1,1) = {" +aa +aa +aa +ab +aC +aK +aN +aa +ab +aC +aK +aN +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +ab +ac +aD +aD +ac +ac +ac +aD +aD +ac +aN +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +ab +ac +av +am +am +aO +ac +aZ +bg +bg +bm +ac +aN +aa +aa +aa +aa +"} +(4,1,1) = {" +ab +ag +am +aw +am +am +aP +ac +ba +bg +bg +bg +bs +ac +aN +aa +aa +aa +"} +(5,1,1) = {" +ac +ah +am +ax +aE +am +aQ +ac +bb +bg +bg +bg +bg +bx +ac +aa +aa +aa +"} +(6,1,1) = {" +ac +ai +am +ay +aE +am +aR +ac +aZ +bg +bi +bn +bg +by +ac +aa +aa +aa +"} +(7,1,1) = {" +ac +aj +aq +az +aE +am +am +ac +bc +bg +bj +bo +bt +bz +ac +aa +aa +aa +"} +(8,1,1) = {" +ac +ak +ak +ak +ak +aL +ak +ak +ak +bh +ak +ak +ak +ak +ac +aa +aa +aa +"} +(9,1,1) = {" +ad +al +ar +aA +am +am +am +as +am +am +am +am +am +am +ac +aa +aa +aa +"} +(10,1,1) = {" +ae +am +ar +am +am +am +am +am +am +am +am +am +am +bA +ac +aa +aa +aa +"} +(11,1,1) = {" +ac +ak +ak +aB +ak +ak +ak +bd +ak +ak +ak +bp +ak +ak +ac +aa +aa +aa +"} +(12,1,1) = {" +ac +an +as +am +aF +ac +aS +am +am +ac +am +am +bu +bB +ac +aa +aa +aa +"} +(13,1,1) = {" +ac +ao +am +am +aG +ac +aV +aW +aW +ac +am +am +am +bC +ac +aa +aa +aa +"} +(14,1,1) = {" +ac +ap +am +am +aH +ac +aT +aX +be +ac +am +am +am +am +ac +aa +aa +aa +"} +(15,1,1) = {" +af +ac +at +am +am +ac +aU +aY +bf +ac +bk +bq +bv +ac +aM +aa +aa +aa +"} +(16,1,1) = {" +aa +ac +au +am +aI +ac +aa +aa +aa +ac +am +am +bw +ac +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +af +ac +aq +aJ +ac +aa +aa +aa +ac +bl +br +ac +aM +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +af +ak +ak +aM +aa +aa +aa +af +ak +ak +aM +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/map_files/shuttles/admin_hospital.dmm b/_maps/map_files/shuttles/admin_hospital.dmm new file mode 100644 index 00000000000..2c2d31a0bb4 --- /dev/null +++ b/_maps/map_files/shuttles/admin_hospital.dmm @@ -0,0 +1,1589 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/space, +/area/space) +"ab" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s6"; + dir = 2 + }, +/area/shuttle/administration) +"ac" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/administration) +"ad" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 2 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"ae" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_mid"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + dir = 2 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"af" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (NORTH)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 1 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"ag" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall14"; + dir = 2 + }, +/area/shuttle/administration) +"ah" = ( +/obj/structure/sign/redcross{ + desc = "The Star of Life, a symbol of Medical Aid."; + icon_state = "lifestar"; + name = "NHV Asclepius" + }, +/turf/simulated/shuttle/wall{ + dir = 2; + icon_state = "swall8"; + tag = "icon-swall12" + }, +/area/shuttle/administration) +"ai" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "asclblast"; + name = "Blast Door"; + opacity = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aj" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external, +/obj/docking_port/mobile{ + dir = 2; + dwidth = 9; + height = 18; + id = "admin"; + name = "hospital"; + roundstart_move = "cc_bay_1"; + timid = 1; + width = 19 + }, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "asclblast"; + name = "Blast Door"; + opacity = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ak" = ( +/obj/structure/sign/redcross{ + desc = "The Star of Life, a symbol of Medical Aid."; + icon_state = "lifestar"; + name = "NHV Asclepius" + }, +/turf/simulated/shuttle/wall{ + tag = "icon-swall14"; + icon_state = "swall4"; + dir = 2 + }, +/area/shuttle/administration) +"al" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_mid"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + dir = 2 + }, +/turf/space, +/area/shuttle/administration) +"am" = ( +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 1; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/obj/structure/shuttle/window{ + tag = "icon-window5_end (NORTH)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 1 + }, +/turf/space, +/area/shuttle/administration) +"an" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s10"; + dir = 2 + }, +/area/shuttle/administration) +"ao" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall3"; + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"ap" = ( +/obj/machinery/chem_master, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aq" = ( +/obj/machinery/chem_dispenser, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ar" = ( +/obj/machinery/chem_heater, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"as" = ( +/obj/structure/closet/secure_closet/reagents, +/obj/item/storage/bag/chemistry, +/obj/item/storage/bag/chemistry, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"at" = ( +/obj/structure/closet/secure_closet/chemical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"au" = ( +/obj/structure/sign/chemistry{ + pixel_y = 1 + }, +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"av" = ( +/obj/structure/chair{ + tag = "icon-chair (EAST)"; + icon_state = "chair"; + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aw" = ( +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ax" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/camera{ + dir = 8; + icon_state = "camera"; + name = "NHV Asclepius Lobby"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ay" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"az" = ( +/obj/machinery/clonepod{ + biomass = 300 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aA" = ( +/obj/machinery/computer/cloning, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aB" = ( +/obj/machinery/dna_scannernew, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aC" = ( +/obj/machinery/atmospherics/unary/cryo_cell, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aD" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall7"; + dir = 2 + }, +/area/shuttle/administration) +"aE" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"aF" = ( +/obj/structure/reagent_dispensers/fueltank/chem{ + pixel_x = -32 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aG" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aH" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/westleft{ + req_access_txt = "33" + }, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aI" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aJ" = ( +/obj/structure/sign/nosmoking_2, +/turf/simulated/shuttle/wall{ + tag = "icon-swall1"; + icon_state = "swall1"; + dir = 2 + }, +/area/shuttle/administration) +"aK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aL" = ( +/obj/structure/shuttle/engine/heater{ + icon_state = "heater"; + dir = 4 + }, +/obj/structure/window/plasmareinforced{ + dir = 8 + }, +/turf/unsimulated/floor, +/area/shuttle/administration) +"aM" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4; + icon_state = "propulsion" + }, +/turf/space, +/area/shuttle/administration) +"aN" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/spray/cleaner{ + desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'"; + name = "Chemistry Cleaner" + }, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/obj/item/reagent_containers/glass/bucket, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aO" = ( +/obj/structure/closet/crate/can, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aP" = ( +/obj/structure/shuttle/window, +/obj/structure/grille, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aQ" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aR" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aS" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/syringes, +/obj/item/storage/box/beakers, +/obj/machinery/reagentgrinder, +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius Chemistry"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aT" = ( +/obj/machinery/door/airlock/shuttle/glass{ + name = "Chemistry"; + req_access_txt = "33" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aU" = ( +/obj/machinery/door/airlock/shuttle/glass, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aV" = ( +/obj/machinery/camera{ + dir = 8; + icon_state = "camera"; + name = "NHV Asclepius Cloning"; + network = list("NHV Asclepius") + }, +/obj/machinery/atmospherics/pipe/simple/hidden, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aW" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s9"; + dir = 2 + }, +/area/shuttle/administration) +"aX" = ( +/obj/machinery/iv_drip, +/obj/item/reagent_containers/iv_bag, +/obj/structure/reagent_dispensers/fueltank/chem{ + pixel_x = -32 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aY" = ( +/obj/structure/chair/office/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"aZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 6 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ba" = ( +/obj/machinery/chem_heater, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bb" = ( +/obj/machinery/status_display, +/turf/simulated/shuttle/wall{ + icon_state = "swall3"; + dir = 2 + }, +/area/shuttle/administration) +"bc" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bd" = ( +/obj/machinery/vending/coffee, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"be" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/storage/box/gloves, +/obj/item/storage/box/masks, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bf" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bg" = ( +/obj/structure/table/reinforced, +/obj/item/storage/firstaid, +/obj/item/storage/firstaid, +/obj/item/storage/firstaid/adv, +/obj/item/storage/firstaid/adv, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bh" = ( +/obj/structure/table/reinforced, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bi" = ( +/obj/machinery/atmospherics/unary/cold_sink/freezer{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bj" = ( +/obj/machinery/smartfridge/medbay, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bk" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall13"; + icon_state = "swall13"; + dir = 2 + }, +/area/shuttle/administration) +"bl" = ( +/obj/structure/shuttle/window, +/obj/structure/grille, +/turf/simulated/shuttle/wall{ + dir = 2; + icon_state = "swall8"; + tag = "icon-swall12" + }, +/area/shuttle/administration) +"bm" = ( +/obj/structure/shuttle/window, +/obj/structure/grille, +/turf/simulated/shuttle/wall{ + tag = "icon-swall14"; + icon_state = "swall4"; + dir = 2 + }, +/area/shuttle/administration) +"bn" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall15"; + icon_state = "swall15"; + dir = 2 + }, +/area/shuttle/administration) +"bo" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (WEST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 8 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 8; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"bp" = ( +/obj/machinery/computer/pandemic, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bq" = ( +/obj/machinery/camera{ + c_tag = "Tech Storage"; + dir = 2; + name = "NHV Asclepius Command Center"; + network = list("NHV Asclepius") + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/door_control{ + dir = 4; + id = "Asclshutters"; + name = "remote shutter control"; + pixel_x = -5; + pixel_y = 35; + req_access = list(101); + req_access_txt = "0" + }, +/obj/machinery/keycard_auth{ + pixel_y = 24 + }, +/obj/machinery/door_control{ + dir = 2; + id = "asclblast"; + name = "blast door control"; + pixel_x = 5; + pixel_y = 35; + pixel_z = 0; + req_access = list(101); + req_access_txt = "0" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"br" = ( +/obj/machinery/recharger/wallcharger{ + pixel_y = 25 + }, +/obj/machinery/recharger/wallcharger{ + pixel_y = 35 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bs" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall1"; + icon_state = "swall1"; + dir = 2 + }, +/area/shuttle/administration) +"bt" = ( +/obj/structure/sink{ + icon_state = "sink"; + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bu" = ( +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/structure/closet/walllocker/emerglocker{ + pixel_y = 32 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bv" = ( +/obj/machinery/vending/medical, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bw" = ( +/obj/structure/table/tray, +/obj/item/stack/medical/bruise_pack/advanced, +/obj/item/scalpel, +/obj/item/hemostat, +/obj/item/retractor, +/obj/item/circular_saw, +/obj/item/bonegel, +/obj/item/bonesetter, +/obj/item/cautery, +/obj/item/FixOVein, +/obj/item/surgicaldrill, +/obj/item/storage/backpack/duffel/medical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bx" = ( +/obj/machinery/optable, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"by" = ( +/obj/machinery/computer/operating, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bz" = ( +/obj/structure/closet/secure_closet/medical3, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bA" = ( +/obj/structure/closet/secure_closet/medical2, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bB" = ( +/obj/structure/shuttle/window{ + dir = 4; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_mid"; + tag = "icon-window5 (EAST)" + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 8; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"bC" = ( +/obj/machinery/computer/shuttle/admin{ + name = "NHV Asclepius shuttle console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bD" = ( +/obj/machinery/door/airlock/command{ + name = "Command Center"; + req_access = null; + req_access_txt = "19" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bE" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bF" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall1"; + dir = 2 + }, +/area/shuttle/administration) +"bG" = ( +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius OR 1"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bH" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/admin{ + name = "NHV Asclepius navigation computer" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bI" = ( +/obj/machinery/door/airlock/shuttle/glass{ + name = "Operating Room"; + req_access = null; + req_access_txt = "45" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bJ" = ( +/obj/structure/sink{ + dir = 4; + icon_state = "sink"; + pixel_x = 11; + pixel_y = 0 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bK" = ( +/obj/structure/shuttle/window{ + tag = "icon-window5_end (EAST)"; + icon = 'icons/turf/shuttle.dmi'; + icon_state = "window5_end"; + dir = 4 + }, +/obj/machinery/door/poddoor/shutters{ + density = 0; + dir = 8; + icon_state = "open"; + id_tag = "Asclshutters"; + name = "Blast Shutters"; + opacity = 0 + }, +/obj/structure/grille, +/turf/space, +/area/shuttle/administration) +"bL" = ( +/obj/machinery/computer/communications{ + name = "NHV Asclepius Communications Console" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bM" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bN" = ( +/turf/simulated/shuttle/wall{ + tag = "icon-swall2"; + icon_state = "swall2"; + dir = 2 + }, +/area/shuttle/administration) +"bO" = ( +/obj/machinery/sleeper, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bP" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bQ" = ( +/obj/structure/bed{ + name = "Triage: High Priority" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bR" = ( +/obj/machinery/bodyscanner, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bS" = ( +/obj/machinery/body_scanconsole, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bT" = ( +/obj/machinery/light, +/obj/structure/closet/crate/can, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bU" = ( +/obj/item/reagent_containers/spray/cleaner{ + desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; + name = "Surgery Cleaner" + }, +/obj/structure/table/glass, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bV" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/item/reagent_containers/iv_bag/blood/OMinus, +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"bW" = ( +/obj/machinery/status_display, +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/administration) +"bX" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall13"; + dir = 2 + }, +/area/shuttle/administration) +"bY" = ( +/obj/structure/sign/examroom, +/turf/simulated/shuttle/wall{ + icon_state = "swall12"; + dir = 2 + }, +/area/shuttle/administration) +"bZ" = ( +/obj/machinery/defibrillator_mount/loaded, +/turf/simulated/shuttle/wall{ + dir = 2; + icon_state = "swall8"; + tag = "icon-swall12" + }, +/area/shuttle/administration) +"ca" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/camera{ + dir = 5; + icon_state = "camera"; + name = "NHV Asclepius Central"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cb" = ( +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/obj/structure/bed{ + name = "Triage: High Priority" + }, +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cc" = ( +/obj/structure/sign/nosmoking_2, +/turf/simulated/shuttle/wall{ + icon_state = "swall7"; + dir = 2 + }, +/area/shuttle/administration) +"cd" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall11"; + dir = 2 + }, +/area/shuttle/administration) +"ce" = ( +/obj/machinery/portable_atmospherics/canister/oxygen{ + name = "Canister: \[O2] (CRYO)" + }, +/obj/machinery/atmospherics/unary/portables_connector{ + dir = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cf" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cg" = ( +/obj/machinery/portable_atmospherics/canister/oxygen{ + name = "Canister: \[O2] (CRYO)" + }, +/obj/machinery/light{ + tag = "icon-tube1 (NORTH)"; + icon_state = "tube1"; + dir = 1 + }, +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius Cryo"; + network = list("NHV Asclepius") + }, +/obj/machinery/atmospherics/unary/portables_connector, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ch" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/spray/cleaner{ + desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; + name = "Surgery Cleaner" + }, +/obj/machinery/cell_charger, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ci" = ( +/obj/structure/bed{ + name = "Triage: High Priority" + }, +/obj/machinery/iv_drip, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cj" = ( +/obj/machinery/atmospherics/unary/cold_sink/freezer, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ck" = ( +/obj/machinery/camera{ + dir = 4; + icon_state = "camera"; + name = "NHV Asclepius OR 2"; + network = list("NHV Asclepius") + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cl" = ( +/obj/structure/closet/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/suit/radiation, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cm" = ( +/obj/structure/closet/l3closet, +/obj/item/clothing/head/bio_hood, +/obj/item/clothing/head/bio_hood, +/obj/item/clothing/head/bio_hood, +/obj/item/clothing/suit/bio_suit, +/obj/item/clothing/suit/bio_suit, +/obj/item/clothing/suit/bio_suit, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cn" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/item/clothing/head/beret/med, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"co" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cp" = ( +/obj/machinery/suit_storage_unit/cmo/secure/sec_storage, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cq" = ( +/obj/machinery/light, +/obj/machinery/suit_storage_unit/cmo/secure/sec_storage, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cr" = ( +/obj/structure/dispenser/oxygen, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cs" = ( +/obj/machinery/vending/medical, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"ct" = ( +/turf/simulated/shuttle/wall{ + icon_state = "swall_s5"; + dir = 2 + }, +/area/shuttle/administration) +"cu" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 5; + icon_state = "intact" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cv" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4; + level = 1 + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) +"cx" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 9; + icon_state = "intact" + }, +/turf/simulated/shuttle/floor{ + icon_state = "floor3" + }, +/area/shuttle/administration) + +(1,1,1) = {" +ab +ao +aE +aE +aE +aE +aE +aD +bo +bB +bB +bK +aD +aE +aE +aE +aE +ct +"} +(2,1,1) = {" +ac +ap +aF +aN +aS +aX +ap +ac +bp +bC +bH +bL +ac +cg +cu +aw +cl +ac +"} +(3,1,1) = {" +ad +aq +aG +aw +aw +aY +aq +ac +bq +aR +aR +bM +ac +aC +cv +aw +cm +ad +"} +(4,1,1) = {" +ae +ar +aw +aw +aw +aw +ba +ac +br +aw +aw +aw +bW +cf +cw +aw +cn +ae +"} +(5,1,1) = {" +af +as +aw +aw +aw +aw +aw +ag +bs +bD +aP +bN +bX +aC +cv +aw +co +af +"} +(6,1,1) = {" +ac +at +aw +aO +aw +aw +aw +bj +bt +aw +aw +bO +bY +cj +cx +aw +cp +ac +"} +(7,1,1) = {" +ag +au +aH +aP +aT +aP +bb +bk +bu +aw +aw +bP +bZ +ch +aw +aw +cq +ac +"} +(8,1,1) = {" +ah +av +aw +aQ +aw +aQ +bc +bl +aw +aw +aw +aw +ca +aw +aw +aw +cr +ac +"} +(9,1,1) = {" +ai +aw +aw +aw +aw +aw +aw +aU +aw +aw +aw +aw +aw +aw +aw +aw +bR +ac +"} +(10,1,1) = {" +aj +aw +aw +aw +aw +aw +aw +aU +aw +aw +aw +aw +aw +aw +aw +aw +bS +ac +"} +(11,1,1) = {" +ak +ax +aI +aR +aw +aR +bd +bm +bv +bE +aw +bQ +cb +ci +bQ +aw +cs +ac +"} +(12,1,1) = {" +ag +ao +aJ +aP +aU +aP +bb +bn +aP +bF +bI +bN +cc +aP +bF +bI +bN +bX +"} +(13,1,1) = {" +ac +ay +aw +aw +aw +aw +be +ac +bw +bG +aw +bR +ac +bw +ck +aw +bR +ac +"} +(14,1,1) = {" +ad +az +aw +aw +aw +aw +bg +ac +bx +aw +aw +bS +ac +bx +aw +aw +bS +ad +"} +(15,1,1) = {" +al +aA +aw +aw +aw +aw +bh +ac +by +aw +aw +bT +ac +by +aw +aw +bT +ae +"} +(16,1,1) = {" +am +aB +aw +aw +aw +aZ +bi +ac +bz +aw +aw +bU +ac +bz +aw +aw +bU +af +"} +(17,1,1) = {" +ac +aC +aK +aK +aV +bf +ce +ac +bA +aw +bJ +bV +ac +bA +aw +bJ +bV +ac +"} +(18,1,1) = {" +an +aD +aL +aL +aD +aE +aE +bn +aL +aL +aD +aE +cd +aD +aL +aL +aD +aW +"} +(19,1,1) = {" +aa +an +aM +aM +aW +aa +aa +an +aM +aM +aW +aa +aa +an +aM +aM +aW +aa +"} diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index d20255bc57c..53517d5dbc9 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -25,6 +25,11 @@ port_id = "ferry" name = "Base Shuttle Template (Ferry)" +/datum/map_template/shuttle/admin + port_id = "admin" + name = "Base Shuttle Template (Admin)" + + // Shuttles start here: @@ -117,3 +122,13 @@ definitely no zombifyin' reagents!" admin_notes = "Meat currently contains no zombifying reagents, people on \ meatspike must be spawned in." + +/datum/map_template/shuttle/admin/hospital + suffix = "hospital" + name = "NHV Asclepius" + description = "Nanostrasen Hospital ship, for medical assistance during disasters." + +/datum/map_template/shuttle/admin/admin + suffix = "admin" + name = "NTV Argos" + description = "Default Admin ship. An older ship used for special operations." diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index dcf5223e29c..5d508685e5b 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -335,7 +335,7 @@ var/list/ghostteleportlocs = list() icon_state = "shuttle" /area/shuttle/administration - name = "\improper Administration Shuttle" + name = "\improper Nanotrasen Vessel" icon_state = "shuttlered" /area/shuttle/administration/centcom diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 06e0c2336f0..f3c0249941b 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -714,8 +714,6 @@ possible_destinations = C.possible_destinations shuttleId = C.shuttleId -/obj/machinery/computer/shuttle/Initialize(mapload) - . = ..() connect() /obj/machinery/computer/shuttle/proc/connect() @@ -868,12 +866,27 @@ possible_destinations = "science_home;science_away" /obj/machinery/computer/shuttle/admin - name = "Administration Shuttle Console" - desc = "Used to call and send the administration shuttle." + name = "admin shuttle console" + req_access = list(access_cent_general) shuttleId = "admin" - possible_destinations = "admin_home;admin_away" + possible_destinations = "admin_home;admin_away;admin_custom" resistance_flags = INDESTRUCTIBLE +/obj/machinery/computer/camera_advanced/shuttle_docker/admin + name = "Admin shuttle navigation computer" + desc = "Used to designate a precise transit location for the admin shuttle." + icon_screen = "navigation" + icon_keyboard = "med_key" + shuttleId = "admin" + shuttlePortId = "admin_custom" + view_range = 14 + x_offset = 0 + y_offset = 0 + resistance_flags = INDESTRUCTIBLE + access_tcomms = TRUE + access_construction = TRUE + access_mining = TRUE + /obj/machinery/computer/shuttle/trade name = "Freighter Console" resistance_flags = INDESTRUCTIBLE From bf1eeb211f892600762f8207ad40f1d774670169 Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 2 May 2019 19:03:29 -0700 Subject: [PATCH 20/45] Fixes item_attack runtime when punching windoor --- code/_onclick/item_attack.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index bed8c64b054..5e6acad93a1 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -24,7 +24,7 @@ return FALSE /obj/attackby(obj/item/I, mob/living/user, params) - return ..() || (can_be_hit && I.attack_obj(src, user)) + return ..() || (can_be_hit && istype(I) && I.attack_obj(src, user)) /mob/living/attackby(obj/item/I, mob/living/user, params) user.changeNext_move(CLICK_CD_MELEE) From 2cf6f1aa7970e410fe13db8c0991579c94d6c861 Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 2 May 2019 19:54:11 -0700 Subject: [PATCH 21/45] fixes add_reagent runtimes for blobs --- code/modules/reagents/chemistry/reagents/blob.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/blob.dm b/code/modules/reagents/chemistry/reagents/blob.dm index 1dcd414b702..bca2cbd9067 100644 --- a/code/modules/reagents/chemistry/reagents/blob.dm +++ b/code/modules/reagents/chemistry/reagents/blob.dm @@ -56,7 +56,8 @@ volume = ..() M.apply_damage(0.6*volume, TOX) M.hallucination += 0.6*volume - M.reagents.add_reagent("spore", 0.4*volume) + if(M.reagents) + M.reagents.add_reagent("spore", 0.4*volume) /datum/reagent/blob/lexorin_jelly //does tons of oxygen damage and a little brute name = "Lexorin Jelly" @@ -102,7 +103,8 @@ volume = ..() M.apply_damage(0.4*volume, BURN) M.adjustStaminaLoss(0.4*volume) - M.reagents.add_reagent("frostoil", 0.4*volume) + if(M.reagents) + M.reagents.add_reagent("frostoil", 0.4*volume) /datum/reagent/blob/b_sorium name = "Sorium" From 5dbaa06661a547c30ff7c9154880dcbc768680a4 Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 2 May 2019 20:56:00 -0700 Subject: [PATCH 22/45] Updates changelogs Apr08->May02 --- html/changelog.html | 231 +++++++++++++++++++ html/changelogs/.all_changelog.yml | 253 +++++++++++++++++++++ html/changelogs/AutoChangeLog-pr-10327.yml | 9 - html/changelogs/AutoChangeLog-pr-11102.yml | 5 - html/changelogs/AutoChangeLog-pr-11129.yml | 4 - html/changelogs/AutoChangeLog-pr-11214.yml | 4 - html/changelogs/AutoChangeLog-pr-11217.yml | 4 - html/changelogs/AutoChangeLog-pr-11224.yml | 4 - html/changelogs/AutoChangeLog-pr-11227.yml | 7 - html/changelogs/AutoChangeLog-pr-11230.yml | 5 - html/changelogs/AutoChangeLog-pr-11231.yml | 6 - html/changelogs/AutoChangeLog-pr-11243.yml | 4 - html/changelogs/AutoChangeLog-pr-11253.yml | 5 - html/changelogs/AutoChangeLog-pr-11255.yml | 6 - html/changelogs/AutoChangeLog-pr-11257.yml | 4 - html/changelogs/AutoChangeLog-pr-11259.yml | 13 -- html/changelogs/AutoChangeLog-pr-11270.yml | 4 - html/changelogs/AutoChangeLog-pr-11277.yml | 4 - html/changelogs/AutoChangeLog-pr-11278.yml | 4 - html/changelogs/AutoChangeLog-pr-11279.yml | 4 - html/changelogs/AutoChangeLog-pr-11280.yml | 4 - html/changelogs/AutoChangeLog-pr-11282.yml | 5 - html/changelogs/AutoChangeLog-pr-11283.yml | 4 - html/changelogs/AutoChangeLog-pr-11284.yml | 6 - html/changelogs/AutoChangeLog-pr-11285.yml | 8 - html/changelogs/AutoChangeLog-pr-11287.yml | 6 - html/changelogs/AutoChangeLog-pr-11288.yml | 4 - html/changelogs/AutoChangeLog-pr-11292.yml | 5 - html/changelogs/AutoChangeLog-pr-11294.yml | 4 - html/changelogs/AutoChangeLog-pr-11296.yml | 4 - html/changelogs/AutoChangeLog-pr-11297.yml | 9 - html/changelogs/AutoChangeLog-pr-11298.yml | 5 - html/changelogs/AutoChangeLog-pr-11299.yml | 5 - html/changelogs/AutoChangeLog-pr-11300.yml | 5 - html/changelogs/AutoChangeLog-pr-11301.yml | 7 - html/changelogs/AutoChangeLog-pr-11305.yml | 4 - html/changelogs/AutoChangeLog-pr-11310.yml | 4 - html/changelogs/AutoChangeLog-pr-11312.yml | 4 - html/changelogs/AutoChangeLog-pr-11313.yml | 4 - html/changelogs/AutoChangeLog-pr-11314.yml | 4 - html/changelogs/AutoChangeLog-pr-11317.yml | 4 - html/changelogs/AutoChangeLog-pr-11318.yml | 4 - html/changelogs/AutoChangeLog-pr-11319.yml | 6 - html/changelogs/AutoChangeLog-pr-11320.yml | 4 - html/changelogs/AutoChangeLog-pr-11323.yml | 4 - html/changelogs/AutoChangeLog-pr-11328.yml | 5 - html/changelogs/AutoChangeLog-pr-11329.yml | 4 - html/changelogs/AutoChangeLog-pr-11331.yml | 4 - html/changelogs/AutoChangeLog-pr-11332.yml | 4 - html/changelogs/AutoChangeLog-pr-11333.yml | 4 - html/changelogs/AutoChangeLog-pr-11334.yml | 4 - html/changelogs/AutoChangeLog-pr-11335.yml | 4 - html/changelogs/AutoChangeLog-pr-11336.yml | 4 - html/changelogs/AutoChangeLog-pr-11338.yml | 4 - html/changelogs/AutoChangeLog-pr-11339.yml | 4 - html/changelogs/AutoChangeLog-pr-11340.yml | 4 - html/changelogs/AutoChangeLog-pr-11347.yml | 5 - html/changelogs/AutoChangeLog-pr-11348.yml | 5 - html/changelogs/AutoChangeLog-pr-11349.yml | 5 - html/changelogs/AutoChangeLog-pr-11350.yml | 5 - html/changelogs/AutoChangeLog-pr-11351.yml | 5 - html/changelogs/AutoChangeLog-pr-11353.yml | 4 - html/changelogs/AutoChangeLog-pr-11355.yml | 4 - html/changelogs/AutoChangeLog-pr-11356.yml | 4 - html/changelogs/AutoChangeLog-pr-11360.yml | 6 - html/changelogs/AutoChangeLog-pr-11361.yml | 4 - html/changelogs/AutoChangeLog-pr-11362.yml | 4 - html/changelogs/AutoChangeLog-pr-11364.yml | 4 - html/changelogs/AutoChangeLog-pr-11365.yml | 7 - html/changelogs/AutoChangeLog-pr-11367.yml | 4 - html/changelogs/AutoChangeLog-pr-11369.yml | 4 - html/changelogs/AutoChangeLog-pr-11370.yml | 4 - html/changelogs/AutoChangeLog-pr-11371.yml | 4 - html/changelogs/AutoChangeLog-pr-11372.yml | 4 - html/changelogs/AutoChangeLog-pr-11373.yml | 4 - html/changelogs/AutoChangeLog-pr-11375.yml | 4 - html/changelogs/AutoChangeLog-pr-11376.yml | 4 - html/changelogs/AutoChangeLog-pr-11377.yml | 5 - html/changelogs/AutoChangeLog-pr-11378.yml | 4 - html/changelogs/AutoChangeLog-pr-11381.yml | 4 - html/changelogs/AutoChangeLog-pr-11389.yml | 4 - html/changelogs/AutoChangeLog-pr-11390.yml | 4 - html/changelogs/AutoChangeLog-pr-11391.yml | 4 - html/changelogs/AutoChangeLog-pr-11393.yml | 6 - html/changelogs/AutoChangeLog-pr-11395.yml | 4 - html/changelogs/AutoChangeLog-pr-11396.yml | 4 - html/changelogs/AutoChangeLog-pr-11397.yml | 7 - html/changelogs/AutoChangeLog-pr-11400.yml | 6 - html/changelogs/AutoChangeLog-pr-11404.yml | 4 - html/changelogs/AutoChangeLog-pr-11405.yml | 4 - html/changelogs/AutoChangeLog-pr-11406.yml | 7 - html/changelogs/AutoChangeLog-pr-11407.yml | 4 - html/changelogs/AutoChangeLog-pr-11409.yml | 7 - html/changelogs/AutoChangeLog-pr-11413.yml | 5 - html/changelogs/AutoChangeLog-pr-11414.yml | 4 - html/changelogs/AutoChangeLog-pr-11419.yml | 4 - html/changelogs/AutoChangeLog-pr-11423.yml | 4 - html/changelogs/AutoChangeLog-pr-11424.yml | 4 - html/changelogs/__CHANGELOG_README.txt | 2 - tools/ss13_genchangelog.py | 9 +- 100 files changed, 492 insertions(+), 460 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-10327.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11102.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11129.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11214.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11217.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11224.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11227.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11230.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11231.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11243.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11253.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11255.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11257.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11259.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11270.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11277.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11278.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11279.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11280.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11282.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11283.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11284.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11285.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11287.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11288.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11292.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11294.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11296.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11297.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11298.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11299.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11300.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11301.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11305.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11310.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11312.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11313.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11314.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11317.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11318.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11319.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11320.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11323.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11328.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11329.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11331.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11332.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11333.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11334.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11335.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11336.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11338.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11339.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11340.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11347.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11348.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11349.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11350.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11351.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11353.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11355.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11356.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11360.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11361.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11362.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11364.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11365.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11367.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11369.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11370.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11371.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11372.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11373.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11375.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11376.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11377.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11378.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11381.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11389.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11390.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11391.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11393.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11395.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11396.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11397.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11400.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11404.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11405.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11406.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11407.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11409.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11413.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11414.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11419.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11423.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-11424.yml diff --git a/html/changelog.html b/html/changelog.html index 7c4262f54ce..6ce02bc19c8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,237 @@ -->

+

02 May 2019

+

AffectedArc07 updated:

+
    +
  • ssMapping
  • +
  • Gateway and space ruins are now loaded with ssMapping
  • +
  • Master Controller
  • +
  • Darkmode chat department colors match NTTC theming now
  • +
  • SSvotes
  • +
  • SSradio
  • +
  • SSevents
  • +
  • SSholiday
  • +
  • We no longer check if its Christmas every tick. Dont ask.
  • +
  • SSalarms
  • +
+

Arkatos updated:

+
    +
  • Shadowlings now have a slightly bigger colored text when speaking in the Shadowling Hivemind
  • +
  • Replaced title2.ogg music with a higher quality version
  • +
  • Shield Blobs automatically spawned around Blob Cores now give no refund upon removing. No freebies.
  • +
  • Added new Wizard Spell - Summon Ghosts! This nefarious spell will make all ghosts visible to the living. Be careful though, as while they cannot harm you in any way, they might prove a bit.. annoying. Costs 0 points in the Wizard's spellbook.
  • +
  • Ghosts now orbit around their followed targets
  • +
  • Added new Shadowling Ability - Null Charge! This new ability allows Shadowling to completely drain an APC of it's power after a moderate delay. Shadowling must not be interrupted, or the whole process will fail.
  • +
  • Added custom icon for the Null Charge ability
  • +
  • Shadowling Drain Life ability removed
  • +
  • Added Observer HUD buttons for Jump to Mob, Orbit, Re-enter corpse, and Teleport
  • +
  • Added custom icons for Observer HUD buttons
  • +
  • Added Floorbot color variants. Different toolboxes will result in a differently colored Floorbots. One even might be a little stronger than others..
  • +
  • Added sprites of Floorbot color variants
  • +
  • Fixed incorrect amount of required floortiles for the Floorbot in the crafting tab
  • +
  • Added cancel button to Wizard teleportation scrolls
  • +
  • Added an option to grant Martial Arts via administrative Var menu
  • +
  • Toggling hardhat light on/off now correctly updates wearer's sprite
  • +
  • Added deathsound for Silicons
  • +
  • Dice will now roll when thrown
  • +
  • Added sound when adding or removing IDs from ID modification computers
  • +
  • Added cancel button to transfer amount from stack menu
  • +
  • Alt-click is a new shortcut to take a custom amount from stack
  • +
  • Added shortcuts for handling pumps, volume pumps, filters, and mixers. Ctrl-click these devices to turn them on/off and Alt-click them to set their output to maximum.
  • +
  • Added ability to rename pumps, volume pumps, filters and mixers with a pen.
  • +
  • Added sound for throwing bolas
  • +
  • Added hitsound for all types of bolas
  • +
  • Added AntagHUD to everyone at the round end
  • +
  • Circuit Boards now show their required components on examine
  • +
  • Revenants now have randomly generated flavor names
  • +
  • You can shift-click any action button to reset it's position. Alt-click on Hide Buttons will reset all action buttons to their default positions.
  • +
  • Pill Bottles are now printable in the Autolathe. You can find them in the Medical section, and each costs 80 metal and 20 glass to print.
  • +
  • Puts beakers in your hand upon eject from chemistry machines
  • +
  • Cardboard can now be made in the Biogenerator
  • +
  • You can now hotswap tanks in a canister or gas pump by clicking it with a new tank!
  • +
  • You can now also close a canister's valve and remove the tank inside it by alt-clicking it.
  • +
  • Added examine toolptips. Hover over any equipped or hold item for a little while and it will display the item description as a tooltip.
  • +
  • Ghost teleport verb will no locker flicker when used
  • +
  • Alt-click now opens and closes fire extinguisher cabinet
  • +
  • Fire extinguisher cabinet now properly updates it's sprite correctly when putting fire extinquisher inside the cabinet
  • +
  • Fire extinguisher no longer sprays when put into fire extinguisher cabinet with a safety off
  • +
  • Added sound for opening and closing fire extinguisher cabinet
  • +
  • Added new torch sprites
  • +
  • Torch light color is now orange instead of red
  • +
  • Torch sprite now correctly shows all inhand sprites
  • +
  • Blob Rally Spores power is now free to use
  • +
  • Blob mobs can no longer speak while being dead via Blob Broadcast
  • +
  • Blob structures now properly show working animation
  • +
  • Added new sprites for variants of Blob resource, factory and storage structures
  • +
  • Added inhand sprites for winter coats
  • +
  • Carps now spawn with a random color! There might even be some really rare ones..
  • +
  • Added carp color variants sprites
  • +
+

Arkatos and Paradise community: updated:

+
    +
  • Added Tip of the round to a pre-game lobby
  • +
  • Added Show Custom Tip admin verb
  • +
  • Added Give Random Tip OOC verb
  • +
+

Citinited updated:

+
    +
  • You can no longer turn transit turfs into foamed metal flooring.
  • +
  • Foamed metal floors have a sprite now.
  • +
  • Pipe dispensers (the big ones) now work again.
  • +
  • Cooldown on pipe dispensers reduced to 0.4 seconds, down from 1.5 seconds
  • +
+

CornMyCob updated:

+
    +
  • The plasma cutter now cuts through multiple rock tiles.
  • +
+

CthulhuOnIce updated:

+
    +
  • you can smell dead bodies, even if someone else shouldn't
  • +
+

Fethas updated:

+
    +
  • Cluwne suits should no longer fall off cluwnes from being fat.
  • +
+

Fox McCloud updated:

+
    +
  • CQC has been updated; a few combos are more powerful
  • +
  • cost increased to 13 TC
  • +
  • CQC is now nuke ops only
  • +
  • gloves of the north star restriction on CQC removed
  • +
  • CQC disarms will now take the item from your opponent
  • +
  • CQC blocks melee weapons and a couple of stun weapons and not everything now
  • +
  • Reagents will now adjust to the body temperature over time as opposed to all at once
  • +
  • Strange Reagent will work 25% of the time with TOUCH based reactions
  • +
  • Strange reagent will revive whether there's a ghost or not (can use SR on clientless mobs now, like monkies)
  • +
  • SR puts the occupant back in their body automatically
  • +
  • Cloners that eject their messes will now eject the unattached organs
  • +
  • the message for brain death will now properly and only occur when they have truly died from brain damage
  • +
  • Fixes being able to attain brain damage over 120
  • +
  • Updates nations. Updates nations so hard right into the void
  • +
  • Plasma fires should burn a bit faster now
  • +
  • Bleeding will now stop at the temperature at which cryoxadone heals
  • +
  • Fixes a few potential exploits with forcing chem, dust, and explosive implants activating with the deathgasp emote, prior to death
  • +
  • Tesla can't zap cameras and other disposal structures anymore
  • +
  • Simple mobs can now be shocked
  • +
  • Electrocution damage scales a bit more linearly up to its maximum potential instead of being heavily random
  • +
  • Fixes being able to shock yourself with TK, at range, on electrical equipment
  • +
  • simple mobs can now be shocked by the tesla and other sources
  • +
  • Fixes goats not attacking people
  • +
  • Goats will eat glowshrooms
  • +
  • Goats will eat full grown diona
  • +
  • Remapped toxins to be more compatible with the modern age
  • +
  • updates plasma and N2O sprites
  • +
  • Fixes not being able to look at a turf if it had plasma/N2O on it
  • +
  • cold turfs no longer become icy
  • +
  • Cryostylane makes turfs icy
  • +
  • Icy turfs are slippery; wear magboots to counteract the effect. Watch your head!
  • +
  • Fixes grammar of slipping on turfs; no more "you slipped on floor" or "you slipped on wet floor"
  • +
  • removes ponies
  • +
  • object and fast processing are now proper subsystems
  • +
  • Fixes multi-spawn blobs
  • +
  • Powersinks drain rate increased, but they also explode a bit sooner
  • +
  • Multitools display total power, load, and free power
  • +
  • Fix emitter sparks sparking at the location of emitters where biult as opposed to emitter current location
  • +
+

Ionward updated:

+
    +
  • Added new mantles! Check the ClothesMate, or in department head's lockers.
  • +
+

KasparoVy updated:

+
    +
  • Adds striped normal-height socks.
  • +
  • Vox can now wear whatever undergarment they want.
  • +
  • Removes flesh from shredded Vox uniform sprites.
  • +
  • Armalis can no longer wear undergarments. They didn't fit, anyhow.
  • +
  • Underwear no can no longer lock up the character creator.
  • +
+

Kyep updated:

+
    +
  • bans issued by admins via the Player Panel no longer incorrectly omit IP/etc information
  • +
  • admins issuing permanent bans are no longer presented with an "ip ban?" prompt, as all bans include IP/CID information now. This prompt was a legacy thing from back when the filesystem was used to store bans, and hasn't ever affected how DB-based bans were stored.
  • +
  • Added a config file option which allows SSD crew members to be moved to cryo after a defined amount of minutes.
  • +
  • Added a config file option which causes most people trying to attack/loot/interact with a SSD character to need to confirm they've read the rules before being able to do so.
  • +
  • Fixed an error message being inappropriately generated for admins when someone signs up as a pAI.
  • +
  • The ID computer now color-codes potential job transfer options, highlighting good choices for a job transfer in green, and bad ones in gray.
  • +
  • Taking a job transfer now gives you playtime based on your new job, instead of incorrectly still giving you playtime based on your old job.
  • +
  • Job transfers to karma jobs are now possible - if you have the job unlocked.
  • +
  • Attempting to bypass a job ban via a job transfer now generates a warning to all online admins.
  • +
  • Refactored and improved our entry on the server hub.
  • +
  • Fixed a runtime in job_exp.dm
  • +
+

Markolie updated:

+
    +
  • Safes can now consist of more than two tumblers.
  • +
  • All safes now have three tumblers by default, instead of two.
  • +
  • The safe opening mechanism has changed slightly. This is described on the safe cracking UI.
  • +
  • The hardsuit equipment lockers on the Syndicate Nuclear Operative shuttle have been replaced with suit storage units. Suit storage units now have a separate slot for magboots.
  • +
  • Nuclear Operatives can now purchase reinforcements. These reinforcements cost 25 telecrystals each.
  • +
  • A number of new ammunition and weapon bundles have been added for Nuclear Operatives.
  • +
  • For every ten players on the server, the Nuclear Operatives now receive 2 extra telecrystals.
  • +
  • The Syndicate borg spawners have been separated into three separate spawners, one for each type of Syndicate cyborg. Their prices have been modified.
  • +
  • Saboteur borgs now spawn with thermals.
  • +
  • The Syndicate borg and exosuits have been moved to a new category, "Support and Mechanized Exosuits".
  • +
  • Existing bundles and telecrystal purchases have been moved to a new category, "Bundles and Telecrystals".
  • +
  • There are now more spawn points for nuclear operatives on their base. The number of operatives spawning has not been changed.
  • +
  • Spawning nuclear operatives through the traitor panel now causes their ID to be properly updated.
  • +
  • Shuttles no longer leave behind their propulsion.
  • +
  • AZERTY hotkey mode users can now switch between regular mode and hotkey mode properly using TAB again.
  • +
  • Jumpsuits are now removed by clicking instead of clicking and dragging.
  • +
  • Removed a useless message that would be sent to admins whenever a drone joins the round.
  • +
  • Fixed an issue where admins would receive a message whenever someone joined up as a pAI.
  • +
+

McDonald072 updated:

+
    +
  • You can no longer examine or teleport things using clipboards
  • +
+

Quantum-M updated:

+
    +
  • Two multicolor pens to the Internal Affairs Office
  • +
+

TDSSS updated:

+
    +
  • nukies can buy plasma grenades again
  • +
+

Ty-Omaha updated:

+
    +
  • Moves AI admin log to the all preference
  • +
+

dovydas12345 updated:

+
    +
  • Fixes normal cameras spooking non-chaplains even when they don't capture any ghosts
  • +
+

farie82 updated:

+
    +
  • Makes puke less lag inducing
  • +
  • Puke can now appear on all kinds of turfs except spess
  • +
  • Ticket messages now have their corresponding span classes. Making them easier to notice
  • +
  • PM's now shouldn't go to the wrong client anymore when the target left.
  • +
  • Cure text for Shock and Cardiac failure are more clear now
  • +
  • Ducttape gags can now be removed properly without spawning an invisible one in your hands
  • +
  • Windoors now give the airlock assembly electronics once deconstructed
  • +
  • Can't place runes in space anymore
  • +
  • Admins can now use all mhelp related things again
  • +
  • Fixed the toggle mentor ticket messages text
  • +
  • Vampiric glaring is logged now
  • +
  • Doctor delight and orange juice now heal again
  • +
  • Fixes admin PM's. Bwoinks are back on the menu!
  • +
  • Organs will now prompt a update_stat. Meaning that IRCs and the like now get revived when possible when you put their battery and brain in
  • +
  • The typing limiter option should now work for all edge cases. Such as dying while talking and such
  • +
  • Borgs health status now updates properly when removing and adding parts
  • +
  • You won't try to fix destroyed components in borgs anymore. Which resulted to lost materials and no healing
  • +
  • Borg analysers will now properly show missing components and won't show their damage if missing
  • +
  • Self diagnostics for borgs now also shows missing parts and destroyed ones
  • +
+

iantine updated:

+
    +
  • Adds Lumi's vox suit fluff
  • +
+

uc_guy updated:

+
    +
  • Players in the lobby no longer see cult speak.
  • +
+

08 April 2019

TDSSS updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d145f082f7c..5ad4bdbcd9e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -9790,3 +9790,256 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2019-04-08: TDSSS: - bugfix: Added missing vent in toxins mixing +2019-05-02: + AffectedArc07: + - rscadd: ssMapping + - tweak: Gateway and space ruins are now loaded with ssMapping + - rscdel: Master Controller + - tweak: Darkmode chat department colors match NTTC theming now + - rscadd: SSvotes + - rscadd: SSradio + - rscadd: SSevents + - rscadd: SSholiday + - tweak: We no longer check if its Christmas every tick. Dont ask. + - rscadd: SSalarms + Arkatos: + - tweak: Shadowlings now have a slightly bigger colored text when speaking in the + Shadowling Hivemind + - soundadd: Replaced title2.ogg music with a higher quality version + - tweak: Shield Blobs automatically spawned around Blob Cores now give no refund + upon removing. No freebies. + - rscadd: Added new Wizard Spell - Summon Ghosts! This nefarious spell will make + all ghosts visible to the living. Be careful though, as while they cannot harm + you in any way, they might prove a bit.. annoying. Costs 0 points in the Wizard's + spellbook. + - tweak: Ghosts now orbit around their followed targets + - rscadd: Added new Shadowling Ability - Null Charge! This new ability allows Shadowling + to completely drain an APC of it's power after a moderate delay. Shadowling + must not be interrupted, or the whole process will fail. + - imageadd: Added custom icon for the Null Charge ability + - rscdel: Shadowling Drain Life ability removed + - rscadd: Added Observer HUD buttons for Jump to Mob, Orbit, Re-enter corpse, and + Teleport + - imageadd: Added custom icons for Observer HUD buttons + - rscadd: Added Floorbot color variants. Different toolboxes will result in a differently + colored Floorbots. One even might be a little stronger than others.. + - imageadd: Added sprites of Floorbot color variants + - bugfix: Fixed incorrect amount of required floortiles for the Floorbot in the + crafting tab + - rscadd: Added cancel button to Wizard teleportation scrolls + - rscadd: Added an option to grant Martial Arts via administrative Var menu + - bugfix: Toggling hardhat light on/off now correctly updates wearer's sprite + - soundadd: Added deathsound for Silicons + - tweak: Dice will now roll when thrown + - soundadd: Added sound when adding or removing IDs from ID modification computers + - rscadd: Added cancel button to transfer amount from stack menu + - tweak: Alt-click is a new shortcut to take a custom amount from stack + - rscadd: Added shortcuts for handling pumps, volume pumps, filters, and mixers. + Ctrl-click these devices to turn them on/off and Alt-click them to set their + output to maximum. + - rscadd: Added ability to rename pumps, volume pumps, filters and mixers with a + pen. + - soundadd: Added sound for throwing bolas + - soundadd: Added hitsound for all types of bolas + - rscadd: Added AntagHUD to everyone at the round end + - rscadd: Circuit Boards now show their required components on examine + - rscadd: Revenants now have randomly generated flavor names + - tweak: You can shift-click any action button to reset it's position. Alt-click + on Hide Buttons will reset all action buttons to their default positions. + - rscadd: Pill Bottles are now printable in the Autolathe. You can find them in + the Medical section, and each costs 80 metal and 20 glass to print. + - tweak: Puts beakers in your hand upon eject from chemistry machines + - rscadd: Cardboard can now be made in the Biogenerator + - rscadd: You can now hotswap tanks in a canister or gas pump by clicking it with + a new tank! + - rscadd: You can now also close a canister's valve and remove the tank inside it + by alt-clicking it. + - rscadd: Added examine toolptips. Hover over any equipped or hold item for a little + while and it will display the item description as a tooltip. + - bugfix: Ghost teleport verb will no locker flicker when used + - rscadd: Alt-click now opens and closes fire extinguisher cabinet + - bugfix: Fire extinguisher cabinet now properly updates it's sprite correctly when + putting fire extinquisher inside the cabinet + - bugfix: Fire extinguisher no longer sprays when put into fire extinguisher cabinet + with a safety off + - soundadd: Added sound for opening and closing fire extinguisher cabinet + - imageadd: Added new torch sprites + - tweak: Torch light color is now orange instead of red + - bugfix: Torch sprite now correctly shows all inhand sprites + - tweak: Blob Rally Spores power is now free to use + - bugfix: Blob mobs can no longer speak while being dead via Blob Broadcast + - bugfix: Blob structures now properly show working animation + - imageadd: Added new sprites for variants of Blob resource, factory and storage + structures + - imageadd: Added inhand sprites for winter coats + - rscadd: Carps now spawn with a random color! There might even be some really rare + ones.. + - imageadd: Added carp color variants sprites + 'Arkatos and Paradise community:': + - rscadd: Added Tip of the round to a pre-game lobby + - rscadd: Added Show Custom Tip admin verb + - rscadd: Added Give Random Tip OOC verb + Citinited: + - bugfix: You can no longer turn transit turfs into foamed metal flooring. + - bugfix: Foamed metal floors have a sprite now. + - bugfix: Pipe dispensers (the big ones) now work again. + - tweak: Cooldown on pipe dispensers reduced to 0.4 seconds, down from 1.5 seconds + CornMyCob: + - tweak: The plasma cutter now cuts through multiple rock tiles. + CthulhuOnIce: + - bugfix: you can smell dead bodies, even if someone else shouldn't + Fethas: + - bugfix: Cluwne suits should no longer fall off cluwnes from being fat. + Fox McCloud: + - tweak: CQC has been updated; a few combos are more powerful + - tweak: cost increased to 13 TC + - tweak: CQC is now nuke ops only + - tweak: gloves of the north star restriction on CQC removed + - tweak: CQC disarms will now take the item from your opponent + - tweak: CQC blocks melee weapons and a couple of stun weapons and not everything + now + - tweak: Reagents will now adjust to the body temperature over time as opposed to + all at once + - tweak: Strange Reagent will work 25% of the time with TOUCH based reactions + - tweak: Strange reagent will revive whether there's a ghost or not (can use SR + on clientless mobs now, like monkies) + - tweak: SR puts the occupant back in their body automatically + - tweak: Cloners that eject their messes will now eject the unattached organs + - tweak: the message for brain death will now properly and only occur when they + have truly died from brain damage + - bugfix: Fixes being able to attain brain damage over 120 + - rscdel: Updates nations. Updates nations so hard right into the void + - tweak: Plasma fires should burn a bit faster now + - tweak: Bleeding will now stop at the temperature at which cryoxadone heals + - bugfix: Fixes a few potential exploits with forcing chem, dust, and explosive + implants activating with the deathgasp emote, prior to death + - tweak: Tesla can't zap cameras and other disposal structures anymore + - rscadd: Simple mobs can now be shocked + - tweak: Electrocution damage scales a bit more linearly up to its maximum potential + instead of being heavily random + - bugfix: Fixes being able to shock yourself with TK, at range, on electrical equipment + - rscadd: simple mobs can now be shocked by the tesla and other sources + - bugfix: Fixes goats not attacking people + - tweak: Goats will eat glowshrooms + - rscadd: Goats will eat full grown diona + - rscadd: Remapped toxins to be more compatible with the modern age + - tweak: updates plasma and N2O sprites + - bugfix: Fixes not being able to look at a turf if it had plasma/N2O on it + - rscdel: cold turfs no longer become icy + - rscadd: Cryostylane makes turfs icy + - rscadd: Icy turfs are slippery; wear magboots to counteract the effect. Watch + your head! + - bugfix: Fixes grammar of slipping on turfs; no more "you slipped on floor" or + "you slipped on wet floor" + - rscdel: removes ponies + - tweak: object and fast processing are now proper subsystems + - bugfix: Fixes multi-spawn blobs + - tweak: Powersinks drain rate increased, but they also explode a bit sooner + - rscadd: Multitools display total power, load, and free power + - bugfix: Fix emitter sparks sparking at the location of emitters where biult as + opposed to emitter current location + Ionward: + - rscadd: Added new mantles! Check the ClothesMate, or in department head's lockers. + KasparoVy: + - rscadd: Adds striped normal-height socks. + - rscadd: Vox can now wear whatever undergarment they want. + - tweak: Removes flesh from shredded Vox uniform sprites. + - rscdel: Armalis can no longer wear undergarments. They didn't fit, anyhow. + - bugfix: Underwear no can no longer lock up the character creator. + Kyep: + - bugfix: bans issued by admins via the Player Panel no longer incorrectly omit + IP/etc information + - tweak: admins issuing permanent bans are no longer presented with an "ip ban?" + prompt, as all bans include IP/CID information now. This prompt was a legacy + thing from back when the filesystem was used to store bans, and hasn't ever + affected how DB-based bans were stored. + - rscadd: Added a config file option which allows SSD crew members to be moved to + cryo after a defined amount of minutes. + - rscadd: Added a config file option which causes most people trying to attack/loot/interact + with a SSD character to need to confirm they've read the rules before being + able to do so. + - bugfix: Fixed an error message being inappropriately generated for admins when + someone signs up as a pAI. + - rscadd: The ID computer now color-codes potential job transfer options, highlighting + good choices for a job transfer in green, and bad ones in gray. + - bugfix: Taking a job transfer now gives you playtime based on your new job, instead + of incorrectly still giving you playtime based on your old job. + - tweak: Job transfers to karma jobs are now possible - if you have the job unlocked. + - rscadd: Attempting to bypass a job ban via a job transfer now generates a warning + to all online admins. + - tweak: Refactored and improved our entry on the server hub. + - bugfix: Fixed a runtime in job_exp.dm + Markolie: + - rscadd: Safes can now consist of more than two tumblers. + - tweak: All safes now have three tumblers by default, instead of two. + - tweak: The safe opening mechanism has changed slightly. This is described on the + safe cracking UI. + - rscadd: The hardsuit equipment lockers on the Syndicate Nuclear Operative shuttle + have been replaced with suit storage units. Suit storage units now have a separate + slot for magboots. + - rscadd: Nuclear Operatives can now purchase reinforcements. These reinforcements + cost 25 telecrystals each. + - rscadd: A number of new ammunition and weapon bundles have been added for Nuclear + Operatives. + - tweak: For every ten players on the server, the Nuclear Operatives now receive + 2 extra telecrystals. + - tweak: The Syndicate borg spawners have been separated into three separate spawners, + one for each type of Syndicate cyborg. Their prices have been modified. + - tweak: Saboteur borgs now spawn with thermals. + - tweak: The Syndicate borg and exosuits have been moved to a new category, "Support + and Mechanized Exosuits". + - tweak: Existing bundles and telecrystal purchases have been moved to a new category, + "Bundles and Telecrystals". + - tweak: There are now more spawn points for nuclear operatives on their base. The + number of operatives spawning has not been changed. + - bugfix: Spawning nuclear operatives through the traitor panel now causes their + ID to be properly updated. + - bugfix: Shuttles no longer leave behind their propulsion. + - bugfix: AZERTY hotkey mode users can now switch between regular mode and hotkey + mode properly using TAB again. + - tweak: Jumpsuits are now removed by clicking instead of clicking and dragging. + - bugfix: Removed a useless message that would be sent to admins whenever a drone + joins the round. + - bugfix: Fixed an issue where admins would receive a message whenever someone joined + up as a pAI. + McDonald072: + - bugfix: You can no longer examine or teleport things using clipboards + Quantum-M: + - rscadd: Two multicolor pens to the Internal Affairs Office + TDSSS: + - tweak: nukies can buy plasma grenades again + Ty-Omaha: + - tweak: Moves AI admin log to the all preference + dovydas12345: + - bugfix: Fixes normal cameras spooking non-chaplains even when they don't capture + any ghosts + farie82: + - tweak: Makes puke less lag inducing + - tweak: Puke can now appear on all kinds of turfs except spess + - bugfix: Ticket messages now have their corresponding span classes. Making them + easier to notice + - bugfix: PM's now shouldn't go to the wrong client anymore when the target left. + - tweak: Cure text for Shock and Cardiac failure are more clear now + - bugfix: Ducttape gags can now be removed properly without spawning an invisible + one in your hands + - bugfix: Windoors now give the airlock assembly electronics once deconstructed + - bugfix: Can't place runes in space anymore + - bugfix: Admins can now use all mhelp related things again + - spellcheck: Fixed the toggle mentor ticket messages text + - bugfix: Vampiric glaring is logged now + - bugfix: Doctor delight and orange juice now heal again + - bugfix: Fixes admin PM's. Bwoinks are back on the menu! + - bugfix: Organs will now prompt a update_stat. Meaning that IRCs and the like now + get revived when possible when you put their battery and brain in + - bugfix: The typing limiter option should now work for all edge cases. Such as + dying while talking and such + - bugfix: Borgs health status now updates properly when removing and adding parts + - bugfix: You won't try to fix destroyed components in borgs anymore. Which resulted + to lost materials and no healing + - bugfix: Borg analysers will now properly show missing components and won't show + their damage if missing + - tweak: Self diagnostics for borgs now also shows missing parts and destroyed ones + iantine: + - rscadd: Adds Lumi's vox suit fluff + uc_guy: + - bugfix: Players in the lobby no longer see cult speak. diff --git a/html/changelogs/AutoChangeLog-pr-10327.yml b/html/changelogs/AutoChangeLog-pr-10327.yml deleted file mode 100644 index 7b73cbcbd97..00000000000 --- a/html/changelogs/AutoChangeLog-pr-10327.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "CQC has been updated; a few combos are more powerful" - - tweak: "cost increased to 13 TC" - - tweak: "CQC is now nuke ops only" - - tweak: "gloves of the north star restriction on CQC removed" - - tweak: "CQC disarms will now take the item from your opponent" - - tweak: "CQC blocks melee weapons and a couple of stun weapons and not everything now" diff --git a/html/changelogs/AutoChangeLog-pr-11102.yml b/html/changelogs/AutoChangeLog-pr-11102.yml deleted file mode 100644 index 7e54f5268ab..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11102.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "ssMapping" - - tweak: "Gateway and space ruins are now loaded with ssMapping" diff --git a/html/changelogs/AutoChangeLog-pr-11129.yml b/html/changelogs/AutoChangeLog-pr-11129.yml deleted file mode 100644 index de26a8b8f1b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11129.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "iantine" -delete-after: True -changes: - - rscadd: "Adds Lumi's vox suit fluff" diff --git a/html/changelogs/AutoChangeLog-pr-11214.yml b/html/changelogs/AutoChangeLog-pr-11214.yml deleted file mode 100644 index fcad43b3086..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11214.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Shadowlings now have a slightly bigger colored text when speaking in the Shadowling Hivemind" diff --git a/html/changelogs/AutoChangeLog-pr-11217.yml b/html/changelogs/AutoChangeLog-pr-11217.yml deleted file mode 100644 index 9c6b9803c94..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11217.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Reagents will now adjust to the body temperature over time as opposed to all at once" diff --git a/html/changelogs/AutoChangeLog-pr-11224.yml b/html/changelogs/AutoChangeLog-pr-11224.yml deleted file mode 100644 index 0357a4aa727..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11224.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - soundadd: "Replaced title2.ogg music with a higher quality version" diff --git a/html/changelogs/AutoChangeLog-pr-11227.yml b/html/changelogs/AutoChangeLog-pr-11227.yml deleted file mode 100644 index cc4293ba715..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11227.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Strange Reagent will work 25% of the time with TOUCH based reactions" - - tweak: "Strange reagent will revive whether there's a ghost or not (can use SR on clientless mobs now, like monkies)" - - tweak: "SR puts the occupant back in their body automatically" - - tweak: "Cloners that eject their messes will now eject the unattached organs" diff --git a/html/changelogs/AutoChangeLog-pr-11230.yml b/html/changelogs/AutoChangeLog-pr-11230.yml deleted file mode 100644 index 36c1f051aca..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11230.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "the message for brain death will now properly and only occur when they have truly died from brain damage" - - bugfix: "Fixes being able to attain brain damage over 120" diff --git a/html/changelogs/AutoChangeLog-pr-11231.yml b/html/changelogs/AutoChangeLog-pr-11231.yml deleted file mode 100644 index 82560671a26..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11231.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Arkatos and Paradise community:" -delete-after: True -changes: - - rscadd: "Added Tip of the round to a pre-game lobby" - - rscadd: "Added Show Custom Tip admin verb" - - rscadd: "Added Give Random Tip OOC verb" diff --git a/html/changelogs/AutoChangeLog-pr-11243.yml b/html/changelogs/AutoChangeLog-pr-11243.yml deleted file mode 100644 index c0843a66d43..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11243.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CornMyCob" -delete-after: True -changes: - - tweak: "The plasma cutter now cuts through multiple rock tiles." diff --git a/html/changelogs/AutoChangeLog-pr-11253.yml b/html/changelogs/AutoChangeLog-pr-11253.yml deleted file mode 100644 index 0cfbb99257a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11253.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Citinited" -delete-after: True -changes: - - bugfix: "You can no longer turn transit turfs into foamed metal flooring." - - bugfix: "Foamed metal floors have a sprite now." diff --git a/html/changelogs/AutoChangeLog-pr-11255.yml b/html/changelogs/AutoChangeLog-pr-11255.yml deleted file mode 100644 index 7320fee3d2a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11255.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "Safes can now consist of more than two tumblers." - - tweak: "All safes now have three tumblers by default, instead of two." - - tweak: "The safe opening mechanism has changed slightly. This is described on the safe cracking UI." diff --git a/html/changelogs/AutoChangeLog-pr-11257.yml b/html/changelogs/AutoChangeLog-pr-11257.yml deleted file mode 100644 index a675de535f9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11257.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscdel: "Updates nations. Updates nations so hard right into the void" diff --git a/html/changelogs/AutoChangeLog-pr-11259.yml b/html/changelogs/AutoChangeLog-pr-11259.yml deleted file mode 100644 index 2b6bdf7e540..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11259.yml +++ /dev/null @@ -1,13 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - rscadd: "The hardsuit equipment lockers on the Syndicate Nuclear Operative shuttle have been replaced with suit storage units. Suit storage units now have a separate slot for magboots." - - rscadd: "Nuclear Operatives can now purchase reinforcements. These reinforcements cost 25 telecrystals each." - - rscadd: "A number of new ammunition and weapon bundles have been added for Nuclear Operatives." - - tweak: "For every ten players on the server, the Nuclear Operatives now receive 2 extra telecrystals." - - tweak: "The Syndicate borg spawners have been separated into three separate spawners, one for each type of Syndicate cyborg. Their prices have been modified." - - tweak: "Saboteur borgs now spawn with thermals." - - tweak: "The Syndicate borg and exosuits have been moved to a new category, \"Support and Mechanized Exosuits\"." - - tweak: "Existing bundles and telecrystal purchases have been moved to a new category, \"Bundles and Telecrystals\"." - - tweak: "There are now more spawn points for nuclear operatives on their base. The number of operatives spawning has not been changed." - - bugfix: "Spawning nuclear operatives through the traitor panel now causes their ID to be properly updated." diff --git a/html/changelogs/AutoChangeLog-pr-11270.yml b/html/changelogs/AutoChangeLog-pr-11270.yml deleted file mode 100644 index 6ecdf8039c0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11270.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TDSSS" -delete-after: True -changes: - - tweak: "nukies can buy plasma grenades again" diff --git a/html/changelogs/AutoChangeLog-pr-11277.yml b/html/changelogs/AutoChangeLog-pr-11277.yml deleted file mode 100644 index c966a9c74cb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11277.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Shield Blobs automatically spawned around Blob Cores now give no refund upon removing. No freebies." diff --git a/html/changelogs/AutoChangeLog-pr-11278.yml b/html/changelogs/AutoChangeLog-pr-11278.yml deleted file mode 100644 index 24f9c3ab4cc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11278.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added new Wizard Spell - Summon Ghosts! This nefarious spell will make all ghosts visible to the living. Be careful though, as while they cannot harm you in any way, they might prove a bit.. annoying. Costs 0 points in the Wizard's spellbook." diff --git a/html/changelogs/AutoChangeLog-pr-11279.yml b/html/changelogs/AutoChangeLog-pr-11279.yml deleted file mode 100644 index 11bdfb80538..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11279.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Ghosts now orbit around their followed targets" diff --git a/html/changelogs/AutoChangeLog-pr-11280.yml b/html/changelogs/AutoChangeLog-pr-11280.yml deleted file mode 100644 index 5228e09b3c9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11280.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ionward" -delete-after: True -changes: - - rscadd: "Added new mantles! Check the ClothesMate, or in department head's lockers." diff --git a/html/changelogs/AutoChangeLog-pr-11282.yml b/html/changelogs/AutoChangeLog-pr-11282.yml deleted file mode 100644 index 5b8e5704c06..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11282.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Plasma fires should burn a bit faster now" - - tweak: "Bleeding will now stop at the temperature at which cryoxadone heals" diff --git a/html/changelogs/AutoChangeLog-pr-11283.yml b/html/changelogs/AutoChangeLog-pr-11283.yml deleted file mode 100644 index 9056578d68b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11283.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes a few potential exploits with forcing chem, dust, and explosive implants activating with the deathgasp emote, prior to death" diff --git a/html/changelogs/AutoChangeLog-pr-11284.yml b/html/changelogs/AutoChangeLog-pr-11284.yml deleted file mode 100644 index 433a7fb3f68..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11284.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added new Shadowling Ability - Null Charge! This new ability allows Shadowling to completely drain an APC of it's power after a moderate delay. Shadowling must not be interrupted, or the whole process will fail." - - imageadd: "Added custom icon for the Null Charge ability" - - rscdel: "Shadowling Drain Life ability removed" diff --git a/html/changelogs/AutoChangeLog-pr-11285.yml b/html/changelogs/AutoChangeLog-pr-11285.yml deleted file mode 100644 index 3c725a05b90..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11285.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Tesla can't zap cameras and other disposal structures anymore" - - rscadd: "Simple mobs can now be shocked" - - tweak: "Electrocution damage scales a bit more linearly up to its maximum potential instead of being heavily random" - - bugfix: "Fixes being able to shock yourself with TK, at range, on electrical equipment" - - rscadd: "simple mobs can now be shocked by the tesla and other sources" diff --git a/html/changelogs/AutoChangeLog-pr-11287.yml b/html/changelogs/AutoChangeLog-pr-11287.yml deleted file mode 100644 index 111f8aac824..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11287.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes goats not attacking people" - - tweak: "Goats will eat glowshrooms" - - rscadd: "Goats will eat full grown diona" diff --git a/html/changelogs/AutoChangeLog-pr-11288.yml b/html/changelogs/AutoChangeLog-pr-11288.yml deleted file mode 100644 index 2a309dde374..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11288.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscadd: "Remapped toxins to be more compatible with the modern age" diff --git a/html/changelogs/AutoChangeLog-pr-11292.yml b/html/changelogs/AutoChangeLog-pr-11292.yml deleted file mode 100644 index 814c8530858..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11292.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - tweak: "Makes puke less lag inducing" - - tweak: "Puke can now appear on all kinds of turfs except spess" diff --git a/html/changelogs/AutoChangeLog-pr-11294.yml b/html/changelogs/AutoChangeLog-pr-11294.yml deleted file mode 100644 index 0088263303b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11294.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Ticket messages now have their corresponding span classes. Making them easier to notice" diff --git a/html/changelogs/AutoChangeLog-pr-11296.yml b/html/changelogs/AutoChangeLog-pr-11296.yml deleted file mode 100644 index 42a9ce1a063..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11296.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "PM's now shouldn't go to the wrong client anymore when the target left." diff --git a/html/changelogs/AutoChangeLog-pr-11297.yml b/html/changelogs/AutoChangeLog-pr-11297.yml deleted file mode 100644 index 9973022ecea..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11297.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "updates plasma and N2O sprites" - - bugfix: "Fixes not being able to look at a turf if it had plasma/N2O on it" - - rscdel: "cold turfs no longer become icy" - - rscadd: "Cryostylane makes turfs icy" - - rscadd: "Icy turfs are slippery; wear magboots to counteract the effect. Watch your head!" - - bugfix: "Fixes grammar of slipping on turfs; no more \"you slipped on floor\" or \"you slipped on wet floor\"" diff --git a/html/changelogs/AutoChangeLog-pr-11298.yml b/html/changelogs/AutoChangeLog-pr-11298.yml deleted file mode 100644 index 0523ab305e7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11298.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "bans issued by admins via the Player Panel no longer incorrectly omit IP/etc information" - - tweak: "admins issuing permanent bans are no longer presented with an \"ip ban?\" prompt, as all bans include IP/CID information now. This prompt was a legacy thing from back when the filesystem was used to store bans, and hasn't ever affected how DB-based bans were stored." diff --git a/html/changelogs/AutoChangeLog-pr-11299.yml b/html/changelogs/AutoChangeLog-pr-11299.yml deleted file mode 100644 index 4994b017d39..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11299.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - rscadd: "Added a config file option which allows SSD crew members to be moved to cryo after a defined amount of minutes." - - rscadd: "Added a config file option which causes most people trying to attack/loot/interact with a SSD character to need to confirm they've read the rules before being able to do so." diff --git a/html/changelogs/AutoChangeLog-pr-11300.yml b/html/changelogs/AutoChangeLog-pr-11300.yml deleted file mode 100644 index b949b7f91f5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11300.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added Observer HUD buttons for Jump to Mob, Orbit, Re-enter corpse, and Teleport" - - imageadd: "Added custom icons for Observer HUD buttons" diff --git a/html/changelogs/AutoChangeLog-pr-11301.yml b/html/changelogs/AutoChangeLog-pr-11301.yml deleted file mode 100644 index 2b1bc1f82cd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11301.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "KasparoVy" -delete-after: True -changes: - - rscadd: "Adds striped normal-height socks." - - rscadd: "Vox can now wear whatever undergarment they want." - - tweak: "Removes flesh from shredded Vox uniform sprites." - - rscdel: "Armalis can no longer wear undergarments. They didn't fit, anyhow." diff --git a/html/changelogs/AutoChangeLog-pr-11305.yml b/html/changelogs/AutoChangeLog-pr-11305.yml deleted file mode 100644 index 6ca9bfb33bd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11305.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscdel: "removes ponies" diff --git a/html/changelogs/AutoChangeLog-pr-11310.yml b/html/changelogs/AutoChangeLog-pr-11310.yml deleted file mode 100644 index 3ec3c388190..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11310.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "KasparoVy" -delete-after: True -changes: - - bugfix: "Underwear no can no longer lock up the character creator." diff --git a/html/changelogs/AutoChangeLog-pr-11312.yml b/html/changelogs/AutoChangeLog-pr-11312.yml deleted file mode 100644 index c7b31729672..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11312.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - tweak: "Cure text for Shock and Cardiac failure are more clear now" diff --git a/html/changelogs/AutoChangeLog-pr-11313.yml b/html/changelogs/AutoChangeLog-pr-11313.yml deleted file mode 100644 index d86b5ff7d0a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11313.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Ducttape gags can now be removed properly without spawning an invisible one in your hands" diff --git a/html/changelogs/AutoChangeLog-pr-11314.yml b/html/changelogs/AutoChangeLog-pr-11314.yml deleted file mode 100644 index 0d38b022e23..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11314.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Windoors now give the airlock assembly electronics once deconstructed" diff --git a/html/changelogs/AutoChangeLog-pr-11317.yml b/html/changelogs/AutoChangeLog-pr-11317.yml deleted file mode 100644 index 96503bf1d88..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11317.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Can't place runes in space anymore" diff --git a/html/changelogs/AutoChangeLog-pr-11318.yml b/html/changelogs/AutoChangeLog-pr-11318.yml deleted file mode 100644 index a9e5c225096..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11318.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscdel: "Master Controller" diff --git a/html/changelogs/AutoChangeLog-pr-11319.yml b/html/changelogs/AutoChangeLog-pr-11319.yml deleted file mode 100644 index c9c992c83d1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11319.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added Floorbot color variants. Different toolboxes will result in a differently colored Floorbots. One even might be a little stronger than others.." - - imageadd: "Added sprites of Floorbot color variants" - - bugfix: "Fixed incorrect amount of required floortiles for the Floorbot in the crafting tab" diff --git a/html/changelogs/AutoChangeLog-pr-11320.yml b/html/changelogs/AutoChangeLog-pr-11320.yml deleted file mode 100644 index 6bafcda7d63..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11320.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Shuttles no longer leave behind their propulsion." diff --git a/html/changelogs/AutoChangeLog-pr-11323.yml b/html/changelogs/AutoChangeLog-pr-11323.yml deleted file mode 100644 index 20da5d256b3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11323.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - tweak: "Darkmode chat department colors match NTTC theming now" diff --git a/html/changelogs/AutoChangeLog-pr-11328.yml b/html/changelogs/AutoChangeLog-pr-11328.yml deleted file mode 100644 index e91103f07cd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11328.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Admins can now use all mhelp related things again" - - spellcheck: "Fixed the toggle mentor ticket messages text" diff --git a/html/changelogs/AutoChangeLog-pr-11329.yml b/html/changelogs/AutoChangeLog-pr-11329.yml deleted file mode 100644 index e25e56b8828..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11329.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Vampiric glaring is logged now" diff --git a/html/changelogs/AutoChangeLog-pr-11331.yml b/html/changelogs/AutoChangeLog-pr-11331.yml deleted file mode 100644 index bd501e2f162..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11331.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added cancel button to Wizard teleportation scrolls" diff --git a/html/changelogs/AutoChangeLog-pr-11332.yml b/html/changelogs/AutoChangeLog-pr-11332.yml deleted file mode 100644 index f76e2e2b48b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11332.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added an option to grant Martial Arts via administrative Var menu" diff --git a/html/changelogs/AutoChangeLog-pr-11333.yml b/html/changelogs/AutoChangeLog-pr-11333.yml deleted file mode 100644 index 71935d55d86..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11333.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - bugfix: "Toggling hardhat light on/off now correctly updates wearer's sprite" diff --git a/html/changelogs/AutoChangeLog-pr-11334.yml b/html/changelogs/AutoChangeLog-pr-11334.yml deleted file mode 100644 index 7e119901704..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11334.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - soundadd: "Added deathsound for Silicons" diff --git a/html/changelogs/AutoChangeLog-pr-11335.yml b/html/changelogs/AutoChangeLog-pr-11335.yml deleted file mode 100644 index 084f93320cb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11335.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Dice will now roll when thrown" diff --git a/html/changelogs/AutoChangeLog-pr-11336.yml b/html/changelogs/AutoChangeLog-pr-11336.yml deleted file mode 100644 index bf2626580e3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11336.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CthulhuOnIce" -delete-after: True -changes: - - bugfix: "you can smell dead bodies, even if someone else shouldn't" diff --git a/html/changelogs/AutoChangeLog-pr-11338.yml b/html/changelogs/AutoChangeLog-pr-11338.yml deleted file mode 100644 index 6505d695841..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11338.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - soundadd: "Added sound when adding or removing IDs from ID modification computers" diff --git a/html/changelogs/AutoChangeLog-pr-11339.yml b/html/changelogs/AutoChangeLog-pr-11339.yml deleted file mode 100644 index a5b0f74908e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11339.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "AZERTY hotkey mode users can now switch between regular mode and hotkey mode properly using TAB again." diff --git a/html/changelogs/AutoChangeLog-pr-11340.yml b/html/changelogs/AutoChangeLog-pr-11340.yml deleted file mode 100644 index 3b9d667166a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11340.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - tweak: "Jumpsuits are now removed by clicking instead of clicking and dragging." diff --git a/html/changelogs/AutoChangeLog-pr-11347.yml b/html/changelogs/AutoChangeLog-pr-11347.yml deleted file mode 100644 index 57248e4f861..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11347.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added cancel button to transfer amount from stack menu" - - tweak: "Alt-click is a new shortcut to take a custom amount from stack" diff --git a/html/changelogs/AutoChangeLog-pr-11348.yml b/html/changelogs/AutoChangeLog-pr-11348.yml deleted file mode 100644 index 55335793f97..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11348.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added shortcuts for handling pumps, volume pumps, filters, and mixers. Ctrl-click these devices to turn them on/off and Alt-click them to set their output to maximum." - - rscadd: "Added ability to rename pumps, volume pumps, filters and mixers with a pen." diff --git a/html/changelogs/AutoChangeLog-pr-11349.yml b/html/changelogs/AutoChangeLog-pr-11349.yml deleted file mode 100644 index 329fec2e5cc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11349.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - soundadd: "Added sound for throwing bolas" - - soundadd: "Added hitsound for all types of bolas" diff --git a/html/changelogs/AutoChangeLog-pr-11350.yml b/html/changelogs/AutoChangeLog-pr-11350.yml deleted file mode 100644 index 54d750a6e7e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11350.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "SSvotes" - - rscadd: "SSradio" diff --git a/html/changelogs/AutoChangeLog-pr-11351.yml b/html/changelogs/AutoChangeLog-pr-11351.yml deleted file mode 100644 index 8fbca5fe9c0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11351.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Citinited" -delete-after: True -changes: - - bugfix: "Pipe dispensers (the big ones) now work again." - - tweak: "Cooldown on pipe dispensers reduced to 0.4 seconds, down from 1.5 seconds" diff --git a/html/changelogs/AutoChangeLog-pr-11353.yml b/html/changelogs/AutoChangeLog-pr-11353.yml deleted file mode 100644 index 9807b7a0681..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11353.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added AntagHUD to everyone at the round end" diff --git a/html/changelogs/AutoChangeLog-pr-11355.yml b/html/changelogs/AutoChangeLog-pr-11355.yml deleted file mode 100644 index 934e85808ba..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11355.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "Fixed an error message being inappropriately generated for admins when someone signs up as a pAI." diff --git a/html/changelogs/AutoChangeLog-pr-11356.yml b/html/changelogs/AutoChangeLog-pr-11356.yml deleted file mode 100644 index d441bd658e1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11356.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "McDonald072" -delete-after: True -changes: - - bugfix: "You can no longer examine or teleport things using clipboards" diff --git a/html/changelogs/AutoChangeLog-pr-11360.yml b/html/changelogs/AutoChangeLog-pr-11360.yml deleted file mode 100644 index 3fb01b5b8f9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11360.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "SSevents" - - rscadd: "SSholiday" - - tweak: "We no longer check if its Christmas every tick. Dont ask." diff --git a/html/changelogs/AutoChangeLog-pr-11361.yml b/html/changelogs/AutoChangeLog-pr-11361.yml deleted file mode 100644 index 7207d6d5daf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11361.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AffectedArc07" -delete-after: True -changes: - - rscadd: "SSalarms" diff --git a/html/changelogs/AutoChangeLog-pr-11362.yml b/html/changelogs/AutoChangeLog-pr-11362.yml deleted file mode 100644 index 72282104dc1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11362.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "uc_guy" -delete-after: True -changes: - - bugfix: "Players in the lobby no longer see cult speak." diff --git a/html/changelogs/AutoChangeLog-pr-11364.yml b/html/changelogs/AutoChangeLog-pr-11364.yml deleted file mode 100644 index b331b4d009d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11364.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "object and fast processing are now proper subsystems" diff --git a/html/changelogs/AutoChangeLog-pr-11365.yml b/html/changelogs/AutoChangeLog-pr-11365.yml deleted file mode 100644 index fd5fe573104..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11365.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - rscadd: "The ID computer now color-codes potential job transfer options, highlighting good choices for a job transfer in green, and bad ones in gray." - - bugfix: "Taking a job transfer now gives you playtime based on your new job, instead of incorrectly still giving you playtime based on your old job." - - tweak: "Job transfers to karma jobs are now possible - if you have the job unlocked." - - rscadd: "Attempting to bypass a job ban via a job transfer now generates a warning to all online admins." diff --git a/html/changelogs/AutoChangeLog-pr-11367.yml b/html/changelogs/AutoChangeLog-pr-11367.yml deleted file mode 100644 index 5d90a0b3f30..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11367.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Doctor delight and orange juice now heal again" diff --git a/html/changelogs/AutoChangeLog-pr-11369.yml b/html/changelogs/AutoChangeLog-pr-11369.yml deleted file mode 100644 index c8bc9be9e2d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11369.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Circuit Boards now show their required components on examine" diff --git a/html/changelogs/AutoChangeLog-pr-11370.yml b/html/changelogs/AutoChangeLog-pr-11370.yml deleted file mode 100644 index 9cd7a28a5b6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11370.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Revenants now have randomly generated flavor names" diff --git a/html/changelogs/AutoChangeLog-pr-11371.yml b/html/changelogs/AutoChangeLog-pr-11371.yml deleted file mode 100644 index 220e6962bc5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11371.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "You can shift-click any action button to reset it's position. Alt-click on Hide Buttons will reset all action buttons to their default positions." diff --git a/html/changelogs/AutoChangeLog-pr-11372.yml b/html/changelogs/AutoChangeLog-pr-11372.yml deleted file mode 100644 index 963e58006f1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11372.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Pill Bottles are now printable in the Autolathe. You can find them in the Medical section, and each costs 80 metal and 20 glass to print." diff --git a/html/changelogs/AutoChangeLog-pr-11373.yml b/html/changelogs/AutoChangeLog-pr-11373.yml deleted file mode 100644 index 9f90ffcd554..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11373.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Quantum-M" -delete-after: True -changes: - - rscadd: "Two multicolor pens to the Internal Affairs Office" diff --git a/html/changelogs/AutoChangeLog-pr-11375.yml b/html/changelogs/AutoChangeLog-pr-11375.yml deleted file mode 100644 index 34d17cb10ce..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11375.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Puts beakers in your hand upon eject from chemistry machines" diff --git a/html/changelogs/AutoChangeLog-pr-11376.yml b/html/changelogs/AutoChangeLog-pr-11376.yml deleted file mode 100644 index c3ed1239eb5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11376.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Cardboard can now be made in the Biogenerator" diff --git a/html/changelogs/AutoChangeLog-pr-11377.yml b/html/changelogs/AutoChangeLog-pr-11377.yml deleted file mode 100644 index 7b040fcc944..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11377.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "You can now hotswap tanks in a canister or gas pump by clicking it with a new tank!" - - rscadd: "You can now also close a canister's valve and remove the tank inside it by alt-clicking it." diff --git a/html/changelogs/AutoChangeLog-pr-11378.yml b/html/changelogs/AutoChangeLog-pr-11378.yml deleted file mode 100644 index fefbf428e06..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11378.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Added examine toolptips. Hover over any equipped or hold item for a little while and it will display the item description as a tooltip." diff --git a/html/changelogs/AutoChangeLog-pr-11381.yml b/html/changelogs/AutoChangeLog-pr-11381.yml deleted file mode 100644 index 604f3096553..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11381.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ty-Omaha" -delete-after: True -changes: - - tweak: "Moves AI admin log to the all preference" diff --git a/html/changelogs/AutoChangeLog-pr-11389.yml b/html/changelogs/AutoChangeLog-pr-11389.yml deleted file mode 100644 index 90d66861196..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11389.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - tweak: "Refactored and improved our entry on the server hub." diff --git a/html/changelogs/AutoChangeLog-pr-11390.yml b/html/changelogs/AutoChangeLog-pr-11390.yml deleted file mode 100644 index 12edd2d1fa2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11390.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes multi-spawn blobs" diff --git a/html/changelogs/AutoChangeLog-pr-11391.yml b/html/changelogs/AutoChangeLog-pr-11391.yml deleted file mode 100644 index 2d23260b1e4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11391.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Fixes admin PM's. Bwoinks are back on the menu!" diff --git a/html/changelogs/AutoChangeLog-pr-11393.yml b/html/changelogs/AutoChangeLog-pr-11393.yml deleted file mode 100644 index 955e99dab7a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11393.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Powersinks drain rate increased, but they also explode a bit sooner" - - rscadd: "Multitools display total power, load, and free power" - - bugfix: "Fix emitter sparks sparking at the location of emitters where biult as opposed to emitter current location" diff --git a/html/changelogs/AutoChangeLog-pr-11395.yml b/html/changelogs/AutoChangeLog-pr-11395.yml deleted file mode 100644 index 08ad539b42d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11395.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Organs will now prompt a update_stat. Meaning that IRCs and the like now get revived when possible when you put their battery and brain in" diff --git a/html/changelogs/AutoChangeLog-pr-11396.yml b/html/changelogs/AutoChangeLog-pr-11396.yml deleted file mode 100644 index 7cbd431c75b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11396.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - bugfix: "Ghost teleport verb will no locker flicker when used" diff --git a/html/changelogs/AutoChangeLog-pr-11397.yml b/html/changelogs/AutoChangeLog-pr-11397.yml deleted file mode 100644 index c19f8d2bd25..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11397.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Alt-click now opens and closes fire extinguisher cabinet" - - bugfix: "Fire extinguisher cabinet now properly updates it's sprite correctly when putting fire extinquisher inside the cabinet" - - bugfix: "Fire extinguisher no longer sprays when put into fire extinguisher cabinet with a safety off" - - soundadd: "Added sound for opening and closing fire extinguisher cabinet" diff --git a/html/changelogs/AutoChangeLog-pr-11400.yml b/html/changelogs/AutoChangeLog-pr-11400.yml deleted file mode 100644 index 199c334303b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11400.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - imageadd: "Added new torch sprites" - - tweak: "Torch light color is now orange instead of red" - - bugfix: "Torch sprite now correctly shows all inhand sprites" diff --git a/html/changelogs/AutoChangeLog-pr-11404.yml b/html/changelogs/AutoChangeLog-pr-11404.yml deleted file mode 100644 index e4161ce9d6c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11404.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "The typing limiter option should now work for all edge cases. Such as dying while talking and such" diff --git a/html/changelogs/AutoChangeLog-pr-11405.yml b/html/changelogs/AutoChangeLog-pr-11405.yml deleted file mode 100644 index 82b5d6e22c6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11405.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Removed a useless message that would be sent to admins whenever a drone joins the round." diff --git a/html/changelogs/AutoChangeLog-pr-11406.yml b/html/changelogs/AutoChangeLog-pr-11406.yml deleted file mode 100644 index 4a3191624ea..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11406.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - tweak: "Blob Rally Spores power is now free to use" - - bugfix: "Blob mobs can no longer speak while being dead via Blob Broadcast" - - bugfix: "Blob structures now properly show working animation" - - imageadd: "Added new sprites for variants of Blob resource, factory and storage structures" diff --git a/html/changelogs/AutoChangeLog-pr-11407.yml b/html/changelogs/AutoChangeLog-pr-11407.yml deleted file mode 100644 index fe79f15a6be..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11407.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - imageadd: "Added inhand sprites for winter coats" diff --git a/html/changelogs/AutoChangeLog-pr-11409.yml b/html/changelogs/AutoChangeLog-pr-11409.yml deleted file mode 100644 index 0c037aa5028..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11409.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Borgs health status now updates properly when removing and adding parts" - - bugfix: "You won't try to fix destroyed components in borgs anymore. Which resulted to lost materials and no healing" - - bugfix: "Borg analysers will now properly show missing components and won't show their damage if missing" - - tweak: "Self diagnostics for borgs now also shows missing parts and destroyed ones" diff --git a/html/changelogs/AutoChangeLog-pr-11413.yml b/html/changelogs/AutoChangeLog-pr-11413.yml deleted file mode 100644 index b5eff45acfe..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11413.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Arkatos" -delete-after: True -changes: - - rscadd: "Carps now spawn with a random color! There might even be some really rare ones.." - - imageadd: "Added carp color variants sprites" diff --git a/html/changelogs/AutoChangeLog-pr-11414.yml b/html/changelogs/AutoChangeLog-pr-11414.yml deleted file mode 100644 index a994f91763e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11414.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Fixed an issue where admins would receive a message whenever someone joined up as a pAI." diff --git a/html/changelogs/AutoChangeLog-pr-11419.yml b/html/changelogs/AutoChangeLog-pr-11419.yml deleted file mode 100644 index 654af89e49d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11419.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "dovydas12345" -delete-after: True -changes: - - bugfix: "Fixes normal cameras spooking non-chaplains even when they don't capture any ghosts" diff --git a/html/changelogs/AutoChangeLog-pr-11423.yml b/html/changelogs/AutoChangeLog-pr-11423.yml deleted file mode 100644 index 9a9b2e72118..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11423.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "Fixed a runtime in job_exp.dm" diff --git a/html/changelogs/AutoChangeLog-pr-11424.yml b/html/changelogs/AutoChangeLog-pr-11424.yml deleted file mode 100644 index a7cf15d901b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11424.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fethas" -delete-after: True -changes: - - bugfix: "Cluwne suits should no longer fall off cluwnes from being fat." diff --git a/html/changelogs/__CHANGELOG_README.txt b/html/changelogs/__CHANGELOG_README.txt index 8f610ee9acf..2e919a6226d 100644 --- a/html/changelogs/__CHANGELOG_README.txt +++ b/html/changelogs/__CHANGELOG_README.txt @@ -15,5 +15,3 @@ TO MAKE A CHANGELOG .YML ENTRRY 5. When commiting make sure your .yml file is included in the commit (it will usually be unticked as an unversioned file) ####################################################### - -If you have trouble ask for help in #codertrain on the Paradise Station IRC. diff --git a/tools/ss13_genchangelog.py b/tools/ss13_genchangelog.py index ed76aa9c6c6..18634d34832 100644 --- a/tools/ss13_genchangelog.py +++ b/tools/ss13_genchangelog.py @@ -1,8 +1,15 @@ ''' +ss13_genchangelog.py - Generate changelog from YAML. + Usage: $ python ss13_genchangelog.py [--dry-run] html/changelog.html html/changelogs/ -ss13_genchangelog.py - Generate changelog from YAML. + Example (first use): + - Install python 2.7 + - run cmd.exe + - pip install pyyaml + - cd paradise github directory + - python tools/ss13_genchangelog.py html/changelog.html html/changelogs/ Copyright 2013 Rob "N3X15" Nelson From cddb0a8213994edf498282301c5b0907ad080294 Mon Sep 17 00:00:00 2001 From: Kyep Date: Thu, 2 May 2019 21:32:30 -0700 Subject: [PATCH 23/45] one level deeper --- code/_onclick/item_attack.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 5e6acad93a1..bed8c64b054 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -24,7 +24,7 @@ return FALSE /obj/attackby(obj/item/I, mob/living/user, params) - return ..() || (can_be_hit && istype(I) && I.attack_obj(src, user)) + return ..() || (can_be_hit && I.attack_obj(src, user)) /mob/living/attackby(obj/item/I, mob/living/user, params) user.changeNext_move(CLICK_CD_MELEE) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 21ff909796f..3838a52325f 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -87,10 +87,7 @@ if(operating || !density) return add_fingerprint(user) - if(!requiresID()) - user = null - - if(allowed(user)) + if(!requiresID() || allowed(user)) open_and_close() else do_animate("deny") @@ -217,7 +214,7 @@ return attack_hand(user) /obj/machinery/door/window/attack_hand(mob/user) - return attackby(user, user) + return bumpopen(user) /obj/machinery/door/window/emag_act(mob/user, obj/weapon) if(!operating && density && !emagged) From 6e79364b65665479f0db4015516c19bc4bd33b60 Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Fri, 3 May 2019 21:47:07 +0800 Subject: [PATCH 24/45] Here we go again --- _maps/map_files/RandomZLevels/spacehotel.dmm | 6 - code/__DEFINES/combat.dm | 6 - code/__DEFINES/mobs.dm | 7 + code/__DEFINES/snpc.dm | 23 - code/_globalvars/lists/mobs.dm | 3 +- code/controllers/Processes/npcai.dm | 41 - code/controllers/subsystem/idlenpcpool.dm | 41 + code/controllers/subsystem/mobs.dm | 7 +- code/controllers/subsystem/npcai.dm | 24 - code/controllers/subsystem/npcpool.dm | 140 +-- code/controllers/verbs.dm | 6 +- code/game/atoms_movable.dm | 12 +- code/game/gamemodes/blob/blobs/core.dm | 7 +- .../gamemodes/miniantags/abduction/gland.dm | 63 -- code/game/machinery/vending.dm | 2 + code/modules/admin/admin_verbs.dm | 30 - code/modules/admin/player_panel.dm | 5 +- .../awaymissions/mission_code/spacehotel.dm | 26 +- .../mission_code/spacehotel_npcs.dm | 132 --- code/modules/awaymissions/snpc.dm | 85 -- code/modules/mining/minebot.dm | 2 +- code/modules/mining/satchel_ore_boxdm.dm | 3 + code/modules/mob/dead/dead.dm | 2 +- .../mob/living/carbon/human/examine.dm | 10 +- .../carbon/human/interactive/functions.dm | 874 ---------------- .../carbon/human/interactive/interactive.dm | 960 ------------------ .../carbon/human/interactive/prefabs.dm | 24 - code/modules/mob/living/life.dm | 9 + code/modules/mob/living/living.dm | 21 + code/modules/mob/living/login.dm | 4 + code/modules/mob/living/logout.dm | 1 + code/modules/mob/living/silicon/ai/ai.dm | 8 +- .../living/simple_animal/friendly/corgi.dm | 4 +- .../living/simple_animal/friendly/mouse.dm | 3 +- .../mob/living/simple_animal/friendly/pug.dm | 2 +- .../living/simple_animal/hostile/hostile.dm | 50 +- .../simple_animal/hostile/mining_mobs.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 62 +- .../mob/living/simple_animal/spawner.dm | 2 +- code/modules/mob/mob_defines.dm | 1 + code/modules/mob/new_player/new_player.dm | 12 +- code/modules/pda/cart_apps.dm | 2 +- code/modules/shuttle/on_move.dm | 13 +- code/modules/shuttle/shuttle.dm | 2 +- paradise.dme | 9 +- strings/npc_chatter.json | 137 --- 46 files changed, 262 insertions(+), 2623 deletions(-) delete mode 100644 code/__DEFINES/snpc.dm delete mode 100644 code/controllers/Processes/npcai.dm create mode 100644 code/controllers/subsystem/idlenpcpool.dm delete mode 100644 code/controllers/subsystem/npcai.dm delete mode 100644 code/modules/awaymissions/mission_code/spacehotel_npcs.dm delete mode 100644 code/modules/awaymissions/snpc.dm delete mode 100644 code/modules/mob/living/carbon/human/interactive/functions.dm delete mode 100644 code/modules/mob/living/carbon/human/interactive/interactive.dm delete mode 100644 code/modules/mob/living/carbon/human/interactive/prefabs.dm delete mode 100644 strings/npc_chatter.json diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm index 73d86c17201..56df786fab5 100644 --- a/_maps/map_files/RandomZLevels/spacehotel.dmm +++ b/_maps/map_files/RandomZLevels/spacehotel.dmm @@ -3125,7 +3125,6 @@ }, /area/awaymission/spacehotel/kitchen) "gE" = ( -/mob/living/carbon/human/interactive/away/hotel/chef, /turf/unsimulated/floor{ icon_state = "cafeteria" }, @@ -3278,7 +3277,6 @@ }, /area/awaymission/spacehotel) "ha" = ( -/mob/living/carbon/human/interactive/away/hotel/bartender, /turf/unsimulated/floor{ icon_state = "whiteyellowfull" }, @@ -4135,9 +4133,6 @@ /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "jm" = ( -/obj/effect/spawner/snpc_squad{ - squad_type = /mob/living/carbon/human/interactive/away/hotel/guard - }, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel) "jn" = ( @@ -4489,7 +4484,6 @@ /obj/structure/chair{ dir = 8 }, -/mob/living/carbon/human/interactive/away/hotel/concierge, /turf/unsimulated/floor/carpet, /area/awaymission/spacehotel/reception) "kk" = ( diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index ba4bf0090c7..a8c6b4bd5e8 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -52,12 +52,6 @@ #define GRAB_UPGRADING 4 #define GRAB_KILL 5 - -//Hostile Mob AI Status -#define AI_ON 1 -#define AI_IDLE 2 -#define AI_OFF 3 - //Attack types for checking shields/hit reactions #define MELEE_ATTACK 1 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 0f05c08b2f7..284b0e4d745 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -94,6 +94,13 @@ #define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY|APPEARANCE_ALT_HEAD #define APPEARANCE_ALL 32767 +//If you add a new status, be sure to add a list for it to the simple_animals global in _globalvars/lists/mobs.dm +//Hostile Mob AI Status +#define AI_ON 1 +#define AI_IDLE 2 +#define AI_OFF 3 +#define AI_Z_OFF 4 + // Intents #define INTENT_HELP "help" #define INTENT_DISARM "disarm" diff --git a/code/__DEFINES/snpc.dm b/code/__DEFINES/snpc.dm deleted file mode 100644 index 8d4768005cd..00000000000 --- a/code/__DEFINES/snpc.dm +++ /dev/null @@ -1,23 +0,0 @@ -#define SNPC_MAX_RANGE_FIND 32 -#define SNPC_MIN_RANGE_FIND 16 -#define SNPC_FUZZY_CHANCE_HIGH 85 -#define SNPC_FUZZY_CHANCE_LOW 50 -#define SNPC_CHANCE_TALK 15 - -#define SNPC_BRUTE 1 -#define SNPC_STEALTH 2 -#define SNPC_MARTYR 3 -#define SNPC_PSYCHO 4 - -#define SNPC_INTERACTING 2 -#define SNPC_TRAVEL 4 -#define SNPC_FIGHTING 8 -#define SNPC_SPECIAL 16 - -#define TRAIT_ROBUST 2 -#define TRAIT_UNROBUST 4 -#define TRAIT_SMART 8 -#define TRAIT_DUMB 16 -#define TRAIT_MEAN 32 -#define TRAIT_FRIENDLY 64 -#define TRAIT_THIEVING 128 \ No newline at end of file diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 551b729028e..b6fcae25061 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -22,8 +22,7 @@ GLOBAL_LIST_INIT(living_mob_list, list()) //List of all alive mobs, including GLOBAL_LIST_INIT(dead_mob_list, list()) //List of all dead mobs, including clientless. Excludes /mob/new_player GLOBAL_LIST_INIT(respawnable_list, list()) //List of all mobs, dead or in mindless creatures that still be respawned. GLOBAL_LIST_INIT(non_respawnable_keys, list()) //List of ckeys that are excluded from respawning for remainder of round. -GLOBAL_LIST_INIT(simple_animal_list, list()) //List of all simple animals, including clientless -GLOBAL_LIST_INIT(snpc_list, list()) //List of all snpc's, including clientless +GLOBAL_LIST_INIT(simple_animals, list(list(), list(), list(), list())) //One for each AI_* status define, List of all simple animals, including clientless GLOBAL_LIST_INIT(bots_list, list()) //List of all bots(beepsky, medibots,etc) GLOBAL_LIST_INIT(med_hud_users, list()) diff --git a/code/controllers/Processes/npcai.dm b/code/controllers/Processes/npcai.dm deleted file mode 100644 index 127429efd34..00000000000 --- a/code/controllers/Processes/npcai.dm +++ /dev/null @@ -1,41 +0,0 @@ -var/global/datum/controller/process/npcai/npcai_master - -/datum/controller/process/npcai - var/current_cycle - -/datum/controller/process/npcai/setup() - name = "npc ai" - schedule_interval = 20 // every 2 seconds - start_delay = 16 - log_startup_progress("NPC ticker starting up.") - -/datum/controller/process/npcai/started() - ..() - if(!GLOB.simple_animal_list) - GLOB.simple_animal_list = list() - if(!GLOB.snpc_list) - GLOB.snpc_list = list() - -/datum/controller/process/npcai/statProcess() - ..() - stat(null, "[GLOB.simple_animal_list.len] simple animals") - stat(null, "[GLOB.snpc_list.len] SNPC's") - -/datum/controller/process/npcai/doWork() - for(last_object in GLOB.simple_animal_list) - var/mob/living/simple_animal/M = last_object - if(istype(M) && !QDELETED(M)) - if(!M.client && M.stat == CONSCIOUS) - try - M.process_ai() - catch(var/exception/e) - catchException(e, M) - SCHECK - else - catchBadType(M) - GLOB.simple_animal_list -= M - - current_cycle++ - - -DECLARE_GLOBAL_CONTROLLER(npcai, npcai_master) diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm new file mode 100644 index 00000000000..2dad0abca0f --- /dev/null +++ b/code/controllers/subsystem/idlenpcpool.dm @@ -0,0 +1,41 @@ +SUBSYSTEM_DEF(idlenpcpool) + name = "Idling NPC Pool" + flags = SS_POST_FIRE_TIMING|SS_BACKGROUND + priority = FIRE_PRIORITY_IDLE_NPC + wait = 60 + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/list/currentrun = list() + var/static/list/idle_mobs_by_zlevel[][] + +/datum/controller/subsystem/idlenpcpool/stat_entry() + var/list/idlelist = GLOB.simple_animals[AI_IDLE] + var/list/zlist = GLOB.simple_animals[AI_Z_OFF] + ..("IdleNPCS:[idlelist.len]|Z:[zlist.len]") + +/datum/controller/subsystem/idlenpcpool/Initialize(start_timeofday) + idle_mobs_by_zlevel = new /list(world.maxz,0) + return ..() + +/datum/controller/subsystem/idlenpcpool/fire(resumed = FALSE) + if(!resumed) + var/list/idlelist = GLOB.simple_animals[AI_IDLE] + src.currentrun = idlelist.Copy() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + + while(currentrun.len) + var/mob/living/simple_animal/SA = currentrun[currentrun.len] + --currentrun.len + if(!SA) + GLOB.simple_animals[AI_IDLE] -= SA + continue + + if(!SA.ckey) + if(SA.stat != DEAD) + SA.handle_automated_movement() + if(SA.stat != DEAD) + SA.consider_wakeup() + if(MC_TICK_CHECK) + return \ No newline at end of file diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm index d19396af767..20061d7489b 100644 --- a/code/controllers/subsystem/mobs.dm +++ b/code/controllers/subsystem/mobs.dm @@ -1,14 +1,19 @@ SUBSYSTEM_DEF(mobs) name = "Mobs" priority = FIRE_PRIORITY_MOBS - flags = SS_KEEP_TIMING | SS_NO_INIT + flags = SS_KEEP_TIMING runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME var/list/currentrun = list() + var/static/list/clients_by_zlevel[][] /datum/controller/subsystem/mobs/stat_entry() ..("P:[GLOB.mob_list.len]") +/datum/controller/subsystem/mobs/Initialize(start_timeofday) + clients_by_zlevel = new /list(world.maxz,0) + return ..() + /datum/controller/subsystem/mobs/fire(resumed = 0) var/seconds = wait * 0.1 if(!resumed) diff --git a/code/controllers/subsystem/npcai.dm b/code/controllers/subsystem/npcai.dm deleted file mode 100644 index f8fa3a5aa0f..00000000000 --- a/code/controllers/subsystem/npcai.dm +++ /dev/null @@ -1,24 +0,0 @@ -SUBSYSTEM_DEF(npcai) - name = "NPC AI" // Simple AI controller, isolated from the SNPC one (NPCPool). - flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND - priority = FIRE_PRIORITY_NPC - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - var/list/simple_animal_list = list() - -/datum/controller/subsystem/npcai/stat_entry() - ..("SimAnimals:[simple_animal_list.len]") - -/datum/controller/subsystem/npcai/fire(resumed = FALSE) - if(!resumed) - src.simple_animal_list = simple_animal_list.Copy() - for(var/mob/living/simple_animal/M in simple_animal_list) - if(istype(M) && !QDELETED(M)) - if(!M.client && M.stat == CONSCIOUS) - M.process_ai() - if(MC_TICK_CHECK) - return - else - simple_animal_list -= M - -/datum/controller/subsystem/npcai/Recover() - simple_animal_list = SSnpcai.simple_animal_list \ No newline at end of file diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index b06d33f6f32..0de306b12eb 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -1,127 +1,33 @@ -#define PROCESSING_NPCS 0 -#define PROCESSING_DELEGATES 1 -#define PROCESSING_ASSISTANTS 2 - SUBSYSTEM_DEF(npcpool) - name = "NPC Pool" - flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND - priority = FIRE_PRIORITY_NPC - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + name = "NPC Pool" + flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND + priority = FIRE_PRIORITY_NPC + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - var/list/canBeUsed = list() - var/list/needsDelegate = list() - var/list/needsAssistant = list() - - var/list/processing = list() - var/list/currentrun = list() - var/stage + var/list/currentrun = list() /datum/controller/subsystem/npcpool/stat_entry() - ..("NPCS:[processing.len]|D:[needsDelegate.len]|A:[needsAssistant.len]|U:[canBeUsed.len]") - -/datum/controller/subsystem/npcpool/proc/stop_processing(mob/living/carbon/human/interactive/I) - processing -= I - currentrun -= I - needsDelegate -= I - canBeUsed -= I - needsAssistant -= I + var/list/activelist = GLOB.simple_animals[AI_ON] + ..("SimpleAnimals:[activelist.len]") /datum/controller/subsystem/npcpool/fire(resumed = FALSE) - //bot delegation and coordination systems - //General checklist/Tasks for delegating a task or coordinating it (for SNPCs) - // 1. Bot proximity to task target: if too far, delegate, if close, coordinate - // 2. Bot Health/status: check health with bots in local area, if their health is higher, delegate task to them, else coordinate - // 3. Process delegation: if a bot (or bots) has been delegated, assign them to the task. - // 4. Process coordination: if a bot(or bots) has been asked to coordinate, assign them to help. - // 5. Do all assignments: goes through the delegated/coordianted bots and assigns the right variables/tasks to them. - if (!resumed) - currentrun = processing.Copy() - stage = PROCESSING_NPCS - //cache for sanic speed (lists are references anyways) - var/list/cachecurrentrun = currentrun - var/list/cachecanBeUsed = canBeUsed + if(!resumed) + var/list/activelist = GLOB.simple_animals[AI_ON] + src.currentrun = activelist.Copy() - if(stage == PROCESSING_NPCS) - while(cachecurrentrun.len) - var/mob/living/carbon/human/interactive/thing = cachecurrentrun[cachecurrentrun.len] - --cachecurrentrun.len + var/list/currentrun = src.currentrun - thing.InteractiveProcess() + while(currentrun.len) + var/mob/living/simple_animal/SA = currentrun[currentrun.len] + --currentrun.len - var/checkInRange = view(SNPC_MAX_RANGE_FIND,thing) - if(thing.IsDeadOrIncap(FALSE) || !(locate(thing.TARGET) in checkInRange)) - needsDelegate += thing - else if(thing.doing & SNPC_FIGHTING) - needsAssistant += thing - else - cachecanBeUsed += thing - - if (MC_TICK_CHECK) - return - stage = PROCESSING_DELEGATES - cachecurrentrun = needsDelegate //localcache - currentrun = cachecurrentrun - - if(stage == PROCESSING_DELEGATES) - while(cachecurrentrun.len && cachecanBeUsed.len) - var/mob/living/carbon/human/interactive/check = cachecurrentrun[cachecurrentrun.len] - var/mob/living/carbon/human/interactive/candidate = cachecanBeUsed[cachecanBeUsed.len] - --cachecurrentrun.len - - var/helpProb = 0 - var/list/chfac = check.faction - var/list/canfac = candidate.faction - var/facCount = LAZYLEN(chfac) * LAZYLEN(canfac) - - for(var/C in chfac) - if(C in canfac) - helpProb = min(100,helpProb + 25) - if(helpProb >= 100) - break - - if(facCount == 1 && helpProb) - helpProb = 100 - - if(prob(helpProb) && candidate.takeDelegate(check)) - --cachecanBeUsed.len - candidate.change_eye_color(255, 0, 0) - candidate.update_icons() - - if(MC_TICK_CHECK) - return - stage = PROCESSING_ASSISTANTS - cachecurrentrun = needsAssistant //localcache - currentrun = cachecurrentrun - - //no need for the stage check - - while(cachecurrentrun.len && cachecanBeUsed.len) - var/mob/living/carbon/human/interactive/check = cachecurrentrun[cachecurrentrun.len] - var/mob/living/carbon/human/interactive/candidate = cachecanBeUsed[cachecanBeUsed.len] - --cachecurrentrun.len - - var/helpProb = 0 - var/list/chfac = check.faction - var/list/canfac = candidate.faction - var/facCount = LAZYLEN(chfac) * LAZYLEN(canfac) - - for(var/C in chfac) - if(C in canfac) - helpProb = min(100,helpProb + 25) - if(helpProb >= 100) - break - - if(facCount == 1 && helpProb) - helpProb = 100 - - if(prob(helpProb) && candidate.takeDelegate(check,FALSE)) - --cachecanBeUsed.len - candidate.change_eye_color(255, 255, 0) - candidate.update_icons() - - if(!cachecurrentrun.len || MC_TICK_CHECK) //don't change SS state if it isn't necessary - return - -/datum/controller/subsystem/npcpool/Recover() - processing = SSnpcpool.processing \ No newline at end of file + if(!SA.ckey && !SA.notransform) + if(SA.stat != DEAD) + SA.handle_automated_movement() + if(SA.stat != DEAD) + SA.handle_automated_action() + if(SA.stat != DEAD) + SA.handle_automated_speech() + if(MC_TICK_CHECK) + return \ No newline at end of file diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index eeef65bd2e2..b23c9fe030a 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -80,9 +80,9 @@ if("Mob") debug_variables(SSmobs) feedback_add_details("admin_verb","DMob") - if("NPC AI") - debug_variables(SSnpcai) - feedback_add_details("admin_verb","DNPCAI") + if("NPC Pool") + debug_variables(SSnpcpool) + feedback_add_details("admin_verb","DNPCPool") if("Shuttle") debug_variables(SSshuttle) feedback_add_details("admin_verb","DShuttle") diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2d3f01a139d..e962365451e 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -219,7 +219,12 @@ destination.Entered(src) for(var/atom/movable/AM in destination) AM.Crossed(src) - + var/turf/oldturf = get_turf(old_loc) + var/turf/destturf = get_turf(destination) + var/old_z = (oldturf ? oldturf.z : null) + var/dest_z = (destturf ? destturf.z : null) + if(old_z != dest_z) + onTransitZ(old_z, dest_z) if(isturf(destination) && opacity) var/turf/new_loc = destination new_loc.reconsider_lights() @@ -232,6 +237,11 @@ return 1 +/atom/movable/proc/onTransitZ(old_z,new_z) + for(var/item in src) // Notify contents of Z-transition. This can be overridden IF we know the items contents do not care. + var/atom/movable/AM = item + AM.onTransitZ(old_z,new_z) + /mob/living/forceMove(atom/destination) if(buckled) addtimer(CALLBACK(src, .proc/check_buckled), 1, TIMER_UNIQUE) diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index bd934eefb44..0482a8e19ae 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -135,4 +135,9 @@ else log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks a overmind.mind.") else - log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks an overmind.") \ No newline at end of file + log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks an overmind.") + +/obj/structure/blob/core/onTransitZ(old_z, new_z) + if(overmind && is_station_level(new_z)) + overmind.forceMove(get_turf(src)) + return ..() \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index fbe1774525f..2b0162829e1 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -320,69 +320,6 @@ for(var/mob/living/carbon/human/H in oview(3,owner)) //Blood decals for simple animals would be neat. aka Carp with blood on it. H.add_mob_blood(owner) -/obj/item/organ/internal/heart/gland/bodysnatch - cooldown_low = 600 - cooldown_high = 600 - human_only = 1 - uses = 1 - -/obj/item/organ/internal/heart/gland/bodysnatch/activate() - to_chat(owner, "You feel something moving around inside you...") - //spawn cocoon with clone greytide snpc inside - if(ishuman(owner)) - var/obj/effect/cocoon/abductor/C = new (get_turf(owner)) - C.Copy(owner) - C.Start() - owner.adjustBruteLoss(40) - owner.add_splatter_floor() - -/obj/effect/cocoon/abductor - name = "slimy cocoon" - desc = "Something is moving inside." - icon = 'icons/effects/effects.dmi' - icon_state = "cocoon_large3" - color = rgb(10,120,10) - density = 1 - var/hatch_time = 0 - -/obj/effect/cocoon/abductor/proc/Copy(mob/living/carbon/human/H) - var/mob/living/carbon/human/interactive/greytide/clone = new(src) - var/datum/dna/owner_dna = H.dna - clone.rename_character(clone.name, owner_dna.real_name) - clone.set_species(owner_dna.species.type) - clone.dna = owner_dna.Clone() - clone.body_accessory = H.body_accessory - domutcheck(clone) - - for(var/obj/item/I in clone) - if(istype(I, /obj/item/implant)) - continue - if(istype(I, /obj/item/organ)) - continue - qdel(I) - - //There's no define for this / get all items ? - var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\ - slot_wear_mask,slot_head,slot_shoes,slot_gloves,slot_l_ear,slot_r_ear,\ - slot_glasses,slot_belt,slot_s_store,slot_l_store,slot_r_store,slot_wear_id,slot_wear_pda) - - for(var/slot in slots) - var/obj/item/I = H.get_item_by_slot(slot) - if(I) - clone.equip_to_slot_or_del(new I.type(clone), slot) - -/obj/effect/cocoon/abductor/proc/Start() - hatch_time = world.time + 600 - START_PROCESSING(SSobj, src) - -/obj/effect/cocoon/abductor/process() - if(world.time > hatch_time) - STOP_PROCESSING(SSobj, src) - for(var/mob/M in contents) - src.visible_message("[src] hatches!") - M.forceMove(get_turf(src)) - qdel(src) - /obj/item/organ/internal/heart/gland/plasma cooldown_low = 1200 diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index d0872fa8f93..dc4b9124d77 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -741,6 +741,8 @@ throw_item.throw_at(target, 16, 3, src) visible_message("[src] launches [throw_item.name] at [target.name]!") +/obj/machinery/vending/onTransitZ() + return /* * Vending machine types */ diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 6b4072a800b..4a455cd8e5d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -72,7 +72,6 @@ var/list/admin_verbs_admin = list( /client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */ /client/proc/change_human_appearance_self, /* Allows the human-based mob itself change its basic appearance */ /client/proc/debug_variables, - /client/proc/show_snpc_verbs, /client/proc/reset_all_tcs, /*resets all telecomms scripts*/ /client/proc/toggle_mentor_chat, /client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/ @@ -216,11 +215,6 @@ var/list/admin_verbs_proccall = list( /client/proc/callproc_datum, /client/proc/SDQL2_query ) -var/list/admin_verbs_snpc = list( - /client/proc/resetSNPC, - /client/proc/customiseSNPC, - /client/proc/hide_snpc_verbs -) var/list/admin_verbs_ticket = list( /client/proc/openAdminTicketUI, /client/proc/toggleticketlogs, @@ -291,8 +285,6 @@ var/list/admin_verbs_ticket = list( admin_verbs_proccall, admin_verbs_show_debug_verbs, /client/proc/readmin, - admin_verbs_snpc, - /client/proc/hide_snpc_verbs, admin_verbs_ticket ) @@ -1013,28 +1005,6 @@ var/list/admin_verbs_ticket = list( log_admin("[key_name(usr)] told everyone to man up and deal with it.") message_admins("[key_name_admin(usr)] told everyone to man up and deal with it.") -/client/proc/show_snpc_verbs() - set name = "Show SNPC Verbs" - set category = "Admin" - - if(!check_rights(R_ADMIN)) - return - - verbs += admin_verbs_snpc - verbs -= /client/proc/show_snpc_verbs - to_chat(src, "SNPC verbs have been toggled on.") - -/client/proc/hide_snpc_verbs() - set name = "Hide SNPC Verbs" - set category = "Admin" - - if(!check_rights(R_ADMIN)) - return - - verbs -= admin_verbs_snpc - verbs += /client/proc/show_snpc_verbs - to_chat(src, "SNPC verbs have been toggled off.") - /client/proc/toggle_advanced_interaction() set name = "Toggle Advanced Admin Interaction" set category = "Admin" diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 36c0e5cf90d..970defdd672 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -390,10 +390,7 @@ /datum/admins/proc/check_antagonists_line(mob/M, caption = "", close = 1) var/logout_status - if(istype(M, /mob/living/carbon/human/interactive)) - logout_status = " (snpc)" - else - logout_status = M.client ? "" : " (logged out)" + logout_status = M.client ? "" : " (logged out)" var/dname = M.real_name if(!dname) dname = M diff --git a/code/modules/awaymissions/mission_code/spacehotel.dm b/code/modules/awaymissions/mission_code/spacehotel.dm index 0328dea5b53..fc8b4f4d260 100644 --- a/code/modules/awaymissions/mission_code/spacehotel.dm +++ b/code/modules/awaymissions/mission_code/spacehotel.dm @@ -152,14 +152,6 @@ /obj/machinery/door/unpowered/hotel_door/autoclose() if(!density && !operating && autoclose) close() - -/obj/machinery/door/unpowered/hotel_door/emag_act(mob/user) - if(isliving(user) && density) - var/obj/effect/hotel_controller/H - if(H.controller) - H.controller.deploy_sec(user) - ..() - /obj/item/card/hotel_card name = "Key Card" icon_state = "guest" @@ -283,20 +275,4 @@ spawn(300) if(D.occupant == deadbeat) // they still haven't checked out... - deploy_sec(deadbeat) - checkout(roomid) - -/obj/effect/hotel_controller/proc/deploy_sec(mob/living/target) - if(!istype(target) || !istype(get_area(target), /area/awaymission/spacehotel)) - return - - var/list/secs[0] - for(var/mob/living/carbon/human/interactive/away/hotel/guard/M in get_area(src)) - if(!M.retal) - secs += M - var/mob/living/carbon/human/interactive/away/hotel/guard/S = safepick(secs) - if(!S) - return - - S.retal_target = target - S.retal = 1 + checkout(roomid) \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm b/code/modules/awaymissions/mission_code/spacehotel_npcs.dm deleted file mode 100644 index 2a524ab738c..00000000000 --- a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm +++ /dev/null @@ -1,132 +0,0 @@ -/mob/living/carbon/human/interactive/away/hotel - away_area = /area/awaymission/spacehotel - override_under = /obj/item/clothing/under/mafia - chattyness = SNPC_CHANCE_TALK / 4 - -/mob/living/carbon/human/interactive/away/hotel/Initialize(mapload) - . = ..(mapload, /datum/species/skrell) - -/mob/living/carbon/human/interactive/away/hotel/doSetup() - ..() - MYID.access = list(access_syndicate) - RPID.access = list(access_syndicate) - -/mob/living/carbon/human/interactive/away/hotel/guard - default_job = /datum/job/officer - -/mob/living/carbon/human/interactive/away/hotel/guard/doSetup() - ..("Guard") - - // anti-pinata cheese - var/obj/item/implant/dust/D = new /obj/item/implant/dust(src) - D.implant(src) - - for(var/obj/item/I in get_all_slots()) - I.flags |= NODROP - -/mob/living/carbon/human/interactive/away/hotel/guard/KnockOut() - // you'll never take me alive (this triggers the implant) - emote("deathgasp") - if(stat != DEAD) - // mission failed. we'll get em next time - ..() - -/mob/living/carbon/human/interactive/away/hotel/chef - default_job = /datum/job/chef - away_area = /area/awaymission/spacehotel/kitchen - override_under = /obj/item/clothing/under/mafia/vest - -/mob/living/carbon/human/interactive/away/hotel/bartender - default_job = /datum/job/bartender - override_under = /obj/item/clothing/under/mafia/vest - -/mob/living/carbon/human/interactive/away/hotel/concierge - override_under = /obj/item/clothing/under/mafia/white - away_area = /area/awaymission/spacehotel/reception - var/list/known_guests[0] - var/obj/effect/hotel_controller/hotel - var/obj/item/card/id/last_seen_id = null - -/mob/living/carbon/human/interactive/away/hotel/concierge/random() - ..() - equip_or_collect(new /obj/item/clipboard(src), slot_l_hand) - -/mob/living/carbon/human/interactive/away/hotel/concierge/doSetup() - ..("Concierge") - -/mob/living/carbon/human/interactive/away/hotel/concierge/setup_job() - favoured_types = list(/obj/item/paper, /obj/item/clipboard) - functions += list("stamping", "concierge") - restrictedJob = 1 - -/mob/living/carbon/human/interactive/away/hotel/concierge/proc/concierge() - if(!hotel) - hotel = hotel.controller - if(!hotel) - return - - var/verbs_use = pick_list(speak_file, "verbs_use") - var/verbs_touch = pick_list(speak_file, "verbs_touch") - var/verbs_move = pick_list(speak_file, "verbs_move") - var/nouns_generic = pick_list(speak_file, "nouns_generic") - var/adjective_insult = pick_list(speak_file, "adjective_insult") - var/adjective_objects = pick_list(speak_file, "adjective_objects") - var/adjective_generic = pick_list(speak_file, "adjective_generic") - var/curse_words = pick_list(speak_file, "curse_words") - - var/found = 0 - for(var/mob/living/carbon/human/H in nearby - known_guests) - pointed(H) - known_guests += H - found = 1 - if(found) - say("Welcome to [hotel], [nouns_generic]! Please check in by [ing_verb(verbs_move)] and [ing_verb(verbs_use)] your [adjective_objects] ID onto the table.") - return - - var/obj/item/card/id - var/id_seen = 0 - for(var/obj/item/card/id/I in get_area(src)) - id_seen = 1 - if(I != last_seen_id) - id = I - if(!id_seen) - last_seen_id = null - return - if(!id) - return - var/turf/idloc = get_turf(id) - if(!Adjacent(idloc)) - tryWalk(idloc) - else - // is the last jerk that touched it over here? - var/mob/id_owner - for(var/mob/living/carbon/human/H in nearby) - if(H.ckey == id.fingerprintslast) - id_owner = H - break - - if(!id_owner) - say("Whose card is this?") - pointed(id) - return - - last_seen_id = id - // Checking in or out? - if(id_owner in hotel.guests) - // Check out - say ("Hope you enjoyed your [adjective_objects] stay at our [adjective_generic] hotel!") - hotel.checkout(hotel.guests[id_owner]) - else - // pick a room - var/obj/machinery/door/unpowered/hotel_door/D = safepick(hotel.vacant_rooms) - if(!D) - say("Sorry, all the [adjective_objects] are occupied currently.") - else - // Check in - say("$100 per 10 minutes. The cost will be automatically [past_verb(verbs_touch)] while you're checked in.") - - var/obj/item/card/hotel_card/K = hotel.checkin(D.id, id_owner, id) - if(K) - K.forceMove(idloc) - else - say("Your [adjective_insult] [curse_words] card was rejected.") diff --git a/code/modules/awaymissions/snpc.dm b/code/modules/awaymissions/snpc.dm deleted file mode 100644 index 8d65aa44a92..00000000000 --- a/code/modules/awaymissions/snpc.dm +++ /dev/null @@ -1,85 +0,0 @@ -/mob/living/carbon/human/interactive/away - var/away_area = /area/awaymission // their overriden job area - var/override_under = null // optional type for uniform, else default for job - var/squad_member = 0 // was spawned by squad - var/home_z - -/mob/living/carbon/human/interactive/away/Initialize(mapload) - . = ..() - TRAITS |= TRAIT_ROBUST - faction += "away" - -/mob/living/carbon/human/interactive/away/random() - ..() - // a little hacky but it should prevent doubled uniforms - if(ispath(override_under, /obj/item/clothing/under)) - var/old_under = w_uniform - w_uniform = null - equip_to_slot(new override_under(src), slot_w_uniform) - qdel(old_under) - -/mob/living/carbon/human/interactive/away/doSetup() - ..() - var/datum/data/pda/app/messenger/M = MYPDA.find_program(/datum/data/pda/app/messenger) - M.toff = 1 - -/mob/living/carbon/human/interactive/away/job2area() - return away_area - -/mob/living/carbon/human/interactive/away/doProcess() - if(!home_z) - home_z = get_turf(z) - if(home_z != get_turf(z)) - gib() - ..() - -/obj/effect/spawner/snpc_squad - name = "squad spawner" - icon = 'icons/mob/screen_gen.dmi' - icon_state = "x" - density = 0 - opacity = 0 - invisibility = 101 - var/squad_type = /mob/living/carbon/human/interactive/away - var/squad_size = 3 - - var/global/list/squads[0] - var/list/squad - -/obj/effect/spawner/snpc_squad/New() - START_PROCESSING(SSobj, src) - - squad = squads[squad_type] - if(!squad) - squad = list() - squads[squad_type] = squad - squad += src - -/obj/effect/spawner/snpc_squad/Destroy() - squad = null - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/effect/spawner/snpc_squad/process() - // check squad memebers - var/living = 0 - for(var/mob/living/carbon/human/interactive/away/A in squad) - if(!A.stat) - living++ - else - // see if anyone's looking, if not, despawn - var/can_despawn = 1 - for(var/mob/living/M in viewers(A, world.view + 1)) - if(M.client) - living++ // dead guy that can be seen still takes up a slot - can_despawn = 0 - break - if(can_despawn) - squad -= A - qdel(A) - - // spawn new ones - if(living < squad_size && !length(viewers(src, world.view))) - var/mob/living/carbon/human/interactive/away/A = new squad_type(loc) - squad += A - A.squad_member = 1 diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index cf8b897104c..17262ec4a7a 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -69,7 +69,7 @@ visible_message("[src] crackles and buzzes violently!") /mob/living/simple_animal/hostile/mining_drone/sentience_act() - AIStatus = AI_OFF + ..() check_friendly_fire = 0 /mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index 0edb81c8321..43bc1b57226 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -83,6 +83,9 @@ obj/structure/ore_box/ex_act(severity, target) O.forceMove(loc) CHECK_TICK +/obj/structure/ore_box/onTransitZ() + return + /obj/structure/ore_box/verb/empty_box() set name = "Empty Ore Box" set category = "Object" diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 922f3181c27..ca868b5e88f 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -20,4 +20,4 @@ for(var/datum/light_source/L in light_sources) L.source_atom.update_light() - return 1 + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index aa714f0d527..f16d04e3e86 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -315,15 +315,7 @@ msg += "[p_they(TRUE)] [p_have()] a stupid expression on [p_their()] face.\n" if(get_int_organ(/obj/item/organ/internal/brain)) - if(istype(src, /mob/living/carbon/human/interactive)) - var/mob/living/carbon/human/interactive/auto = src - if(auto.showexaminetext) - msg += "[p_they(TRUE)] [p_are()] appears to be some sort of sick automaton, [p_their()] eyes are glazed over and [p_their()] mouth is slightly agape.\n" - if(auto.debugexamine) - var/dodebug = auto.doing2string(auto.doing) - var/interestdebug = auto.interest2string(auto.interest) - msg += "[p_they(TRUE)] [p_are()] appears to be [interestdebug] and [dodebug].\n" - else if(dna.species.show_ssd) + if(dna.species.show_ssd) if(!key) msg += "[p_they(TRUE)] [p_are()] totally catatonic. The stresses of life in deep-space must have been too much for [p_them()]. Any recovery is unlikely.\n" else if(!client) diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm deleted file mode 100644 index 06df994df5f..00000000000 --- a/code/modules/mob/living/carbon/human/interactive/functions.dm +++ /dev/null @@ -1,874 +0,0 @@ -/mob/living/carbon/human/interactive/proc/chatter(obj) - var/verbs_use = pick_list(speak_file, "verbs_use") - var/verbs_touch = pick_list(speak_file, "verbs_touch") - var/verbs_move = pick_list(speak_file, "verbs_move") - var/nouns_insult = pick_list(speak_file, "nouns_insult") - var/nouns_generic = pick_list(speak_file, "nouns_generic") - var/nouns_objects = pick_list(speak_file, "nouns_objects") - var/nouns_body = pick_list(speak_file, "nouns_body") - var/adjective_insult = pick_list(speak_file, "adjective_insult") - var/adjective_objects = pick_list(speak_file, "adjective_objects") - var/adjective_generic = pick_list(speak_file, "adjective_generic") - var/curse_words = pick_list(speak_file, "curse_words") - - var/chatmsg = "" - - if(prob(10)) // 10% chance to broadcast it over the radio - chatmsg = ";" - - if(prob(chattyness) || knownStrings.len < 10) // say a generic phrase, otherwise draw from our strings. - if(doing & SNPC_INTERACTING) - if(prob(chattyness)) - chatmsg += pick("This [nouns_objects] is a little [adjective_objects].", - "Well [verbs_use] my [nouns_body], this [nouns_insult] is pretty [adjective_insult].", - "[capitalize(curse_words)], what am I meant to do with this [adjective_insult] [nouns_objects].") - else if(doing & SNPC_TRAVEL) - if(prob(chattyness)) - chatmsg += pick("Oh [curse_words], [verbs_move]!", - "Time to get my [adjective_generic] [adjective_insult] [nouns_body] elsewhere.", - "I wonder if there is anything to [verbs_use] and [verbs_touch] somewhere else..") - else if(doing & SNPC_FIGHTING) - if(prob(chattyness)) - chatmsg += pick("I'm going to [verbs_use] you, you [adjective_insult] [nouns_insult]!", - "Rend and [verbs_touch], Rend and [verbs_use]!", - "You [nouns_insult], I'm going to [verbs_use] you right in the [nouns_body]. JUST YOU WAIT!") - if(prob(chattyness/2)) - chatmsg = ";" - var/what = pick(1,2,3,4,5) - switch(what) - if(1) - chatmsg += "Well [curse_words], this is a [adjective_generic] situation." - if(2) - chatmsg += "Oh [curse_words], that [nouns_insult] was one hell of an [adjective_insult] [nouns_body]." - if(3) - chatmsg += "I want to [verbs_use] that [nouns_insult] when I find them." - if(4) - chatmsg += "[pick("Innocent","Guilty","Traitorous","Honk")] until proven [adjective_generic]!" - if(5) - var/toSay = "" - for(var/i = 0; i < 5; i++) - curse_words = pick_list(speak_file, "curse_words") - toSay += "[curse_words] " - chatmsg += "Hey [nouns_generic], why don't you go [copytext(toSay, 1, length(toSay))], you [nouns_insult]!" - else if(prob(chattyness)) - chatmsg += pick(knownStrings) - if(prob(25)) // cut out some phrases now and then to make sure we're fresh and new - knownStrings -= pick(chatmsg) - - if(chatmsg != ";" && chatmsg != "") - say(chatmsg) - -/mob/living/carbon/human/interactive/proc/traitor(obj) - - if(traitorType == SNPC_PSYCHO && nearby.len) - traitorTarget = pick(nearby) - - if(prob(traitorScale)) - if(!Adjacent(traitorTarget) && !(traitorType == SNPC_PSYCHO)) - tryWalk(get_turf(traitorTarget)) - else - switch(traitorType) - if(SNPC_BRUTE) - retal = 1 - retal_target = traitorTarget - if(SNPC_STEALTH) - if(istype(traitorTarget,/mob)) // it's inside something, lets kick their shit in - var/mob/M = traitorTarget - if(!M.stat) - retal = 1 - retal_target = traitorTarget - else - var/obj/item/I = traitorTarget - I.loc = get_turf(traitorTarget) // pull it outta them - else - take_to_slot(traitorTarget) - if(SNPC_MARTYR) - custom_emote(1, "[src]'s chest opens up, revealing a large mass of explosives and tangled wires!") - if(inactivity_period <= 0) - inactivity_period = 9999 // technically infinite - if(do_after(src, 60, target = traitorTarget)) - custom_emote(1, "A fire bursts from [src]'s eyes, igniting white hot and consuming [p_their()] body in a flaming explosion!") - explosion(src, 6, 6, 6) - else - inactivity_period = 0 - custom_emote(1, "[src]'s chest closes, hiding [p_their()] insides.") - if(SNPC_PSYCHO) - var/choice = pick(typesof(/obj/item/grenade/chem_grenade) - /obj/item/grenade/chem_grenade) - - new choice(src) - - retal = 1 - retal_target = traitorTarget - -/mob/living/carbon/human/interactive/proc/botany(obj) - if(shouldModulePass()) - return - - if(enforceHome()) - return - - var/list/allContents = getAllContents() - - var/obj/item/reagent_containers/glass/beaker/bluespace/internalBeaker = locate(/obj/item/reagent_containers/glass/beaker/bluespace) in allContents - var/obj/item/storage/bag/plants/internalBag = locate(/obj/item/storage/bag/plants) in allContents - - if(!internalBag) - internalBag = new/obj/item/storage/bag/plants(src) - if(!internalBeaker) - internalBeaker = new/obj/item/reagent_containers/glass/beaker/bluespace(src) - internalBeaker.name = "Grow-U-All Super Spray" - - if(internalBeaker && internalBag) - var/obj/machinery/hydroponics/HP - - //consider the appropriate target - var/list/considered = list() - - for(var/obj/machinery/hydroponics/tester in view(12,src)) - considered[tester] = 1 - - if(!tester.myseed) - considered[tester] += 50 - if(tester.weedlevel > 0) - considered[tester] += 5 - if(tester.pestlevel > 0) - considered[tester] += 5 - if(tester.nutrilevel < tester.maxnutri) - considered[tester] += 15 - if(tester.waterlevel < tester.maxwater) - considered[tester] += 15 - if(tester.harvest || tester.dead) - considered[tester] += 100 - considered[tester] = max(1, considered[tester] - get_dist(src,tester)) - - var/index = 0 - for(var/A in considered) - ++index - if(considered[A] > considered[HP] || !HP) - HP = considered[index] - - if(HP) - TARGET = HP - if(!Adjacent(HP)) - tryWalk(get_turf(HP)) - else - if(HP.harvest || HP.dead) - HP.attack_hand(src) - else if(!HP.myseed) - var/obj/item/seeds/SEED = new /obj/item/seeds/random(src) - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")] towards [TARGET], producing a [SEED]!") - HP.attackby(SEED, src) - else - var/change = 0 - if(HP.weedlevel > 0) - change = 1 - if(!internalBeaker.reagents.has_reagent("atrazine", 10)) - internalBeaker.reagents.add_reagent("atrazine", 10) - if(HP.pestlevel > 0) - change = 1 - if(!internalBeaker.reagents.has_reagent("diethylamine", 10)) - internalBeaker.reagents.add_reagent("diethylamine", 10) - if(HP.nutrilevel < HP.maxnutri) - change = 1 - if(!internalBeaker.reagents.has_reagent("eznutriment", 15)) - internalBeaker.reagents.add_reagent("eznutriment", 15) - if(!internalBeaker.reagents.has_reagent("diethylamine", 15)) - internalBeaker.reagents.add_reagent("diethylamine", 15) - if(HP.waterlevel < HP.maxwater) - change = 1 - if(!internalBeaker.reagents.has_reagent("holywater", 50)) - internalBeaker.reagents.add_reagent("holywater", 50) - if(change) - HP.attackby(internalBeaker,src) - - var/obj/item/reagent_containers/food/snacks/grown/GF = locate(/obj/item/reagent_containers/food/snacks/grown) in view(12,src) - if(GF) - if(!Adjacent(GF)) - tryWalk(get_turf(GF)) - else - GF.attackby(internalBag,src) - - if(internalBag.contents.len) - var/obj/machinery/smartfridge/SF = locate(/obj/machinery/smartfridge) in range(12, src) - if(!Adjacent(SF)) - tryWalk(get_turf(SF)) - else - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")], upending the [internalBag]'s contents all over the [SF]!") - //smartfridges call updateUsrDialog when you call attackby, so we're going to have to cheese-magic-space this - for(var/obj/toLoad in internalBag.contents) - if(contents.len >= SF.max_n_of_items) - break - if(SF.accept_check(toLoad)) - SF.load(toLoad, src) - else - qdel(toLoad) // destroy everything we dont need - -/mob/living/carbon/human/interactive/proc/bartend(obj) - if(shouldModulePass()) - return - - if(enforceHome()) - return - - var/list/rangeCheck = oview(6,src) - var/obj/structure/table/RT - - var/mob/living/carbon/human/serveTarget - - for(var/mob/living/carbon/human/H in rangeCheck) - if(!locate(/obj/item/reagent_containers/food/drinks) in orange(1, H)) - serveTarget = H - - - if(serveTarget) - RT = locate(/obj/structure/table) in orange(1, serveTarget) - - if(RT && serveTarget) - if(!Adjacent(RT)) - tryWalk(get_turf(RT)) - else - var/drinkChoice = pick(typesof(/obj/item/reagent_containers/food/drinks) - /obj/item/reagent_containers/food/drinks) - if(drinkChoice) - var/obj/item/reagent_containers/food/drinks/D = new drinkChoice(get_turf(src)) - RT.attackby(D,src) - say("[pick("Something to wet your whistle!","Down the hatch, a tasty beverage!","One drink, coming right up!","Tasty liquid for your oral intake!","Enjoy!")]") - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")], serving up a [D]!") - -/mob/living/carbon/human/interactive/proc/shitcurity(obj) - var/list/allContents = getAllContents() - - if(retal && TARGET) - if(Adjacent(TARGET)) - var/obj/item/restraints/R = locate() in allContents - if(R) - R.attack(TARGET, src) // go go bluespace restraint launcher! - else if(TARGET in oview(7, src)) - var/obj/item/gun/G = locate() in allContents - if(G) - G.afterattack(TARGET, src) - -/mob/living/carbon/human/interactive/proc/clowning(obj) - if(shouldModulePass()) - return - var/list/allContents = getAllContents() - var/list/rangeCheck = oview(12, src) - - var/mob/living/carbon/human/clownTarget - var/list/clownPriority = list() - - var/obj/item/reagent_containers/spray/S - if(!locate(/obj/item/reagent_containers/spray) in allContents) - new/obj/item/reagent_containers/spray(src) - else - S = locate(/obj/item/reagent_containers/spray) in allContents - - for(var/mob/living/carbon/human/C in rangeCheck) - var/pranksNearby = 100 - for(var/turf/simulated/T in orange(1, C)) - for(var/obj/item/A in T) - if(istype(A,/obj/item/soap) || istype(A,/obj/item/reagent_containers/food/snacks/grown/banana) || istype(A,/obj/item/grown/bananapeel)) - pranksNearby-- - if(T.wet) - pranksNearby -= 10 - clownPriority[C] = pranksNearby - - for(var/A in clownPriority) - if(!clownTarget) - clownTarget = A - else - if(clownPriority[A] > clownPriority[clownTarget]) - clownTarget = clownPriority[A] - - if(clownTarget) - if(!Adjacent(clownTarget)) - tryWalk(clownTarget) - else - var/hasPranked = 0 - for(var/A in allContents) - if(prob(smartness/2) && !hasPranked) - if(istype(A,/obj/item/soap)) - npcDrop(A) - hasPranked = 1 - if(istype(A,/obj/item/reagent_containers/food/snacks/grown/banana)) - var/obj/item/reagent_containers/food/snacks/B = A - B.attack(src, src) - if(istype(A,/obj/item/grown/bananapeel)) - npcDrop(A) - hasPranked = 1 - if(!hasPranked) - if(S.reagents.total_volume <= 5) - S.reagents.add_reagent("water", 25) - S.afterattack(get_turf(pick(orange(1, clownTarget))),src) - - -/mob/living/carbon/human/interactive/proc/healpeople(obj) - var/shouldTryHeal = 0 - var/obj/item/stack/medical/M - - var/list/allContents = getAllContents() - - for(var/A in allContents) - if(istype(A,/obj/item/stack/medical)) - shouldTryHeal = 1 - M = A - - var/obj/item/reagent_containers/hypospray/HPS - - if(!locate(/obj/item/reagent_containers/hypospray) in allContents) - new/obj/item/reagent_containers/hypospray(src) - else - HPS = locate(/obj/item/reagent_containers/hypospray) in allContents - if(!shouldTryHeal) - shouldTryHeal = 2 // we have no stackables to use, lets use our internal hypospray instead - - if(shouldTryHeal == 1) - for(var/mob/living/carbon/human/C in nearby) - if(istype(C,/mob/living/carbon/human)) //I haven't the foggiest clue why this is turning up non-carbons but sure here whatever - if(C.health <= 75) - if(get_dist(src,C) <= 2) - src.say("Wait, [C], let me heal you!") - M.attack(C,src) - sleep(25) - else - tryWalk(get_turf(C)) - else if(shouldTryHeal == 2) - if(HPS) - if(HPS.reagents.total_volume <= 0) - HPS.reagents.add_reagent("omnizine",30) - for(var/mob/living/carbon/human/C in nearby) - if(istype(C,/mob/living/carbon/human)) - if(C.health <= 75 && C.reagents.get_reagent_amount("omnizine") <= 0) // make sure they wont be overdosing - if(get_dist(src,C) <= 2) - src.say("Wait, [C], let me heal you!") - HPS.attack(C,src) - sleep(25) - else - tryWalk(get_turf(C)) - - -/mob/living/carbon/human/interactive/proc/dojanitor(obj) - if(shouldModulePass()) - return - var/list/allContents = getAllContents() - //now with bluespace magic! - var/obj/item/reagent_containers/spray/SP = locate() in allContents - if(!SP) - SP = new /obj/item/reagent_containers/spray(src) - var/obj/item/soap/SO = locate() in allContents - if(!SO) - SO = new /obj/item/soap(src) - - if(SP.reagents.total_volume <= 5) - SP.reagents.add_reagent("cleaner", 25) // bluespess water delivery for AI - - var/obj/effect/decal/cleanable/TC - TC = locate(/obj/effect/decal/cleanable) in view(6, src) - - if(TC) - if(!Adjacent(TC)) - tryWalk(TC) - else - var/turf/T = get_turf(TC) - if(T && !T.density) - SP.afterattack(TC, src, 1) - else - SO.afterattack(TC, src, 1) - qdel(TC) - -// START COOKING MODULE -/mob/living/carbon/human/interactive/proc/refundrecipe(list/ingredients) - for(var/obj/I in ingredients) - I.loc = contents - -// Ingredients may be in the rangeCheck or inside the chef's inventory. -// As they are checked off, they are moved to a seperate list as to not be counted twice -// If the recipe fails (eg somebody else took an ingredient before it was picked up) the ingredients are dumped back to inventory -// That way, the chef has a better chance of making a recipe next ptick, if he has more stuff on him -/mob/living/carbon/human/interactive/proc/makerecipe(datum/recipe/R, allContents, rangeCheck) - set background = 1 - - var/list/ingredients[0] - - for(var/P in R.items) - var/obj/item/I = locate(P) in allContents - if(I) - ingredients += I - I.forceMove(null) - continue - - I = locate(P) in rangeCheck - TARGET = I - if(I && !Adjacent(I)) - tryWalk(get_turf(I)) - sleep(get_dist(src, I)) - if(!I || !(I in rangeCheck)) - refundrecipe(ingredients) - return 0 - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")], picking up [I].") - ingredients += I - I.forceMove(null) - - // cheaply cook the ingredients into result - sleep(R.time) - for(var/obj/I in ingredients) - qdel(I) - ingredients.Cut() - var/result = new R.result(get_turf(src)) - custom_emote(1, "[pick("gibbers","drools","slobbers","claps wildly","spits")] and, with a bang, \a [result] is cooked!") - return 1 - -/mob/living/carbon/human/interactive/proc/souschef(obj) - if(shouldModulePass() || enforceHome() || prob(SNPC_FUZZY_CHANCE_HIGH) || prob(SNPC_FUZZY_CHANCE_HIGH)) - return - - if(doing & SNPC_SPECIAL) - return - doing |= SNPC_SPECIAL - - var/static/list/customableTypes = list(/obj/item/reagent_containers/food/snacks/customizable,/obj/item/reagent_containers/food/snacks/breadslice,/obj/item/reagent_containers/food/snacks/bun,/obj/item/reagent_containers/food/snacks/sliceable/flatdough,/obj/item/reagent_containers/food/snacks/boiledspaghetti,/obj/item/trash/plate,/obj/item/trash/bowl) - - var/static/list/rawtypes = list(/obj/item/reagent_containers/food/snacks/grown, /obj/item/reagent_containers/food/snacks/rawcutlet, /obj/item/reagent_containers/food/snacks/rawsticks, /obj/item/reagent_containers/food/snacks/salmonmeat, /obj/item/reagent_containers/food/snacks/carpmeat, /obj/item/reagent_containers/food/snacks/catfishmeat, /obj/item/reagent_containers/food/snacks/spaghetti, /obj/item/reagent_containers/food/snacks/dough, /obj/item/reagent_containers/food/snacks/sliceable/flatdough, /obj/item/reagent_containers/food/snacks/doughslice, /obj/item/reagent_containers/food/snacks/meat, /obj/item/reagent_containers/food/snacks/boiledrice, /obj/item/reagent_containers/food/snacks/cheesewedge, /obj/item/reagent_containers/food/snacks/raw_bacon) - - try - var/list/allContents = getAllContents() - var/list/rangeCheck = view(6, src) - - //Bluespace in some inbuilt tools - var/obj/item/kitchen/rollingpin/RP = locate() in allContents - if(!RP) - RP = new /obj/item/kitchen/rollingpin(src) - - var/obj/item/kitchen/knife/KK = locate() in allContents - if(!KK) - KK = new /obj/item/kitchen/knife(src) - - var/global/list/available_recipes - if(!available_recipes) - available_recipes = list() - for(var/type in subtypesof(/datum/recipe)) - var/datum/recipe/recipe = new type - if(recipe.result) // Ignore recipe subtypes that lack a result - available_recipes += recipe - else - qdel(recipe) - - var/foundCookable = 0 - - //Make some basic custom food - var/foundCustom - for(var/customType in customableTypes) - var/A = locate(customType) in rangeCheck - var/obj/item/reagent_containers/food/snacks/customizable/I = A - if(A && (!istype(I) || I.ingredients.len <= 3)) - foundCustom = A // this will eventually wittle down to 0 - break - - var/obj/machinery/smartfridge/SF = locate(/obj/machinery/smartfridge) in rangeCheck - if(SF) - if(SF.contents.len > 0) - if(!Adjacent(SF)) - tryWalk(get_turf(SF)) - else - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")], grabbing various foodstuffs from [SF] and sticking them in its mouth!") - for(var/obj/item/A in SF.contents) - if(prob(smartness/2)) - var/count = SF.item_quants[A.name] - if(count) - SF.item_quants[A.name] = count - 1 - A.forceMove(src) - - if(foundCustom) - var/obj/item/reagent_containers/food/snacks/FC = foundCustom - for(var/obj/item/reagent_containers/food/snacks/toMake in allContents) - if(prob(smartness)) - if(FC.reagents) - if(toMake.reagents) - var/raw = 0 - for(var/type in rawtypes) - if(istype(toMake, type)) - raw = 1 - break - if(!raw) - npcDrop(toMake) - FC.attackby(toMake, src) - allContents -= toMake - break - else - qdel(FC) // this food is usless, toss it - - // Process tool-based ingredients - var/obj/item/reagent_containers/food/snacks/dough/D = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/sliceable/flatdough/FD = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/rawcutlet/RC = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/sliceable/cheesewheel/CW = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/grown/potato/PO = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/meat/ME = locate() in rangeCheck - var/obj/item/reagent_containers/food/snacks/raw_bacon/RB = locate() in rangeCheck - - if(D) - TARGET = D - if(prob(50)) - tryWalk(get_turf(D)) - sleep(get_dist(src, D)) - D.attackby(RP, src) - foundCookable = 1 - else if(FD) - TARGET = FD - if(prob(50)) - tryWalk(get_turf(FD)) - sleep(get_dist(src, FD)) - FD.attackby(KK, src) - foundCookable = 1 - else if(RC) - TARGET = RC - if(prob(50)) - tryWalk(get_turf(RC)) - sleep(get_dist(src, RC)) - RC.attackby(KK, src) - foundCookable = 1 - else if(CW) - TARGET = CW - if(prob(50)) - tryWalk(get_turf(CW)) - sleep(get_dist(src, CW)) - CW.attackby(KK, src) - foundCookable = 1 - else if(PO) - TARGET = PO - if(prob(50)) - tryWalk(get_turf(PO)) - sleep(get_dist(src, PO)) - PO.attackby(KK, src) - foundCookable = 1 - else if(ME) - TARGET = ME - if(prob(50)) - tryWalk(get_turf(ME)) - sleep(get_dist(src, ME)) - ME.attackby(KK, src) - foundCookable = 1 - else if(RB) - TARGET = RB - if(prob(50)) - tryWalk(get_turf(RB)) - sleep(get_dist(src, RB)) - RB.attackby(KK, src) - foundCookable = 1 - - // refresh - allContents = getAllContents() - rangeCheck = view(6, src) - - // Find most complex recipe we can cook - var/ingredientZone = rangeCheck + allContents - var/highest_count = 0 - var/datum/recipe/winner = null - for(var/datum/recipe/R in available_recipes) - if(R.check_items(ingredientZone) >= 0) - var/count = (R.items ? R.items.len : 0) - if(count > highest_count) - highest_count = count - winner = R - - // make winner - if(winner) - if(makerecipe(winner, allContents, rangeCheck)) - foundCookable = 1 - - // refresh - allContents = getAllContents() - rangeCheck = view(6, src) - - // dont display our ingredients - var/list/finishedList = list() - for(var/obj/item/reagent_containers/food/snacks/toDisplay in allContents) - var/raw = 0 - for(var/type in rawtypes) - if(istype(toDisplay, type)) - raw = 1 - break - if(!raw) - finishedList += toDisplay - - for(var/obj/item/reagent_containers/food/snacks/toGrab in rangeCheck) - if(!(locate(/obj/structure/table/reinforced) in get_turf(toGrab))) //it's not being displayed - var/raw = 0 - for(var/type in rawtypes) - if(istype(toGrab, type)) - raw = 1 - break - if(!raw) - foundCookable = 1 - if(!Adjacent(toGrab)) - tryWalk(toGrab) - else - finishedList += toGrab - toGrab.forceMove(src) - - if(finishedList.len) - var/obj/structure/table/reinforced/RT - - for(var/obj/structure/table/reinforced/toCheck in rangeCheck) - var/counted = 0 - for(var/obj/item/reagent_containers/food/snacks/S in get_turf(toCheck)) - ++counted - if(counted < 12) // make sure theres not too much food here - RT = toCheck - break - - if(RT) - foundCookable = 1 - if(!Adjacent(RT)) - tryWalk(get_turf(RT)) - else - for(var/obj/item/reagent_containers/food/snacks/toPlop in finishedList) - RT.attackby(toPlop,src) - - if(!foundCookable) - var/chosenType = pick(rawtypes) - - var/obj/item/reagent_containers/food/snacks/newSnack = new chosenType(get_turf(src)) - TARGET = newSnack - newSnack.reagents.remove_any((newSnack.reagents.total_volume/2)-1) - newSnack.name = "synthetic [newSnack.name]" - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as [p_they()] vomit[p_s()] [newSnack] from [p_their()] mouth!") - catch(var/exception/e) - log_runtime(e, src, "Caught in SNPC cooking module") - doing &= ~SNPC_SPECIAL -// END COOKING MODULE - -/mob/living/carbon/human/interactive/proc/combat(obj) - set background = 1 - enforce_hands() - if(canmove) - if((graytide || (TRAITS & TRAIT_MEAN)) || retal) - interest += targetInterestShift - a_intent = INTENT_HARM - zone_sel.selecting = pick("chest","r_leg","l_leg","r_arm","l_arm","head") - doing |= SNPC_FIGHTING - if(retal) - TARGET = retal_target - else - var/mob/living/M = locate(/mob/living) in oview(7, src) - if(!M) - doing = doing & ~SNPC_FIGHTING - else if(M != src && !compareFaction(M.faction)) - TARGET = M - - //no infighting - if(retal) - if(retal_target) - if(compareFaction(retal_target.faction)) - retal = 0 - retal_target = null - TARGET = null - doing = 0 - - //ensure we're using the best object possible - - var/obj/item/best - var/foundFav = 0 - var/list/allContents = getAllContents() - for(var/test in allContents) - for(var/a in favoured_types) - if(ispath(test,a) && !(doing & SNPC_FIGHTING)) // if we're not in combat and we find our favourite things, use them (for people like janitor and doctors) - best = test - foundFav = 1 - return - if(!foundFav) - if(istype(test,/obj/item)) - var/obj/item/R = test - if(R.force > 2) // make sure we don't equip any non-weaponlike items, ie bags and stuff - if(!best) - best = R - else - if(best.force < R.force) - best = R - if(istype(R, /obj/item/gun)) - var/obj/item/gun/G = R - if(G.can_shoot()) - best = R - break // gun with ammo? screw the rest - if(best && best != main_hand) - take_to_slot(best,1) - - if(TARGET && (doing & SNPC_FIGHTING)) // this is a redundancy check - var/mob/living/M = TARGET - if(istype(M,/mob/living)) - if(M.health > 1 && (M in oview(src, 6))) - //THROWING OBJECTS - for(var/A in allContents) - if(istype(A,/obj/item/gun)) // guns are for shooting, not throwing. - continue - if(prob(robustness)) - if(istype(A,/obj/item)) - var/obj/item/W = A - if(W.throwforce > 19) // Only throw worthwile stuff, no more lobbing wrenches at wenches - npcDrop(W, 1) - throw_item(TARGET) - if(istype(A,/obj/item/grenade)) // Allahu ackbar! ALLAHU ACKBARR!! - var/obj/item/grenade/G = A - G.attack_self(src) - if(prob(smartness)) - npcDrop(G, 1) - sleep(15) - throw_item(TARGET) - - if(!main_hand && other_hand) - swap_hands() - if(main_hand) - if(main_hand.force != 0) - if(istype(main_hand,/obj/item/gun)) - var/obj/item/gun/G = main_hand - if(G.can_trigger_gun(src)) - var/shouldFire = 1 - if(istype(main_hand, /obj/item/gun/energy)) - var/obj/item/gun/energy/P = main_hand - var/stunning = 0 - for(var/A in P.ammo_type) - if(ispath(A,/obj/item/ammo_casing/energy/electrode)) - stunning = 1 - var/mob/stunCheck = TARGET - if(stunning && stunCheck.stunned) - shouldFire = 0 - if(shouldFire) - if(!G.can_shoot()) - G.shoot_with_empty_chamber(src) - npcDrop(G, 1) - else - G.process_fire(TARGET, src) - else - if(get_dist(src,TARGET) > 6) - if(!walk2derpless(TARGET)) - timeout++ - else - var/obj/item/W = main_hand - W.attack(TARGET, src) - else - npcDrop(G, 1) - else - if(targetRange(TARGET) > 2) - tryWalk(TARGET) - else - if(Adjacent(TARGET)) - a_intent = pick(INTENT_DISARM, INTENT_HARM) - M.attack_hand(src) - timeout++ - else if(timeout >= 10 || !(targetRange(M) > 14)) - doing = doing & ~SNPC_FIGHTING - timeout = 0 - TARGET = null - retal = 0 - retal_target = null - else - timeout++ - -/mob/living/carbon/human/interactive/proc/past_verb(word) - if(copytext(word, length(word)) == "e") - return "[word]d" - else - return "[word]ed" - -/mob/living/carbon/human/interactive/proc/ing_verb(word) - if(copytext(word, length(word)) == "e") - return "[copytext(word, 1, length(word))]ing" - else - return "[word]ing" - -/mob/living/carbon/human/interactive/proc/paperwork_sentence() - var/verbs_use = pick_list(speak_file, "verbs_use") - var/verbs_touch = pick_list(speak_file, "verbs_touch") - var/verbs_move = pick_list(speak_file, "verbs_move") - var/nouns_insult = pick_list(speak_file, "nouns_insult") - var/nouns_generic = pick_list(speak_file, "nouns_generic") - var/nouns_objects = pick_list(speak_file, "nouns_objects") - var/nouns_body = pick_list(speak_file, "nouns_body") - var/adjective_insult = pick_list(speak_file, "adjective_insult") - var/adjective_objects = pick_list(speak_file, "adjective_objects") - var/adjective_generic = pick_list(speak_file, "adjective_generic") - var/curse_words = pick_list(speak_file, "curse_words") - var/result = pick("fired", "promoted", "demoted", "terminated", "incinerated", "sent to CentCom", "borged") - - return pick( - "The [adjective_insult] [pick(command_positions)] [past_verb(verbs_touch)] the [adjective_objects] [nouns_objects] and was [result].", - "The [adjective_generic] [pick(engineering_positions)] [past_verb(verbs_touch)] the [adjective_insult] [nouns_objects]. [capitalize(curse_words)], the [nouns_insult] was [result].", - "The [adjective_insult] [pick(security_positions)] [past_verb(verbs_touch)] the [adjective_generic] [nouns_insult] [pick(support_positions)]'s [nouns_body] and had to be [result].", - "Medical had to [verbs_use] the [adjective_generic] [pick(command_positions)]'s [adjective_objects] [nouns_body] after the incident.", - "I demand that [nouns_generic] respond with a [adjective_generic] update ASAP.", - "Would like an update from [nouns_generic] regarding the [adjective_insult] [pick(command_positions)] being [result].", - "The [pick(medical_positions)] needs to [verbs_move] faster when the crew's [adjective_objects] [nouns_body]s are injured, or they will be [result].", - "[capitalize(curse_words)] [adjective_insult] [curse_words].", - "

    ") - -/mob/living/carbon/human/interactive/proc/pickStamp(allContents) - var/list/stamps[0] - for(var/obj/item/stamp/S in allContents) - stamps += S - if(stamps.len) - return pick(stamps) - - // just make one, maybe - if(prob(SNPC_FUZZY_CHANCE_LOW / 2)) - for(var/p in favoured_types) - if(ispath(p, /obj/item/stamp)) - return new p(src) - return null - -/mob/living/carbon/human/interactive/proc/paperwork(obj) - set background = 1 - - if(shouldModulePass() || !prob(SNPC_FUZZY_CHANCE_LOW / 4)) - return - - var/list/allContents = getAllContents() - - var/obj/item/paper/P = locate() in allContents - var/obj/item/stamp/S = pickStamp(allContents) - var/mob/living/carbon/human/H = locate() in nearby - - if(!P) - P = new /obj/item/paper(src) - - if(P && S && H) - if(!P.stamped || !P.stamped.len) - // generate form - P.name = pick("Inspection Report", "Re: Crew", "Complaint", "To: CentCom") - P.info = {"

    [paperwork_sentence()]
    "} - for(var/I in 1 to rand(10, 20)) - P.info += "[paperwork_sentence()] " - P.info += {"

    [pick("Signed", "Sincerely", "Regards")], [real_name]"} - P.update_icon() - P.stamp(S) - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] and throws [P] on the ground!") - npcDrop(P) - P.throw_at(H, P.throw_range, P.throw_speed, src) - -/mob/living/carbon/human/interactive/proc/stamping(obj) - if(shouldModulePass()) - return - - var/list/allContents = getAllContents() - var/list/rangeCheck = view(7, src) - - var/obj/item/stamp/S = pickStamp(allContents) - if(!S) - return - - // stamp a paper we're holding, and drop it - var/obj/item/paper/P = locate() in allContents - if(P) - if(!P.stamped || !P.stamped.len) - P.stamp(S) - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as they stamp \the [P] with \a [S]!") - npcDrop(P, 1) - return - - // stamp a paper in the world - for(var/obj/item/paper/A in rangeCheck) - if(!A.stamped || !A.stamped.len) - if(!Adjacent(A)) - tryWalk(A) - else - A.stamp(S) - custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as they stamp \the [A] with \a [S]!") - return diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm deleted file mode 100644 index 69dfa740b09..00000000000 --- a/code/modules/mob/living/carbon/human/interactive/interactive.dm +++ /dev/null @@ -1,960 +0,0 @@ -/* - NPC VAR EXPLANATIONS (for modules and other things) - - doing = their current action, SNPC_INTERACTING, SNPC_TRAVEL or SNPC_FIGHTING - interest = how interested the NPC is in the situation, if they are idle, this drops - timeout = this is internal - TARGET = their current target - LAST_TARGET = their last target - nearby = a list of nearby mobs - best_force = the highest force object, used for checking when to swap items - retal = this is internal - retal_target = this is internal - update_hands = this is a bool (1/0) to determine if the NPC should update what is in his hands - - MYID = their ID card - MYPDA = their PDA - main_hand = what is in their "main" hand (chosen from left > right) - TRAITS = the traits assigned to this npc - mymjob = the job assigned to the npc - - robustness = the chance for the npc to hit something - smartness = the inverse chance for an npc to do stupid things - attitude = the chance for an npc to do rude or mean things - slyness = the chance for an npc to do naughty things ie thieving - - functions = the list of procs that the npc will use for modules - - graytide = shitmin var to make them go psycho -*/ -/mob/living/carbon/human/interactive - name = "interactive station member" - var/doing = 0 - var/interest = 10 - var/maxInterest = 10 - var/timeout = 0 - var/inactivity_period = 0 - var/atom/TARGET = null - var/atom/LAST_TARGET = null - var/list/nearby = list() - var/best_force = 0 - var/retal = 0 - var/mob/retal_target = null - var/update_hands = 0 - var/list/blacklistItems = list() // items we should be ignoring - var/maxStepsTick = 6 // step as many times as we can per frame - //Job and mind data - var/obj/item/card/id/MYID - var/obj/item/card/id/RPID // the "real" idea they use - var/obj/item/pda/MYPDA - var/obj/item/main_hand - var/obj/item/other_hand - var/TRAITS = 0 - var/obj/item/card/id/Path_ID - var/default_job = /datum/job/civilian // the type for the default job - var/datum/job/myjob - var/list/myPath = list() - faction = list("synth") - //trait vars - var/robustness = 50 - var/smartness = 50 - var/attitude = 50 - var/slyness = 50 - var/graytide = 0 - var/list/favoured_types = list() // allow a mob to favour a type, and hold onto them - var/chattyness = SNPC_CHANCE_TALK - var/targetInterestShift = 5 // how much a good action should "reward" the npc - //modules - var/list/functions = list("nearbyscan","combat","shitcurity","chatter") - var/restrictedJob = 0 - var/forceProcess = 0 - var/speak_file = "npc_chatter.json" - var/debugexamine = FALSE //If we show debug info in our examine - var/showexaminetext = TRUE //If we show our telltale examine text - - var/voice_saved = FALSE - - var/list/knownStrings = list() - - //snpc traitor variables - - var/isTraitor = 0 - var/traitorTarget - var/traitorScale = 0 // our ability as a traitor - var/traitorType = 0 - - -/// SNPC voice handling - -/mob/living/carbon/human/interactive/proc/loadVoice() - var/savefile/S = new /savefile("data/npc_saves/snpc.sav") - S["knownStrings"] >> knownStrings - - if(isnull(knownStrings)) - knownStrings = list() - -/mob/living/carbon/human/interactive/proc/saveVoice() - if(voice_saved) - return - var/savefile/S = new /savefile("data/npc_saves/snpc.sav") - S["knownStrings"] << knownStrings - -//botPool funcs -/mob/living/carbon/human/interactive/proc/takeDelegate(mob/living/carbon/human/interactive/from,doReset=TRUE) - change_eye_color(255, 0, 0) - if(from == src) - return FALSE - TARGET = from.TARGET - LAST_TARGET = from.LAST_TARGET - retal = from.retal - retal_target = from.retal_target - doing = from.doing - // - timeout = 0 - inactivity_period = 0 - interest = maxInterest - // - update_icons() - if(doReset) - from.TARGET = null - from.LAST_TARGET = null - from.retal = 0 - from.retal_target = null - from.doing = 0 - return TRUE - -//end pool funcs - -/mob/living/carbon/human/interactive/proc/random() - //this is here because this has no client/prefs/brain whatever. - age = rand(AGE_MIN, AGE_MAX) - change_gender(pick("male", "female")) - rename_character(real_name, dna.species.get_random_name(gender)) - //job handling - myjob = new default_job() - job = myjob.title - mind.assigned_role = job - myjob.equip(src) - -/mob/living/carbon/human/interactive/proc/reset() - walk(src, 0) - timeout = 100 - retal = 0 - doing = 0 - inactivity_period = 0 - -/client/proc/resetSNPC(mob/living/carbon/human/interactive/T in SSnpcpool.processing) - set name = "Reset SNPC" - set desc = "Reset the SNPC" - set category = "Debug" - - if(!holder) - return - - if(istype(T)) - T.reset() - -/client/proc/customiseSNPC(mob/living/carbon/human/interactive/T in SSnpcpool.processing) - set name = "Customize SNPC" - set desc = "Customize the SNPC" - set category = "Debug" - - if(!holder) - return - - if(!istype(T)) - return - - var/list/jobs[0] - for(var/datum/job/j in SSjobs.occupations) - if(j.title != "AI" && j.title != "Cyborg") - jobs[j.title] = j - jobs = sortAssoc(jobs) - var/job_name = input("Choose Job") as null|anything in jobs - - if(job_name) - var/datum/job/cjob = jobs[job_name] - var/alt_title = input("Choose Alt Title") in (list(job_name) + cjob.alt_titles) - - T.myjob = cjob - T.job = cjob.title - T.mind.assigned_role = cjob.title - for(var/obj/item/I in T) - if(istype(I, /obj/item/implant)) - continue - if(istype(I, /obj/item/organ)) - continue - qdel(I) - T.myjob.equip(T) - T.doSetup(alt_title) - - var/shouldDoppel = input("Do you want the SNPC to disguise themself as a crewmember?") as anything in list("Yes", "No") - if(shouldDoppel == "Yes") - var/list/validchoices = list() - for(var/mob/living/carbon/human/M in GLOB.mob_list) - validchoices += M - - var/mob/living/carbon/human/chosen = input("Which crewmember?") as null|anything in validchoices - - if(chosen) - var/datum/dna/toDoppel = chosen.dna - - T.real_name = toDoppel.real_name - T.set_species(chosen.dna.species.type) - T.dna = toDoppel.Clone() - T.body_accessory = chosen.body_accessory - T.UpdateAppearance() - domutcheck(T) - - var/doTrait = input("Do you want the SNPC to be a traitor?") as anything in list("Yes", "No") - if(doTrait == "Yes") - var/list/tType = list("Brute" = SNPC_BRUTE, "Stealth" = SNPC_STEALTH, "Martyr" = SNPC_MARTYR, "Psycho" = SNPC_PSYCHO) - var/cType = input("Choose the traitor personality.") as null|anything in tType - if(cType) - var/value = tType[cType] - T.makeTraitor(value) - - var/doTele = input("Place the SNPC in their department?") as anything in list("Yes", "No") - if(doTele == "Yes") - T.loc = pick(get_area_turfs(T.job2area(T.myjob))) - - T.revive() - -/mob/living/carbon/human/interactive/proc/doSetup(alt_title = null) - Path_ID = new /obj/item/card/id(src) - - var/datum/job/captain/C = new/datum/job/captain - Path_ID.access = C.get_access() - - if(!alt_title) - alt_title = job - - MYID = new(src) - MYID.name = "[real_name]'s ID Card ([alt_title])" - MYID.assignment = "[alt_title]" - MYID.rank = job - MYID.sex = capitalize(gender) - MYID.age = age - MYID.registered_name = real_name - MYID.photo = get_id_photo(src) - MYID.access = Path_ID.access.Copy() // Automatons have strange powers... strange indeed - - RPID = new(src) - RPID.name = "[real_name]'s ID Card ([alt_title])" - RPID.assignment = "[alt_title]" - RPID.rank = job - RPID.sex = capitalize(gender) - RPID.age = age - RPID.registered_name = real_name - RPID.photo = get_id_photo(src) - RPID.access = myjob.get_access() - - if(wear_id) - qdel(wear_id) - if(!equip_to_slot_or_del(MYID, slot_wear_id)) - create_attack_log("Deleted ID due to slot contention") - if(wear_pda) - MYPDA = wear_pda - else - MYPDA = new(src) - equip_to_slot_or_del(MYPDA, slot_wear_pda) - MYPDA.owner = real_name - MYPDA.ownjob = alt_title - MYPDA.ownrank = job - MYPDA.name = "PDA-[real_name] ([alt_title])" - zone_sel.selecting = "chest" - //arms - if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4)) - var/obj/item/organ/external/R = bodyparts_by_name["r_arm"] - if(R) - R.robotize(make_tough = 1) - else - var/obj/item/organ/external/L = bodyparts_by_name["l_arm"] - if(L) - L.robotize(make_tough = 1) - //legs - if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4)) - var/obj/item/organ/external/R = bodyparts_by_name["r_leg"] - if(R) - R.robotize(make_tough = 1) - else - var/obj/item/organ/external/L = bodyparts_by_name["l_leg"] - if(L) - L.robotize(make_tough = 1) - UpdateDamageIcon() - regenerate_icons() - - hand = 0 - functions = list("nearbyscan", "combat", "shitcurity", "chatter") // stop customize adding multiple copies of a function - setup_job(job) - - if(TRAITS & TRAIT_ROBUST) - robustness = 75 - else if(TRAITS & TRAIT_UNROBUST) - robustness = 25 - - //modifiers are prob chances, lower = smarter - if(TRAITS & TRAIT_SMART) - smartness = 75 - else if(TRAITS & TRAIT_DUMB) - disabilities |= CLUMSY - smartness = 25 - - if(TRAITS & TRAIT_MEAN) - attitude = 75 - else if(TRAITS & TRAIT_FRIENDLY) - attitude = 1 - - if(TRAITS & TRAIT_THIEVING) - slyness = 75 - -/mob/living/carbon/human/interactive/proc/InteractiveProcess() - if(ticker.current_state == GAME_STATE_FINISHED) - saveVoice() - voice_saved = TRUE - doProcess() - -/mob/living/carbon/human/interactive/proc/setup_job(thejob) - switch(thejob) - if("Civilian") - favoured_types = list(/obj/item/clothing, /obj/item) - if("Captain", "Head of Personnel") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/captain,/obj/item/disk/nuclear) - if("Nanotrasen Representative") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/centcom, /obj/item/paper, /obj/item/melee/classic_baton/ntcane) - functions += "paperwork" - if("Magistrate", "Internal Affairs Agent") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/law, /obj/item/paper) - functions += "paperwork" - if("Quartermaster", "Cargo Technician") - favoured_types = list(/obj/item/clothing, /obj/item/stamp/granted, /obj/item/stamp/denied, /obj/item/paper, /obj/item/clipboard) - functions += "stamping" - if("Chef") - favoured_types = list(/obj/item/reagent_containers/food, /obj/item/kitchen) - functions += "souschef" - restrictedJob = 1 - if("Bartender") - favoured_types = list(/obj/item/reagent_containers/food, /obj/item/kitchen) - functions += "bartend" - restrictedJob = 1 - if("Station Engineer", "Chief Engineer", "Life Support Specialist", "Mechanic") - favoured_types = list(/obj/item/stack, /obj/item, /obj/item/clothing) - if("Chief Medical Officer", "Medical Doctor", "Chemist", "Virologist", "Geneticist", "Psychiatrist", "Paramedic", "Brig Physician") - favoured_types = list(/obj/item/reagent_containers/glass/beaker, /obj/item/storage/firstaid, /obj/item/stack/medical, /obj/item/reagent_containers/syringe) - functions += "healpeople" - if("Research Director", "Scientist", "Roboticist") - favoured_types = list(/obj/item/reagent_containers/glass/beaker, /obj/item/stack, /obj/item/reagent_containers) - if("Head of Security", "Warden", "Security Officer", "Detective", "Security Pod Pilot", "Blueshield") - favoured_types = list(/obj/item/clothing, /obj/item, /obj/item/restraints) - if("Janitor") - favoured_types = list(/obj/item/mop, /obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/spray/cleaner, /obj/effect/decal/cleanable) - functions += "dojanitor" - if("Clown") - favoured_types = list(/obj/item/soap, /obj/item/reagent_containers/food/snacks/grown/banana, /obj/item/grown/bananapeel) - functions += "clowning" - if("Botanist") - favoured_types = list(/obj/machinery/hydroponics, /obj/item/reagent_containers, /obj/item) - functions += "botany" - restrictedJob = 1 - else - favoured_types = list(/obj/item/clothing) - -/mob/living/carbon/human/interactive/proc/makeTraitor(var/inPers) - isTraitor = 1 - traitorScale = (slyness + smartness) + rand(-10,10) - traitorType = inPers - - ticker.mode.traitors += mind - mind.special_role = SPECIAL_ROLE_TRAITOR - var/datum/mindslaves/slaved = new() - slaved.masters += mind - mind.som = slaved - ticker.mode.update_traitor_icons_added(mind) - - switch(traitorType) - if(SNPC_BRUTE) // SMASH KILL RAAARGH - var/datum/objective/assassinate/A = new - A.owner = mind - A.find_target() - mind.objectives += A - traitorTarget = A.target.current - if(SNPC_STEALTH) // Shhh we is sneekies - var/datum/objective/steal/S = new - S.owner = mind - S.find_target() - mind.objectives += S - traitorTarget = locate(S.steal_target.typepath) in world - if(SNPC_MARTYR) // MY LIFE FOR SPESZUL - var/targetType = pick(/obj/structure/particle_accelerator, /obj/machinery/gravity_generator/main, /obj/machinery/power/smes) - traitorTarget = locate(targetType) in world - var/datum/objective/O = new("Destroy \the [traitorTarget].") - O.owner = mind - mind.objectives += O - if(SNPC_PSYCHO) // YOU'RE LIKE A FLESH BICYLE AND I WANT TO DISMANTLE YOU - var/datum/objective/hijack/H = new - H.owner = mind - mind.objectives += H - traitorTarget = null - - functions += "traitor" - faction -= "neutral" - faction += "hostile" - -/mob/living/carbon/human/interactive/create_mob_hud() - if(!hud_used) - hud_used = new /datum/hud/human(src) - -/mob/living/carbon/human/interactive/Initialize() - ..() - return INITIALIZE_HINT_LATELOAD - -/mob/living/carbon/human/interactive/LateInitialize() - . = ..() - GLOB.snpc_list += src - - create_mob_hud() - - sync_mind() - random() - doSetup() - START_PROCESSING(SSnpcpool, src) - loadVoice() - GLOB.hear_radio_list += src - - // a little bit of variation to make individuals more unique - robustness += rand(-10, 10) - smartness += rand(-10, 10) - attitude += rand(-10, 10) - slyness += rand(-10, 10) - - doProcess() - -/mob/living/carbon/human/interactive/Destroy() - SSnpcpool.stop_processing(src) - return ..() - -/mob/living/carbon/human/interactive/proc/retalTarget(mob/living/target) - var/mob/living/M = target - if(istype(M)) - if(health > 0) - if(M.a_intent == INTENT_HELP && !incapacitated()) - chatter() - if(istype(target, /mob/living/carbon) && !retal && prob(SNPC_FUZZY_CHANCE_LOW)) - var/mob/living/carbon/C = target - if(!Adjacent(target)) - tryWalk(target) - else - C.help_shake_act(src) - if(M.a_intent == INTENT_HARM) - retal = 1 - retal_target = target - -//Retaliation clauses - -/mob/living/carbon/human/interactive/attacked_by(obj/item/I, mob/living/user, def_zone) - ..() - retalTarget(user) - -/mob/living/carbon/human/interactive/hitby(atom/movable/AM, skipcatch, hitpush, blocked) - ..() - var/mob/living/carbon/C = locate(/mob/living/carbon) in view(SNPC_MIN_RANGE_FIND, src) - if(C) - retalTarget(C) - -/mob/living/carbon/human/interactive/bullet_act(obj/item/projectile/P) - ..() - retalTarget(P.firer) - -/mob/living/carbon/human/interactive/attack_hand(mob/living/carbon/human/M) - ..() - retalTarget(M) - -/mob/living/carbon/human/interactive/show_inv(mob/user) - ..() - retalTarget(user) - -/mob/living/carbon/human/interactive/can_inject(mob/user, error_msg, target_zone, var/penetrate_thick = 0) - ..() - retalTarget(user) - -//THESE EXIST FOR DEBUGGING OF THE DOING/INTEREST SYSTEM EASILY -/mob/living/carbon/human/interactive/proc/doing2string(doin) - var/toReturn = "" - if(!doin) - toReturn = "not doing anything" - if(doin & SNPC_INTERACTING) - toReturn += "interacting with something, " - if(doin & SNPC_FIGHTING) - toReturn += "engaging in combat, " - if(doin & SNPC_TRAVEL) - toReturn += "and going somewhere" - return toReturn - -/mob/living/carbon/human/interactive/proc/interest2string(inter) - var/toReturn = "Flatlined" - if(inter >= 0 && inter <= 25) - toReturn = "Very Bored" - if(inter >= 26 && inter <= 50) - toReturn = "Bored" - if(inter >= 51 && inter <= 75) - toReturn = "Content" - if(inter >= 76) - toReturn = "Excited" - return toReturn -//END DEBUG - -/mob/living/carbon/human/interactive/proc/IsDeadOrIncap(checkDead = TRUE) - if(!canmove) - return 1 - if(health <= 0 && checkDead) - return 1 - if(restrained()) - return 1 - if(paralysis) - return 1 - if(stunned) - return 1 - if(stat) - return 1 - if(inactivity_period > 0) - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/enforce_hands() - if(main_hand) - if(main_hand.loc != src) - main_hand = null - if(other_hand) - if(other_hand.loc != src) - other_hand = null - if(hand) - if(!l_hand) - main_hand = null - if(r_hand) - swap_hands() - else - if(!r_hand) - main_hand = null - if(l_hand) - swap_hands() - -/mob/living/carbon/human/interactive/proc/swap_hands() - hand = !hand - var/obj/item/T = other_hand - main_hand = other_hand - other_hand = T - update_hands = 1 - -/mob/living/carbon/human/interactive/proc/take_to_slot(obj/item/G, var/hands=0) - var/list/slots = list("left pocket" = slot_l_store, "right pocket" = slot_r_store, "left hand" = slot_l_hand, "right hand" = slot_r_hand) - if(hands) - slots = list("left hand" = slot_l_hand, "right hand" = slot_r_hand) - G.loc = src - if(G.force && G.force > best_force) - best_force = G.force - equip_in_one_of_slots(G, slots) - update_hands = 1 - -/mob/living/carbon/human/interactive/proc/insert_into_backpack() - var/list/slots = list(slot_l_store, slot_r_store, slot_l_hand, slot_r_hand) - var/obj/item/I = get_item_by_slot(pick(slots)) - var/obj/item/storage/BP = get_item_by_slot(slot_back) - if(back && BP && I) - // hack to allow SNPCs to "sticky grab" items without losing their inventorying - var/oldnodrop = I.flags | NODROP - I.flags &= ~NODROP - if(BP.can_be_inserted(I)) - BP.handle_item_insertion(I) - I.flags |= oldnodrop - else - unEquip(I,TRUE) - update_hands = 1 - -/mob/living/carbon/human/interactive/proc/targetRange(towhere) - return get_dist(get_turf(towhere), get_turf(src)) - -/mob/living/carbon/human/interactive/death() - // Only execute the below if we successfully died - . = ..() - if(!.) - return FALSE - saveVoice() - -/mob/living/carbon/human/interactive/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol) - if(!istype(speaker, /mob/living/carbon/human/interactive)) - knownStrings |= html_decode(multilingual_to_message(message_pieces)) - ..() - -/mob/living/carbon/human/interactive/hear_radio(list/message_pieces, verb = "says", part_a, part_b, mob/speaker = null, hard_to_hear = 0, vname = "", atom/follow_target) - if(!istype(speaker, /mob/living/carbon/human/interactive)) - knownStrings |= html_decode(multilingual_to_message(message_pieces)) - ..() - -/mob/living/carbon/human/interactive/proc/doProcess() - set waitfor = FALSE - if(IsDeadOrIncap()) - reset() - return - //--------------------------- - //---- interest flow control - if(interest < 0 || inactivity_period < 0) - if(interest < 0) - interest = 0 - if(inactivity_period < 0) - inactivity_period = 0 - if(interest > maxInterest) - interest = maxInterest - //--------------------------- - //VIEW FUNCTIONS - - //doorscan is now integrated into life and runs before all other procs - var/mistake_chance = (100 - smartness) / 2 - spawn(0) - for(var/dir in alldirs) - var/turf/T = get_step(src, dir) - if(T) - for(var/obj/machinery/door/D in T.contents) - if(!istype(D,/obj/machinery/door/poddoor) && D.density) - spawn(0) - if(istype(D,/obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/AL = D - if(!AL.CanAStarPass(RPID)) // only crack open doors we can't get through - inactivity_period = 20 - AL.panel_open = 1 - AL.update_icon() - AL.shock(src, mistake_chance) - sleep(5) - if(QDELETED(AL)) - return - AL.unlock() - if(prob(mistake_chance)) - if(!AL.wires.IsIndexCut(AIRLOCK_WIRE_DOOR_BOLTS)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_DOOR_BOLTS) - else - if(AL.wires.IsIndexCut(AIRLOCK_WIRE_DOOR_BOLTS)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_DOOR_BOLTS, 1) - if(AL.locked) - AL.wires.UpdatePulsed(AIRLOCK_WIRE_DOOR_BOLTS) - if(!AL.wires.IsIndexCut(AIRLOCK_WIRE_MAIN_POWER1)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_MAIN_POWER1) - if(prob(mistake_chance) && !AL.wires.IsIndexCut(AIRLOCK_WIRE_SAFETY)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_SAFETY) - if(prob(mistake_chance) && !AL.wires.IsIndexCut(AIRLOCK_WIRE_ELECTRIFY)) - AL.wires.CutWireIndex(AIRLOCK_WIRE_ELECTRIFY) - sleep(5) - if(QDELETED(AL)) - return - AL.panel_open = 0 - AL.update_icon() - D.open() - - if(update_hands) - if(l_hand || r_hand) - if(l_hand) - hand = 1 - main_hand = l_hand - if(r_hand) - other_hand = r_hand - else if(r_hand) - hand = 0 - main_hand = r_hand - if(l_hand) //this technically shouldnt occur, but its a redundancy - other_hand = l_hand - update_icons() - update_hands = 0 - - if(grabbed_by.len > 0) - for(var/obj/item/grab/G in grabbed_by) - if(Adjacent(G)) - a_intent = INTENT_DISARM - G.assailant.attack_hand(src) - inactivity_period = 10 - - if(buckled) - resist() - inactivity_period = 10 - - //proc functions - for(var/Proc in functions) - if(!IsDeadOrIncap()) - INVOKE_ASYNC(src, Proc) - - - //target interaction stays hardcoded - - if(TARGET && (TARGET in blacklistItems)) // don't use blacklisted items - TARGET = null - - if(TARGET && Adjacent(TARGET)) - doing |= SNPC_INTERACTING - //--------DOORS - if(istype(TARGET, /obj/machinery/door)) - var/obj/machinery/door/D = TARGET - if(D.check_access(MYID) && !istype(D,/obj/machinery/door/poddoor)) - inactivity_period = 10 - D.open() - var/turf/T = get_step(get_step(D.loc, dir), dir) //recursion yo - tryWalk(T) - //THIEVING SKILLS - insert_into_backpack() // dump random item into backpack to make space - //---------ITEMS - if(istype(TARGET, /obj/item)) - var/obj/item/I = TARGET - if(I.anchored) - TARGET = null - else if(istype(TARGET, /obj/item)) - var/obj/item/W = TARGET - if(W.force >= best_force || prob((SNPC_FUZZY_CHANCE_LOW + SNPC_FUZZY_CHANCE_HIGH) / 2) || favouredObjIn(list(W))) - if(!l_hand || !r_hand) - put_in_hands(W) - else - insert_into_backpack() - else - if(!l_hand || !r_hand) - put_in_hands(TARGET) - else - insert_into_backpack() - //---------FASHION - if(istype(TARGET, /obj/item/clothing)) - drop_item() - dressup(TARGET) - update_hands = 1 - if(MYPDA in loc) - equip_to_appropriate_slot(MYPDA) - if(MYID in loc) - equip_to_appropriate_slot(MYID) - //THIEVING SKILLS END - //-------------TOUCH ME - if(istype(TARGET, /obj/structure)) - var/obj/structure/STR = TARGET - if(main_hand) - var/obj/item/W = main_hand - STR.attackby(W, src) - else - STR.attack_hand(src) - interest += targetInterestShift - doing = doing & ~SNPC_INTERACTING - timeout = 0 - TARGET = null - else - if(TARGET) - tryWalk(TARGET) - timeout++ - - if(doing == 0) - interest-- - else - interest++ - - if(inactivity_period > 0) - inactivity_period-- - - if(interest <= 0 || timeout >= 10) // facilitate boredom functions - TARGET = null - doing = 0 - timeout = 0 - myPath = list() - - //this is boring, lets move - if(!doing && !IsDeadOrIncap() && !TARGET) - doing |= SNPC_TRAVEL - if(!isTraitor || !traitorTarget || get_dist(src, traitorTarget) >= SNPC_MAX_RANGE_FIND || get_dist(src, traitorTarget) <= 1) - var/choice = rand(1,50) - switch(choice) - if(1 to 30) - //chance to chase an item - TARGET = locate(/obj/item) in favouredObjIn(oview(SNPC_MIN_RANGE_FIND, src)) - if(31 to 40) - TARGET = safepick(get_area_turfs(job2area(myjob))) - if(41 to 45) - TARGET = pick(target_filter(favouredObjIn(urange(SNPC_MAX_RANGE_FIND, src, 1)))) - if(46 to 50) - TARGET = pick(target_filter(oview(SNPC_MIN_RANGE_FIND, src))) - else - TARGET = traitorTarget - tryWalk(TARGET) - LAST_TARGET = TARGET - -/mob/living/carbon/human/interactive/proc/dressup(obj/item/clothing/C) - set waitfor = FALSE - inactivity_period = 12 - sleep(5) - if(!QDELETED(C) && !QDELETED(src)) - take_to_slot(C,1) - if(!equip_to_appropriate_slot(C)) - var/obj/item/I = get_item_by_slot(C) - unEquip(I) - sleep(5) - if(!QDELETED(src) && !QDELETED(C)) - equip_to_appropriate_slot(C) - -/mob/living/carbon/human/interactive/proc/favouredObjIn(list/inList) - var/list/outList = list() - for(var/i in inList) - for(var/path in favoured_types) - if(istype(i, path)) - outList += i - if(!outList.len) - outList = inList - return outList - -/mob/living/carbon/human/interactive/proc/tryWalk(turf/inTarget) - if(restrictedJob) // we're a job that has to stay in our home - if(!(get_turf(inTarget) in get_area_turfs(job2area(myjob)))) - TARGET = null - return - - if(!IsDeadOrIncap()) - if(!walk2derpless(inTarget)) - timeout++ - else - timeout++ - -/mob/living/carbon/human/interactive/proc/getGoodPath(target, maxtries=512) - set background = 1 - var/turf/end = get_turf(target) - - var/turf/current = get_turf(src) - - var/list/path = list() - var/tries = 0 - while(current != end && tries < maxtries) - var/turf/shortest = current - for(var/turf/T in view(current,1)) - var/foundDense = 0 - for(var/atom/A in T) - if(A.density) - foundDense = 1 - if(T.density == 0 && !foundDense) - if(get_dist(T, target) < get_dist(shortest,target)) - shortest = T - else - tries++ - else - tries++ - current = shortest - path += shortest - return path - -/mob/living/carbon/human/interactive/proc/walk2derpless(target) - set background = 1 - if(!target) - return 0 - - if(myPath.len <= 0) - myPath = get_path_to(src, get_turf(target), /turf/proc/Distance, SNPC_MAX_RANGE_FIND + 1, 250,1, id=Path_ID, simulated_only = 0) - - if(myPath) - if(myPath.len > 0) - doing = doing & ~SNPC_TRAVEL - for(var/i = 0; i < maxStepsTick; ++i) - if(!IsDeadOrIncap()) - if(myPath.len >= 1) - walk_to(src,myPath[1],0,5) - myPath -= myPath[1] - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/job2area(target) - var/datum/job/T = target - switch(T.title) - if("Civilian", "Paramedic") - return /area/hallway/primary - if("Captain", "Head of Personnel", "Blueshield") - return /area/bridge - if("Bartender") - return /area/crew_quarters/bar - if("Chef") - return /area/crew_quarters/kitchen - if("Station Engineer", "Chief Engineer", "Mechanic") - return /area/engine - if("Life Support Specialist") - return /area/atmos - if("Chief Medical Officer", "Medical Doctor", "Chemist", "Virologist", "Psychiatrist") - return /area/medical - if("Geneticist") - return /area/medical/genetics - if("Research Director", "Scientist") - return /area/toxins - if("Roboticist") - return /area/assembly/robotics - if("Head of Security", "Warden", "Security Officer", "Detective", "Security Pod Pilot", "Brig Physician", "Magistrate", "Internal Affairs Agent") - return /area/security - if("Botanist") - return /area/hydroponics - else - return pick(/area/hallway, /area/crew_quarters) - -/mob/living/carbon/human/interactive/proc/target_filter(target) - var/list/filtered_targets = list(/area, /turf, /obj/machinery/door, /atom/movable/lighting_overlay, /obj/structure/cable, /obj/machinery/atmospherics, /obj/item/radio/intercom) - var/list/L = target - for(var/atom/A in target) // added a bunch of "junk" that clogs up the general find procs - if(is_type_in_list(A,filtered_targets)) - L -= A - return L - -/mob/living/carbon/human/interactive/proc/shouldModulePass() // returns 1 if the npc is in anything "primary" - if(doing & (SNPC_FIGHTING | SNPC_SPECIAL)) - return 1 - if(retal) - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/getAllContents() - var/list/allContents = list() - for(var/atom/A in contents) - allContents += A - if(A.contents.len) - for(var/atom/B in A) - allContents += B - return allContents - -/mob/living/carbon/human/interactive/proc/enforceHome() - var/list/validHome = get_area_turfs(job2area(myjob)) - - if(TARGET) - var/atom/tcheck = TARGET - if(tcheck) - if(!(get_turf(tcheck) in validHome)) - TARGET = null - return 1 - - if(!(get_turf(src) in validHome) && validHome.len) - tryWalk(pick(get_area_turfs(job2area(myjob)))) - return 1 - return 0 - -/mob/living/carbon/human/interactive/proc/npcDrop(obj/item/A, blacklist = 0) - if(blacklist) - blacklistItems += A - unEquip(A) - enforce_hands() - update_icons() - -/mob/living/carbon/human/interactive/proc/compareFaction(list/targetFactions) - var/hasSame = 0 - - for(var/A in targetFactions) - if(A in faction) - hasSame = 1 - - return hasSame - -/mob/living/carbon/human/interactive/proc/nearbyscan(obj) - nearby = list() - for(var/mob/living/M in view(4,src)) - if(M != src) - nearby += M - -/mob/living/carbon/human/interactive/rename_character(oldname, newname) - if(!..()) - return 0 - - if(oldname) - if(MYID) - MYID.registered_name = newname - MYID.name = "[newname]'s ID Card ([MYID.assignment])" - if(RPID) - RPID.registered_name = MYID.registered_name - RPID.name = MYID.name - return 1 diff --git a/code/modules/mob/living/carbon/human/interactive/prefabs.dm b/code/modules/mob/living/carbon/human/interactive/prefabs.dm deleted file mode 100644 index cee716b66ec..00000000000 --- a/code/modules/mob/living/carbon/human/interactive/prefabs.dm +++ /dev/null @@ -1,24 +0,0 @@ -/mob/living/carbon/human/interactive/angry/Initialize(mapload) - TRAITS |= TRAIT_ROBUST - TRAITS |= TRAIT_MEAN - faction += "bot_angry" - return ..() - -/mob/living/carbon/human/interactive/friendly/Initialize(mapload) - TRAITS |= TRAIT_FRIENDLY - TRAITS |= TRAIT_UNROBUST - faction += "bot_friendly" - faction += "neutral" - functions -= "combat" - return ..() - -/mob/living/carbon/human/interactive/greytide/Initialize(mapload) - TRAITS |= TRAIT_ROBUST - TRAITS |= TRAIT_MEAN - TRAITS |= TRAIT_THIEVING - TRAITS |= TRAIT_DUMB - maxInterest = 5 // really short attention span - targetInterestShift = 2 // likewise - faction += "bot_grey" - graytide = 1 - return ..() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index d28e728c82c..d66f3dbf815 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -8,6 +8,15 @@ return 0 var/datum/gas_mixture/environment = loc.return_air() + if(client || registered_z) // This is a temporary error tracker to make sure we've caught everything + var/turf/T = get_turf(src) + if(client && registered_z != T.z) + message_admins("[src] [ADMIN_FLW(src, "FLW")] has somehow ended up in Z-level [T.z] despite being registered in Z-level [registered_z]. If you could ask them how that happened and notify the coders, it would be appreciated.") + log_game("Z-TRACKING: [src] has somehow ended up in Z-level [T.z] despite being registered in Z-level [registered_z].") + update_z(T.z) + else if (!client && registered_z) + log_game("Z-TRACKING: [src] of type [src.type] has a Z-registration despite not having a client.") + update_z(null) if(stat != DEAD) //Chemicals in the body handle_chemicals_in_body() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 52fde3d0d9e..3000fd5b085 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -953,6 +953,27 @@ to_chat(src, "You can taste [english_list(final_taste_list)].") +/mob/living/proc/update_z(new_z) // 1+ to register, null to unregister + if(registered_z != new_z) + if(registered_z) + SSmobs.clients_by_zlevel[registered_z] -= src + if(client) + if(new_z) + SSmobs.clients_by_zlevel[new_z] += src + for (var/I in length(SSidlenpcpool.idle_mobs_by_zlevel[new_z]) to 1 step -1) //Backwards loop because we're removing (guarantees optimal rather than worst-case performance), it's fine to use .len here but doesn't compile on 511 + var/mob/living/simple_animal/SA = SSidlenpcpool.idle_mobs_by_zlevel[new_z][I] + if (SA) + SA.toggle_ai(AI_ON) // Guarantees responsiveness for when appearing right next to mobs + else + SSidlenpcpool.idle_mobs_by_zlevel[new_z] -= SA + registered_z = new_z + else + registered_z = null + +/mob/living/onTransitZ(old_z,new_z) + ..() + update_z(new_z) + /mob/living/proc/owns_soul() if(mind) return mind.soulOwner == mind diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index d1157b662fa..d8e27df91fe 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -5,6 +5,10 @@ update_stat("mob login") update_sight() + var/turf/T = get_turf(src) + if(isturf(T)) + update_z(T.z) + //If they're SSD, remove it so they can wake back up. player_logged = 0 //Vents diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm index 87384669a7c..e1c33f89a7e 100644 --- a/code/modules/mob/living/logout.dm +++ b/code/modules/mob/living/logout.dm @@ -1,4 +1,5 @@ /mob/living/Logout() + update_z(null) if(ranged_ability && client) ranged_ability.remove_mousepointer(client) ..() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index ccf319b0884..ae7fcf56a9d 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -634,7 +634,7 @@ var/list/ai_verbs_default = list( return if(href_list["trackbot"]) - var/mob/living/simple_animal/bot/target = locate(href_list["trackbot"]) in GLOB.simple_animal_list + var/mob/living/simple_animal/bot/target = locate(href_list["trackbot"]) in GLOB.simple_animals if(target) ai_actual_track(target) else @@ -642,7 +642,7 @@ var/list/ai_verbs_default = list( return if(href_list["callbot"]) //Command a bot to move to a selected location. - Bot = locate(href_list["callbot"]) in GLOB.simple_animal_list + Bot = locate(href_list["callbot"]) in GLOB.simple_animals if(!Bot || Bot.remote_disabled || control_disabled) return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off. waypoint_mode = 1 @@ -650,7 +650,7 @@ var/list/ai_verbs_default = list( return if(href_list["interface"]) //Remotely connect to a bot! - Bot = locate(href_list["interface"]) in GLOB.simple_animal_list + Bot = locate(href_list["interface"]) in GLOB.simple_animals if(!Bot || Bot.remote_disabled || control_disabled) return Bot.attack_ai(src) @@ -746,7 +746,7 @@ var/list/ai_verbs_default = list( d += "Query network status
    " d += "" - for(var/mob/living/simple_animal/bot/Bot in GLOB.simple_animal_list) + for(var/mob/living/simple_animal/bot/Bot in GLOB.simple_animals) if(is_ai_allowed(Bot.z) && !Bot.remote_disabled) //Only non-emagged bots on the allowed Z-level are detected! bot_area = get_area(Bot) d += "" diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 3ff26f7850c..970ac596482 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -451,7 +451,7 @@ response_harm = "kicks" gold_core_spawnable = CHEM_MOB_SPAWN_INVALID -/mob/living/simple_animal/pet/corgi/Ian/process_ai() +/mob/living/simple_animal/pet/corgi/Ian/Life() ..() //Feeding, chasing food, FOOOOODDDD @@ -578,7 +578,7 @@ return ..() -/mob/living/simple_animal/pet/corgi/Lisa/process_ai() +/mob/living/simple_animal/pet/corgi/Lisa/Life() ..() make_babies() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index ae19106e1af..869c663e312 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -54,9 +54,8 @@ else if(prob(5)) emote("snuffles") -/mob/living/simple_animal/mouse/process_ai() +/mob/living/simple_animal/mouse/Life() ..() - if(prob(0.5)) stat = UNCONSCIOUS icon_state = "mouse_[mouse_color]_sleep" diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm index e1e16ef42b2..36ce34094a0 100644 --- a/code/modules/mob/living/simple_animal/friendly/pug.dm +++ b/code/modules/mob/living/simple_animal/friendly/pug.dm @@ -19,7 +19,7 @@ see_in_dark = 5 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY -/mob/living/simple_animal/pet/pug/process_ai() +/mob/living/simple_animal/pet/pug/Life() ..() if(!resting && !buckled) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 50568fb37d0..852d7c406d1 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -30,8 +30,6 @@ var/stat_exclusive = 0 //Mobs with this set to 1 will exclusively attack things defined by stat_attack, stat_attack 2 means they will only attack corpses var/attack_same = 0 //Set us to 1 to allow us to attack our own faction, or 2, to only ever attack our own faction - var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever) - //typecache of things this mob will attack in DestroySurroundings() if it has environment_smash var/list/environment_target_typecache = list( /obj/machinery/door/window, @@ -66,12 +64,6 @@ walk(src, 0) return 0 -/mob/living/simple_animal/hostile/process_ai() - ..() - if(!AICanContinue()) - return 0 - return 1 - /mob/living/simple_animal/hostile/handle_automated_action() if(AIStatus == AI_OFF) return 0 @@ -83,7 +75,7 @@ DestroySurroundings() if(!MoveToTarget(possible_targets)) //if we lose our target if(AIShouldSleep(possible_targets)) // we try to acquire a new one - AIStatus = AI_IDLE // otherwise we go idle + toggle_ai(AI_IDLE) // otherwise we go idle return 1 /mob/living/simple_animal/hostile/attacked_by(obj/item/I, mob/living/user) @@ -264,8 +256,8 @@ if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight search_objects = 0 target = null - if(AIStatus == AI_IDLE) - AIStatus = AI_ON + if(AIStatus != AI_ON && AIStatus != AI_OFF) + toggle_ai(AI_ON) FindTarget() else if(target != null && prob(40))//No more pulling a mob forever and having a second player attack it, it can switch targets now if it finds a more suitable one FindTarget() @@ -401,9 +393,43 @@ if(AI_IDLE) if(FindTarget(possible_targets, 1)) . = 1 - AIStatus = AI_ON //Wake up for more than one Life() cycle. + toggle_ai(AI_ON) //Wake up for more than one Life() cycle. else . = 0 /mob/living/simple_animal/hostile/proc/AIShouldSleep(var/list/possible_targets) return !FindTarget(possible_targets, 1) + +/mob/living/simple_animal/hostile/consider_wakeup() + ..() + var/list/tlist + var/turf/T = get_turf(src) + + if(!T) + return + + if(!length(SSmobs.clients_by_zlevel[T.z])) // It's fine to use .len here but doesn't compile on 511 + toggle_ai(AI_Z_OFF) + return + + var/cheap_search = isturf(T) && !(T.z == 1) // The original check for SSmapping's station z level trait, unfortunately it isn't here. + if(cheap_search) + tlist = ListTargetsLazy(T.z) + else + tlist = ListTargets() + + if(AIStatus == AI_IDLE && FindTarget(tlist, 1)) + if(cheap_search) //Try again with full effort + FindTarget() + toggle_ai(AI_ON) + +/mob/living/simple_animal/hostile/proc/ListTargetsLazy(var/_Z)//Step 1, find out what we can see + var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/spacepod)) + . = list() + for(var/I in SSmobs.clients_by_zlevel[_Z]) + var/mob/M = I + if(get_dist(M, src) < vision_range) + if(isturf(M.loc)) + . += M + else if(M.loc.type in hostile_machines) + . += M.loc \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 81b384f56b7..60b0f7277c8 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -142,7 +142,7 @@ var/pre_attack = 0 loot = list(/obj/item/asteroid/goliath_hide{layer = 4.1}) -/mob/living/simple_animal/hostile/asteroid/goliath/process_ai() +/mob/living/simple_animal/hostile/asteroid/goliath/Life() ..() handle_preattack() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index b4019cff988..867b0eb5073 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -80,10 +80,14 @@ var/deathmessage = "" var/death_sound = null //The sound played on death + var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever) + var/can_have_ai = TRUE //once we have become sentient, we can never go back + var/shouldwakeup = FALSE //convenience var for forcibly waking up an idling AI on next check. + /mob/living/simple_animal/Initialize() ..() - GLOB.simple_animal_list += src + GLOB.simple_animals[AIStatus] += src verbs -= /mob/verb/observe if(!can_hide) verbs -= /mob/living/simple_animal/verb/hide @@ -97,7 +101,18 @@ collar.forceMove(loc) collar = null master_commander = null - GLOB.simple_animal_list -= src + GLOB.simple_animals[AIStatus] -= src + if(SSnpcpool.state == SS_PAUSED && LAZYLEN(SSnpcpool.currentrun)) + SSnpcpool.currentrun -= src + + if(nest) + nest.spawned_mobs -= src + nest = null + + var/turf/T = get_turf(src) + if (T && AIStatus == AI_Z_OFF) + SSidlenpcpool.idle_mobs_by_zlevel[T.z] -= src + return ..() /mob/living/simple_animal/Login() @@ -111,12 +126,6 @@ health = Clamp(health, 0, maxHealth) med_hud_set_status() - -/mob/living/simple_animal/proc/process_ai() - handle_automated_movement() - handle_automated_action() - handle_automated_speech() - /mob/living/simple_animal/lay_down() ..() handle_resting_state_icons() @@ -562,6 +571,8 @@ /* End Inventory */ /mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion + toggle_ai(AI_OFF) + can_have_ai = FALSE return /mob/living/simple_animal/update_sight() @@ -581,4 +592,37 @@ return /mob/living/simple_animal/can_hear() - . = TRUE \ No newline at end of file + . = TRUE + +/mob/living/simple_animal/proc/consider_wakeup() + if(pulledby || shouldwakeup) + toggle_ai(AI_ON) + +/mob/living/simple_animal/adjustHealth(amount, updating_health = TRUE, forced = FALSE) + . = ..() + if(!ckey && !stat)//Not unconscious + if(AIStatus == AI_IDLE) + toggle_ai(AI_ON) + +/mob/living/simple_animal/proc/toggle_ai(togglestatus) + if(!can_have_ai && (togglestatus != AI_OFF)) + return + if(AIStatus != togglestatus) + if(togglestatus > 0 && togglestatus < 5) + if(togglestatus == AI_Z_OFF || AIStatus == AI_Z_OFF) + var/turf/T = get_turf(src) + if(AIStatus == AI_Z_OFF) + SSidlenpcpool.idle_mobs_by_zlevel[T.z] -= src + else + SSidlenpcpool.idle_mobs_by_zlevel[T.z] += src + GLOB.simple_animals[AIStatus] -= src + GLOB.simple_animals[togglestatus] += src + AIStatus = togglestatus + else + stack_trace("Something attempted to set simple animals AI to an invalid state: [togglestatus]") + +/mob/living/simple_animal/onTransitZ(old_z, new_z) + ..() + if(AIStatus == AI_Z_OFF) + SSidlenpcpool.idle_mobs_by_zlevel[old_z] -= src + toggle_ai(initial(AIStatus)) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm index 7a17dfb202b..686a20cee36 100644 --- a/code/modules/mob/living/simple_animal/spawner.dm +++ b/code/modules/mob/living/simple_animal/spawner.dm @@ -29,7 +29,7 @@ spawned_mobs = null return ..() -/mob/living/simple_animal/hostile/spawner/process_ai() +/mob/living/simple_animal/hostile/spawner/Life() ..() spawn_mob() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 3e9ff0b7ba6..6a078ff2ba9 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -202,3 +202,4 @@ var/list/tkgrabbed_objects = list() // Assoc list of items to TK grabs var/forced_look = null // This can either be a numerical direction or a soft object reference (UID). It makes the mob always face towards the selected thing. + var/registered_z \ No newline at end of file diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index a46b9a94fc7..bbc3d6d7abe 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -193,7 +193,7 @@ close_spawn_windows() var/obj/O = locate("landmark*Observer-Start") to_chat(src, "Now teleporting.") - observer.loc = O.loc + observer.forceMove(O.loc) observer.timeofdeath = world.time // Set the time of death so that the respawn timer works correctly. client.prefs.update_preview_icon(1) observer.icon = client.prefs.preview_icon @@ -344,27 +344,27 @@ else if(IsSyndicateCommand(rank)) character.loc = pick(syndicateofficer) else - character.loc = pick(aroomwarp) + character.forceMove(pick(aroomwarp)) join_message = "has arrived" else if(spawning_at) S = spawntypes[spawning_at] if(S && istype(S)) if(S.check_job_spawning(rank)) - character.loc = pick(S.turfs) + character.forceMove(pick(S.turfs)) join_message = S.msg else to_chat(character, "Your chosen spawnpoint ([S.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.") - character.loc = pick(latejoin) + character.forceMove(pick(latejoin)) join_message = "has arrived on the station" else - character.loc = pick(latejoin) + character.forceMove(pick(latejoin)) join_message = "has arrived on the station" character.lastarea = get_area(loc) // Moving wheelchair if they have one if(character.buckled && istype(character.buckled, /obj/structure/chair/wheelchair)) - character.buckled.loc = character.loc + character.buckled.forceMove(character.loc) character.buckled.dir = character.dir character = SSjobs.EquipRank(character, rank, 1) //equips the human diff --git a/code/modules/pda/cart_apps.dm b/code/modules/pda/cart_apps.dm index de2414da743..a66e72d17a3 100644 --- a/code/modules/pda/cart_apps.dm +++ b/code/modules/pda/cart_apps.dm @@ -392,7 +392,7 @@ BucketData[++BucketData.len] = list("x" = 0, "y" = 0, dir=null, status = null) var/CbotData[0] - for(var/mob/living/simple_animal/bot/cleanbot/B in GLOB.simple_animal_list) + for(var/mob/living/simple_animal/bot/cleanbot/B in GLOB.simple_animals) var/turf/bl = get_turf(B) if(bl) if(bl.z != cl.z) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 44edebdca50..c130ea1d447 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -1,9 +1,12 @@ // Shuttle on-movement // -/atom/movable/proc/onShuttleMove(turf/T1, rotation) - if(rotation) - shuttleRotate(rotation) - forceMove(T1) - return 1 +/atom/movable/proc/onShuttleMove(turf/oldT, turf/T1, rotation) + var/turf/newT = get_turf(src) + if(newT.z != oldT.z) + onTransitZ(oldT.z, newT.z) + if(rotation) + shuttleRotate(rotation) + forceMove(T1) + return 1 /atom/movable/lighting_overlay/onShuttleMove() return 0 diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 06e0c2336f0..fba2a447d30 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -501,7 +501,7 @@ //move mobile to new location for(var/atom/movable/AM in T0) - AM.onShuttleMove(T1, rotation) + AM.onShuttleMove(T0, T1, rotation) if(rotation) T1.shuttleRotate(rotation) diff --git a/paradise.dme b/paradise.dme index 1b7a691c820..271e872ba5a 100644 --- a/paradise.dme +++ b/paradise.dme @@ -57,7 +57,6 @@ #include "code\__DEFINES\rolebans.dm" #include "code\__DEFINES\shuttle.dm" #include "code\__DEFINES\sight.dm" -#include "code\__DEFINES\snpc.dm" #include "code\__DEFINES\sound.dm" #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\station_goals.dm" @@ -199,7 +198,6 @@ #include "code\controllers\subsystem.dm" #include "code\controllers\verbs.dm" #include "code\controllers\Processes\lighting.dm" -#include "code\controllers\Processes\npcai.dm" #include "code\controllers\Processes\ticker.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" @@ -212,6 +210,7 @@ #include "code\controllers\subsystem\garbage.dm" #include "code\controllers\subsystem\holiday.dm" #include "code\controllers\subsystem\icon_smooth.dm" +#include "code\controllers\subsystem\idlenpcpool.dm" #include "code\controllers\subsystem\jobs.dm" #include "code\controllers\subsystem\machinery.dm" #include "code\controllers\subsystem\mapping.dm" @@ -219,7 +218,6 @@ #include "code\controllers\subsystem\nano_mob_hunter.dm" #include "code\controllers\subsystem\nanoui.dm" #include "code\controllers\subsystem\nightshift.dm" -#include "code\controllers\subsystem\npcai.dm" #include "code\controllers\subsystem\npcpool.dm" #include "code\controllers\subsystem\overlays.dm" #include "code\controllers\subsystem\radio.dm" @@ -1237,7 +1235,6 @@ #include "code\modules\awaymissions\loot.dm" #include "code\modules\awaymissions\map_rng.dm" #include "code\modules\awaymissions\pamphlet.dm" -#include "code\modules\awaymissions\snpc.dm" #include "code\modules\awaymissions\trigger.dm" #include "code\modules\awaymissions\zlevel.dm" #include "code\modules\awaymissions\zvis.dm" @@ -1253,7 +1250,6 @@ #include "code\modules\awaymissions\mission_code\evil_santa.dm" #include "code\modules\awaymissions\mission_code\spacebattle.dm" #include "code\modules\awaymissions\mission_code\spacehotel.dm" -#include "code\modules\awaymissions\mission_code\spacehotel_npcs.dm" #include "code\modules\awaymissions\mission_code\stationCollision.dm" #include "code\modules\awaymissions\mission_code\UO71-terrorspiders.dm" #include "code\modules\awaymissions\mission_code\wildwest.dm" @@ -1746,9 +1742,6 @@ #include "code\modules\mob\living\carbon\human\status_procs.dm" #include "code\modules\mob\living\carbon\human\update_icons.dm" #include "code\modules\mob\living\carbon\human\update_stat.dm" -#include "code\modules\mob\living\carbon\human\interactive\functions.dm" -#include "code\modules\mob\living\carbon\human\interactive\interactive.dm" -#include "code\modules\mob\living\carbon\human\interactive\prefabs.dm" #include "code\modules\mob\living\carbon\human\species\_species.dm" #include "code\modules\mob\living\carbon\human\species\abductor.dm" #include "code\modules\mob\living\carbon\human\species\diona.dm" diff --git a/strings/npc_chatter.json b/strings/npc_chatter.json deleted file mode 100644 index 833cb68605e..00000000000 --- a/strings/npc_chatter.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "nouns_insult": [ - "gaylord", - "shitcurity", - "noob", - "comdom", - "greyshirt", - "tator", - "lingbin", - "bitch", - "whorelord", - "cluwne", - "monkey", - "cheesemonger", - "milkdrinker" - ], - "adjective_objects": [ - "big", - "small", - "tiny", - "round", - "square", - "oblong", - "colorful", - "dull", - "shiny", - "sparkling", - "blinking", - "awful" - ], - "verbs_use": [ - "touch", - "hold", - "poke", - "punch", - "smash", - "assault", - "wrench", - "tickle", - "modify", - "whack", - "beat", - "tackle", - "destroy" - ], - "nouns_objects": [ - "thing", - "tool", - "whatever", - "potential murder weapon", - "object", - "toy", - "device", - "whatever" - ], - "nouns_generic": [ - "you", - "you there", - "guy", - "person", - "dude", - "jerk", - "officer" - ], - "curse_words": [ - "damn", - "shit", - "arse", - "ass", - "wank", - "jerk", - "bitch" - ], - "adjective_generic": [ - "nice", - "pretty", - "ugly", - "bad", - "okay", - "stupid" - ], - "verbs_move": [ - "run", - "jog", - "leg it", - "slide", - "cheese it", - "walk", - "stroll", - "fly", - "scoot", - "yakkety", - "speed", - "fuck off", - "escape" - ], - "verbs_touch": [ - "pat", - "mess with", - "absorb", - "sneeze on", - "inject", - "rip", - "slap", - "grab", - "choke" - ], - "adjective_insult": [ - "ugly", - "repulsive", - "dumb", - "asian", - "mongoloid", - "childish", - "captain-like", - "monkey-like", - "whoreish", - "dimwit", - "jerk-face", - "vomit-inducer" - ], - "nouns_body": [ - "ass", - "head", - "face", - "arms", - "fingers", - "toes", - "chest", - "eyes", - "nails", - "groin", - "stomach", - "intestines", - "head" - ] -} From 4b930617a6d004e1490f41728f33dc840d5e6c36 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 10:13:45 -0400 Subject: [PATCH 25/45] Automatic changelog generation for PR #11442 [ci skip] --- html/changelogs/AutoChangeLog-pr-11442.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11442.yml diff --git a/html/changelogs/AutoChangeLog-pr-11442.yml b/html/changelogs/AutoChangeLog-pr-11442.yml new file mode 100644 index 00000000000..2cdaf2355fe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11442.yml @@ -0,0 +1,6 @@ +author: "EvadableMoxie" +delete-after: True +changes: + - rscadd: "Added the Nanotrasen Hospital Vessel Asclepius, able to be deployed by admins." + - tweak: "Admin shuttle now requires ERT clearance instead of admin clearance." + - tweak: "Admin shuttle now has a navigation computer and tiny fans at the airlock." From 8249f871213c42898cc4e1984c9b4b98614e1532 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 10:14:20 -0400 Subject: [PATCH 26/45] Automatic changelog generation for PR #11443 [ci skip] --- html/changelogs/AutoChangeLog-pr-11443.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11443.yml diff --git a/html/changelogs/AutoChangeLog-pr-11443.yml b/html/changelogs/AutoChangeLog-pr-11443.yml new file mode 100644 index 00000000000..5c3a9a1b8e2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11443.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - bugfix: "punching a windoor no longer generates a runtime error." From 4349655c9118a2db7b2bda475e00f318df351828 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 10:14:42 -0400 Subject: [PATCH 27/45] Automatic changelog generation for PR #11445 [ci skip] --- html/changelogs/AutoChangeLog-pr-11445.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11445.yml diff --git a/html/changelogs/AutoChangeLog-pr-11445.yml b/html/changelogs/AutoChangeLog-pr-11445.yml new file mode 100644 index 00000000000..30b9ae088e8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11445.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - bugfix: "cryogenic_liquid/envenomed_filaments blobs no longer generate runtimes when their blob special attack hits mobs that do not process reagents" From 58549195943595d4e09a0f0e6d2296a43f3b9e98 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 10:19:52 -0400 Subject: [PATCH 28/45] Automatic changelog generation for PR #11429 [ci skip] --- html/changelogs/AutoChangeLog-pr-11429.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11429.yml diff --git a/html/changelogs/AutoChangeLog-pr-11429.yml b/html/changelogs/AutoChangeLog-pr-11429.yml new file mode 100644 index 00000000000..86509436332 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11429.yml @@ -0,0 +1,4 @@ +author: "Mitchs98" +delete-after: True +changes: + - rscadd: "You can now order a Pig Crate from Cargo for 25 points." From b6186e7c25f9791ab9dd4faa00355e49a9b816fb Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 10:39:05 -0400 Subject: [PATCH 29/45] Automatic changelog generation for PR #11426 [ci skip] --- html/changelogs/AutoChangeLog-pr-11426.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11426.yml diff --git a/html/changelogs/AutoChangeLog-pr-11426.yml b/html/changelogs/AutoChangeLog-pr-11426.yml new file mode 100644 index 00000000000..49414869223 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11426.yml @@ -0,0 +1,5 @@ +author: "Arkatos" +delete-after: True +changes: + - tweak: "Full toolbelts now spawn with randomly a colored cable coil" + - imageadd: "Added inhand sprites for belts" From 7b91bc392fcd726a1486a8fe02bf1d25715bdb53 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 10:39:28 -0400 Subject: [PATCH 30/45] Automatic changelog generation for PR #11418 [ci skip] --- html/changelogs/AutoChangeLog-pr-11418.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11418.yml diff --git a/html/changelogs/AutoChangeLog-pr-11418.yml b/html/changelogs/AutoChangeLog-pr-11418.yml new file mode 100644 index 00000000000..8e9f296ca97 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11418.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - rscadd: "Patch Pack is now craftable with a cardboard, costs 2 cardboard sheets." From 4ad19d0d81c9ad9e4c2e45c6e82ac87ef9c35613 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 10:40:23 -0400 Subject: [PATCH 31/45] Automatic changelog generation for PR #11416 [ci skip] --- html/changelogs/AutoChangeLog-pr-11416.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11416.yml diff --git a/html/changelogs/AutoChangeLog-pr-11416.yml b/html/changelogs/AutoChangeLog-pr-11416.yml new file mode 100644 index 00000000000..c3c444d9879 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11416.yml @@ -0,0 +1,4 @@ +author: "KasparoVy" +delete-after: True +changes: + - rscadd: "Adds a verb to eyewear you can use to adjust them so they appear above or below masks. Discover interesting combinations and enjoy a cool look." From 93b5a4a344b5e067507897efa8391d4353c5edad Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 10:40:41 -0400 Subject: [PATCH 32/45] Automatic changelog generation for PR #11415 [ci skip] --- html/changelogs/AutoChangeLog-pr-11415.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11415.yml diff --git a/html/changelogs/AutoChangeLog-pr-11415.yml b/html/changelogs/AutoChangeLog-pr-11415.yml new file mode 100644 index 00000000000..8a197f8f6f4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11415.yml @@ -0,0 +1,4 @@ +author: "Twinmold93" +delete-after: True +changes: + - rscadd: "Adds Server Time to the Status Tab for Admins." From 657c6578068523fe89c6a74a4ebb34d00340cce2 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 10:41:03 -0400 Subject: [PATCH 33/45] Automatic changelog generation for PR #11403 [ci skip] --- html/changelogs/AutoChangeLog-pr-11403.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11403.yml diff --git a/html/changelogs/AutoChangeLog-pr-11403.yml b/html/changelogs/AutoChangeLog-pr-11403.yml new file mode 100644 index 00000000000..2ffea4e8a9d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11403.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - tweak: "You can now identify when someone is using internals from a tank in their pocket, without having to remove the tank." From 0ad94300451e637d0490504f3e1db08f09a8a33c Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 10:42:51 -0400 Subject: [PATCH 34/45] Automatic changelog generation for PR #11431 [ci skip] --- html/changelogs/AutoChangeLog-pr-11431.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11431.yml diff --git a/html/changelogs/AutoChangeLog-pr-11431.yml b/html/changelogs/AutoChangeLog-pr-11431.yml new file mode 100644 index 00000000000..d9f93831773 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11431.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - imageadd: "Added 4 new plushies" From 50fafb1ada96fb7d847fca275e71d8532084ad29 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 10:43:37 -0400 Subject: [PATCH 35/45] Automatic changelog generation for PR #11434 [ci skip] --- html/changelogs/AutoChangeLog-pr-11434.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11434.yml diff --git a/html/changelogs/AutoChangeLog-pr-11434.yml b/html/changelogs/AutoChangeLog-pr-11434.yml new file mode 100644 index 00000000000..f07ba09cf41 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11434.yml @@ -0,0 +1,4 @@ +author: "TDSSS" +delete-after: True +changes: + - bugfix: "typo on sst shuttle console" From e5355a13d96bcc3bc319823cc216c552120adb4e Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 10:48:18 -0400 Subject: [PATCH 36/45] Automatic changelog generation for PR #11425 [ci skip] --- html/changelogs/AutoChangeLog-pr-11425.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11425.yml diff --git a/html/changelogs/AutoChangeLog-pr-11425.yml b/html/changelogs/AutoChangeLog-pr-11425.yml new file mode 100644 index 00000000000..f3ed1d5bd9e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11425.yml @@ -0,0 +1,5 @@ +author: "Arkatos" +delete-after: True +changes: + - tweak: "Examine tooltip delay increased slightly" + - bugfix: "Examine tooltips now work properly on items in storage" From bcc1bdc1687246ab1d6a6601b86bd73a9fd3ea02 Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Fri, 3 May 2019 18:27:57 +0200 Subject: [PATCH 37/45] Remove jumpsuit from uplink --- code/datums/uplink_item.dm | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index aaeffa08b02..d81ad08e897 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1067,13 +1067,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_tools category = "Stealth and Camouflage Items" -/datum/uplink_item/stealthy_tools/chameleon_jumpsuit - name = "Chameleon Jumpsuit" - desc = "A jumpsuit used to imitate the uniforms of Nanotrasen crewmembers." - reference = "CJ" - item = /obj/item/clothing/under/chameleon - cost = 2 - /datum/uplink_item/stealthy_tools/chameleon_stamp name = "Chameleon Stamp" desc = "A stamp that can be activated to imitate an official Nanotrasen Stamp. The disguised stamp will work exactly like the real stamp and will allow you to forge false documents to gain access or equipment; \ @@ -1148,7 +1141,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/stealthy_tools/chameleon name = "Chameleon Kit" desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \ - Due to budget cuts, the shoes don't provide protection against slipping." + Due to budget cuts, the shoes don't provide protection against slipping. The set comes with a complementary chameleon stamp." reference = "CHAM" item = /obj/item/storage/box/syndie_kit/chameleon cost = 2 From eba4d82f8836a36ebf46a15535cbbfd644a338b7 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 13:30:45 -0400 Subject: [PATCH 38/45] Automatic changelog generation for PR #11450 [ci skip] --- html/changelogs/AutoChangeLog-pr-11450.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11450.yml diff --git a/html/changelogs/AutoChangeLog-pr-11450.yml b/html/changelogs/AutoChangeLog-pr-11450.yml new file mode 100644 index 00000000000..efa7b8c358e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11450.yml @@ -0,0 +1,12 @@ +author: "variableundefined" +delete-after: True +changes: + - tweak: "Simple animals actually use the new subsystem now" + - tweak: "What was NPCAI is now renamed to NPCPool - Its the functional equivalent of what it is in tg" + - tweak: "Simple animals actually run on subsystem instead of a process now." + - rscadd: "idleNPCpool has been added reducing performance impact of hostile simple animals" + - rscdel: "NPCAI Process (That run both SNPC and SimpleAnimals) that was somehow left out by me" + - rscdel: "SNPC & assocaited NPCAI Subsystem" + - rscdel: "Some of space hotel's functions." + - rscdel: "Bodysnatch gland." + - tweak: "process_ai has been deprecated" From ea517f153da8ac9bc208b467ad2096a3942fec1d Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Fri, 3 May 2019 20:50:03 +0200 Subject: [PATCH 39/45] Fix the steel_rain runtime again --- code/modules/shuttle/shuttle.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 5c6445b2927..9a4f948307d 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -714,6 +714,8 @@ possible_destinations = C.possible_destinations shuttleId = C.shuttleId +/obj/machinery/computer/shuttle/Initialize(mapload) + . = ..() connect() /obj/machinery/computer/shuttle/proc/connect() From 06b1b1cdce203f590081f7bba7933ea42897b4ad Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 15:00:58 -0400 Subject: [PATCH 40/45] Automatic changelog generation for PR #11451 [ci skip] --- html/changelogs/AutoChangeLog-pr-11451.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11451.yml diff --git a/html/changelogs/AutoChangeLog-pr-11451.yml b/html/changelogs/AutoChangeLog-pr-11451.yml new file mode 100644 index 00000000000..347ccdf9b19 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11451.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - bugfix: "The steel_rain runtime fix has been re-applied." From ba2a70091fc54037c3eee9efe53fc885ed80e57e Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 20:23:42 -0400 Subject: [PATCH 41/45] Automatic changelog generation for PR #11428 [ci skip] --- html/changelogs/AutoChangeLog-pr-11428.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11428.yml diff --git a/html/changelogs/AutoChangeLog-pr-11428.yml b/html/changelogs/AutoChangeLog-pr-11428.yml new file mode 100644 index 00000000000..fe0d3f99aac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11428.yml @@ -0,0 +1,5 @@ +author: "Markolie" +delete-after: True +changes: + - rscadd: "Syndicate operatives may now purchase a chameleon bundles (2TC), which allows them to disguise not just their jumpsuit, but all of their equipment. They can change individual clothing as well as the outfit as a whole." + - tweak: "When using a voice changer, NTTC will no longer default to an \"Unknown\" job: it'll still use the assignment on your card to prevent meta-gaming. Always combine a voice changer and a Syndicate ID." From 3c4f56ecdb7c22309eefe910eb6a917c04492a47 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 3 May 2019 20:34:11 -0400 Subject: [PATCH 42/45] Automatic changelog generation for PR #11384 [ci skip] --- html/changelogs/AutoChangeLog-pr-11384.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11384.yml diff --git a/html/changelogs/AutoChangeLog-pr-11384.yml b/html/changelogs/AutoChangeLog-pr-11384.yml new file mode 100644 index 00000000000..1dee1b49d8e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11384.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - rscadd: "Trying to latejoin a round with no open job slots now results in an informative error message, rather than broken-looking blank window." From 9b00e11628efc60e4d43bd6536fcda568b498acb Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Fri, 3 May 2019 23:08:36 -0400 Subject: [PATCH 43/45] Fixes Warning Spam for Mob Transitions and Roundstart Spawning --- code/controllers/subsystem/jobs.dm | 4 ++-- code/game/turfs/space/space.dm | 10 +++++----- .../mob/living/simple_animal/hostile/hostile.dm | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 02f2681b22d..a84aab47c0b 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -473,10 +473,10 @@ SUBSYSTEM_DEF(jobs) T = S.loc if(T) - H.loc = T + H.forceMove(T) // Moving wheelchair if they have one if(H.buckled && istype(H.buckled, /obj/structure/chair/wheelchair)) - H.buckled.loc = H.loc + H.buckled.forceMove(H.loc) H.buckled.dir = H.dir if(job) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index f007aebfff1..68c0cba83ff 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -91,17 +91,17 @@ /turf/space/Entered(atom/movable/A as mob|obj, atom/OL, ignoreRest = 0) ..() + if((!(A) || !(src in A.locs))) + return - if(destination_z && A && (src in A.locs)) - A.x = destination_x - A.y = destination_y - A.z = destination_z + if(destination_z && destination_x && destination_y) + A.forceMove(locate(destination_x, destination_y, destination_z)) if(isliving(A)) var/mob/living/L = A if(L.pulling) var/turf/T = get_step(L.loc,turn(A.dir, 180)) - L.pulling.loc = T + L.pulling.forceMove(T) //now we're on the new z_level, proceed the space drifting sleep(0)//Let a diagonal move finish, if necessary diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 852d7c406d1..1914ef476cf 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -412,7 +412,7 @@ toggle_ai(AI_Z_OFF) return - var/cheap_search = isturf(T) && !(T.z == 1) // The original check for SSmapping's station z level trait, unfortunately it isn't here. + var/cheap_search = isturf(T) && !is_station_level(T.z) if(cheap_search) tlist = ListTargetsLazy(T.z) else From 1aef02cabd7f9b41c48993883d4ba58b2150b9f6 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 4 May 2019 00:18:00 -0400 Subject: [PATCH 44/45] Automatic changelog generation for PR #11453 [ci skip] --- html/changelogs/AutoChangeLog-pr-11453.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11453.yml diff --git a/html/changelogs/AutoChangeLog-pr-11453.yml b/html/changelogs/AutoChangeLog-pr-11453.yml new file mode 100644 index 00000000000..be5b75e4bfa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11453.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes a few instances generating log spam relating to z-level tracking" From 096d72f7f36416120f4aaaf3f03ec249141d667e Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 4 May 2019 01:39:28 -0400 Subject: [PATCH 45/45] Automatic changelog generation for PR #11441 [ci skip] --- html/changelogs/AutoChangeLog-pr-11441.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11441.yml diff --git a/html/changelogs/AutoChangeLog-pr-11441.yml b/html/changelogs/AutoChangeLog-pr-11441.yml new file mode 100644 index 00000000000..083b619ed6d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11441.yml @@ -0,0 +1,4 @@ +author: "Markolie" +delete-after: True +changes: + - tweak: "Admins with advanced admin interaction toggled on can now interact with the small airlock buttons."

    Name

    Status

    Location

    Control

    [Bot.hacked ? "(!) [Bot.name]" : Bot.name] ([Bot.model])