[FONT_NORMAL(G.get_description(get_gear_metadata(G,1), ticked))]"
var/allowed = 1
if(allowed && G.allowed_roles)
var/good_job = 0
@@ -250,6 +250,22 @@ var/global/list/gear_datums = list()
entry += "[english_list(skill_checks)]"
+ if (allowed && G.allowed_traits)
+ var/datum/species/picked_species = all_species[pref.species]
+ var/list/species_traits = picked_species.traits
+ var/trait_checks = list()
+ entry += " "
+ for (var/trait_type in G.allowed_traits)
+ var/singleton/trait/trait = GET_SINGLETON(trait_type)
+ var/trait_entry = "[trait.name]"
+ if (LAZYISIN(pref.picked_traits, trait_type) || LAZYISIN(species_traits, trait_type))
+ trait_entry = SPAN_COLOR("#55cc55", "[trait_entry]")
+ else
+ trait_entry = SPAN_COLOR("#cc5555", "[trait_entry]")
+ allowed = FALSE
+ trait_checks += trait_entry
+ entry += "[english_list(trait_checks)]"
+
// [SIERRA-ADD] - LOADOUT-ITEMS
if(allowed && G.allowed_factions)
var/good_background = 0
@@ -362,6 +378,8 @@ var/global/list/gear_datums = list()
var/list/allowed_roles //Roles that can spawn with this item.
var/list/allowed_branches //Service branches that can spawn with it.
var/list/allowed_skills //Skills required to spawn with this item.
+ ///Traits required to spawn with this item.
+ var/list/allowed_traits
var/whitelisted //Term to check the whitelist for..
var/sort_category = "General"
var/flags //Special tweaks in New
@@ -387,10 +405,10 @@ var/global/list/gear_datums = list()
if(custom_setup_proc)
gear_tweaks += new/datum/gear_tweak/custom_setup(custom_setup_proc)
-/datum/gear/proc/get_description(metadata)
+/datum/gear/proc/get_description(metadata, include_extended_description)
. = description
for(var/datum/gear_tweak/gt in gear_tweaks)
- . = gt.tweak_description(., metadata["[gt]"])
+ . = gt.tweak_description(., metadata["[gt]"], include_extended_description && (flags & GEAR_HAS_EXTENDED_DESCRIPTION))
/datum/gear_data
var/path
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index b9297d36a82ca..cb56e99ad9a12 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -364,6 +364,18 @@
character.gen_record = gen_record
character.exploit_record = exploit_record
+ if(LAZYLEN(picked_traits))
+ for (var/picked_type as anything in picked_traits)
+ var/singleton/trait/selected = GET_SINGLETON(picked_type)
+ if (!selected || !istype(selected))
+ continue
+ if (length(selected.metaoptions))
+ var/list/temp_list = picked_traits[picked_type]
+ for (var/meta_option in temp_list)
+ character.SetTrait(picked_type, temp_list[meta_option], meta_option)
+ else
+ character.SetTrait(picked_type, picked_traits[picked_type])
+
if(LAZYLEN(character.descriptors))
for(var/entry in body_descriptors)
character.descriptors[entry] = body_descriptors[entry]
diff --git a/code/modules/clothing/ears/headphones.dm b/code/modules/clothing/ears/headphones.dm
index 4d08aca156e1b..b1db917266d59 100644
--- a/code/modules/clothing/ears/headphones.dm
+++ b/code/modules/clothing/ears/headphones.dm
@@ -6,7 +6,7 @@
item_state = "headphones_off"
slot_flags = SLOT_EARS | SLOT_TWOEARS
volume_multiplier = 0.5
- var/jukebox/jukebox
+ var/datum/jukebox/jukebox
/obj/item/clothing/ears/headphones/Initialize()
diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm
index 13daaa7222b27..1f90ff2d63bd0 100644
--- a/code/modules/clothing/masks/smokable.dm
+++ b/code/modules/clothing/masks/smokable.dm
@@ -330,7 +330,7 @@
return ..()
-/obj/item/clothing/mask/smokable/cigarette/use_before(mob/living/carbon/human/H, mob/user)
+/obj/item/clothing/mask/smokable/use_before(mob/living/carbon/human/H, mob/user)
if (lit && H == user && istype(H))
var/obj/item/blocked = H.check_mouth_coverage()
if (blocked)
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index d7e9814ee97ad..a15725badab7f 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -55,12 +55,12 @@
var/obj/item/tank/air_type = /obj/item/tank/oxygen
//Component/device holders.
- var/obj/item/tank/air_supply // Air tank, if any.
+ var/obj/item/tank/air_supply // Air tank, if any.
var/obj/item/clothing/shoes/boots = null // Deployable boots, if any.
var/obj/item/clothing/suit/space/rig/chest // Deployable chestpiece, if any.
var/obj/item/clothing/head/helmet/space/rig/helmet = null // Deployable helmet, if any.
var/obj/item/clothing/gloves/rig/gloves = null // Deployable gauntlets, if any.
- var/obj/item/cell/cell // Power supply, if any.
+ var/obj/item/cell/cell // Power supply, if any.
var/obj/item/rig_module/selected_module = null // Primary system (used with middle-click)
var/obj/item/rig_module/vision/visor // Kinda shitty to have a var for a module, but saves time.
var/obj/item/rig_module/voice/speech // As above.
@@ -203,15 +203,18 @@
air_supply = new air_type(src)
if(glove_type)
gloves = new glove_type(src)
+ verbs |= /obj/item/rig/proc/toggle_gauntlets
if(helm_type)
helmet = new helm_type(src)
verbs |= /obj/item/rig/proc/toggle_helmet
if(boot_type)
boots = new boot_type(src)
+ verbs |= /obj/item/rig/proc/toggle_boots
if(chest_type)
chest = new chest_type(src)
if(allowed)
chest.allowed = allowed
+ verbs |= /obj/item/rig/proc/toggle_chest
for(var/obj/item/piece in list(gloves,helmet,boots,chest))
if(!istype(piece))
@@ -319,7 +322,7 @@
SPAN_INFO("[wearer]'s suit emits a quiet hum as it begins to adjust its seals."), \
SPAN_INFO("With a quiet hum, the suit begins running checks and adjusting components."))
- if(seal_delay && !instant && !do_after(wearer,seal_delay, src))
+ if(seal_delay && !instant && !wearer.do_skilled(seal_delay, SKILL_EVA, src))
failed_to_seal = 1
if(!wearer)
@@ -342,7 +345,7 @@
if(!failed_to_seal && wearer.back == src && piece == compare_piece)
- if(seal_delay && !instant && !do_after(wearer, seal_delay, src, do_flags = DO_DEFAULT & ~DO_USER_SAME_HAND))
+ if(seal_delay && !instant && !wearer.do_skilled(seal_delay, SKILL_EVA, src, do_flags = DO_DEFAULT & ~DO_USER_SAME_HAND))
failed_to_seal = 1
piece.icon_state = "[initial(icon_state)][!seal_target ? "_sealed" : ""]"
@@ -783,6 +786,9 @@
var/mob/living/carbon/human/holder
+ if(piece != "helmet" && (!offline || sealing))
+ FEEDBACK_FAILURE(initiator, SPAN_WARNING("The hardsuit needs to be deactivated before you can do that."))
+ return
if(use_obj)
holder = use_obj.loc
if(istype(holder))
@@ -843,6 +849,18 @@
for(var/piece in list("helmet","gauntlets","chest","boots"))
toggle_piece(piece, H, ONLY_DEPLOY)
+/obj/item/rig/proc/retract(mob/M)
+
+ var/mob/living/carbon/human/H = M
+
+ if(!H || !istype(H)) return
+
+ if(H.back != src)
+ return
+
+ for(var/piece in list("helmet","gauntlets","chest","boots"))
+ toggle_piece(piece, H, ONLY_RETRACT)
+
/obj/item/rig/dropped(mob/user)
..()
for(var/piece in list("helmet","gauntlets","chest","boots"))
diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm
index 18e6d94226d10..fb0bf392ef92a 100644
--- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm
@@ -55,10 +55,10 @@
toggle_piece("helmet",wearer)
-/obj/item/rig/verb/deploy_suit()
+/obj/item/rig/proc/toggle_chest()
- set name = "Deploy Hardsuit"
- set desc = "Deploys helmet, gloves and boots."
+ set name = "Toggle Chestpiece"
+ set desc = "Deploys or retracts your chestpiece."
set category = "Hardsuit"
set src = usr.contents
@@ -69,14 +69,62 @@
if(!check_suit_access(usr))
return
- if(!check_power_cost(usr))
+ toggle_piece("chest",wearer)
+
+/obj/item/rig/proc/toggle_gauntlets()
+
+ set name = "Toggle Gauntlets"
+ set desc = "Deploys or retracts your gauntlets."
+ set category = "Hardsuit"
+ set src = usr.contents
+
+ if(!istype(wearer) || !wearer.back == src)
+ to_chat(usr, SPAN_WARNING("The hardsuit is not being worn."))
+ return
+
+ if(!check_suit_access(usr))
+ return
+
+ toggle_piece("gauntlets",wearer)
+
+/obj/item/rig/proc/toggle_boots()
+
+ set name = "Toggle Boots"
+ set desc = "Deploys or retracts your boots."
+ set category = "Hardsuit"
+ set src = usr.contents
+
+ if(!istype(wearer) || !wearer.back == src)
+ to_chat(usr, SPAN_WARNING("The hardsuit is not being worn."))
+ return
+
+ if(!check_suit_access(usr))
+ return
+
+ toggle_piece("boots",wearer)
+
+/obj/item/rig/verb/toggle_all_pieces()
+
+ set name = "Toggle All Pieces"
+ set desc = "Retracts your hardsuit if it is completely deployed, or activates all currently stowed pieces."
+ set category = "Hardsuit"
+ set src = usr.contents
+
+ if(!istype(wearer) || !wearer.back == src)
+ to_chat(usr, SPAN_WARNING("The hardsuit is not being worn."))
return
- deploy(wearer)
+ if(!check_suit_access(usr))
+ return
+
+ if(!suit_is_deployed())
+ deploy(wearer)
+ else
+ retract(wearer)
/obj/item/rig/verb/toggle_seals_verb()
- set name = "Toggle Hardsuit"
+ set name = "Cycle Hardsuit"
set desc = "Activates or deactivates your rig."
set category = "Hardsuit"
set src = usr.contents
diff --git a/code/modules/clothing/spacesuits/void/wizard.dm b/code/modules/clothing/spacesuits/void/wizard.dm
index 61a39aa2c7d71..de245713dd736 100644
--- a/code/modules/clothing/spacesuits/void/wizard.dm
+++ b/code/modules/clothing/spacesuits/void/wizard.dm
@@ -52,7 +52,7 @@
body_parts_covered = HANDS
cold_protection = HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
- species_restricted = null
+ species_restricted = list("exclude",SPECIES_NABBER)
gender = PLURAL
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index df877f8b8610f..fe999c9796434 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -50,6 +50,13 @@
desc = "This suit says to you 'hush'!"
icon_state = "chaplain_hoodie"
body_parts_covered = UPPER_TORSO|ARMS
+ allowed = list (
+ /obj/item/nullrod,
+ /obj/item/storage/bible,
+ /obj/item/reagent_containers/food/drinks/bottle/holywater,
+ /obj/item/material/cross
+ )
+ valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_DECOR)
//Chaplain
/obj/item/clothing/suit/nun
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 9dfdb6c33d4a3..5bfafe5c1f4ff 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -96,6 +96,7 @@
icon_state = "overalls"
item_state = "overalls"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
+ species_restricted = list("exclude",SPECIES_NABBER)
/obj/item/clothing/suit/syndicatefake
@@ -277,34 +278,30 @@
icon_state = "swim_red"
siemens_coefficient = 1
-/obj/item/clothing/suit/poncho/colored
+/obj/item/clothing/suit/poncho
name = "poncho"
desc = "A simple, comfortable poncho."
species_restricted = null
icon_state = "classicponcho"
-/obj/item/clothing/suit/poncho/colored/green
+/obj/item/clothing/suit/poncho/green
name = "green poncho"
desc = "A simple, comfortable cloak without sleeves. This one is green."
- species_restricted = null
icon_state = "greenponcho"
-/obj/item/clothing/suit/poncho/colored/red
+/obj/item/clothing/suit/poncho/red
name = "red poncho"
desc = "A simple, comfortable cloak without sleeves. This one is red."
- species_restricted = null
icon_state = "redponcho"
-/obj/item/clothing/suit/poncho/colored/purple
+/obj/item/clothing/suit/poncho/purple
name = "purple poncho"
desc = "A simple, comfortable cloak without sleeves. This one is purple."
- species_restricted = null
icon_state = "purpleponcho"
-/obj/item/clothing/suit/poncho/colored/blue
+/obj/item/clothing/suit/poncho/blue
name = "blue poncho"
desc = "A simple, comfortable cloak without sleeves. This one is blue."
- species_restricted = null
icon_state = "blueponcho"
/obj/item/clothing/suit/storage/toggle/bomber
@@ -346,12 +343,17 @@
icon_state = "brown_jacket_nt"
/obj/item/clothing/suit/storage/toggle/agent_jacket
- name = "agent jacket"
+ name = "\improper SFP jacket"
desc = "A black leather jacket belonging to an agent of the Sol Federal Police."
icon_state = "agent_jacket"
valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA)
body_parts_covered = UPPER_TORSO|ARMS
+/obj/item/clothing/suit/storage/toggle/agent_jacket/formal
+ name = "formal SFP coat"
+ desc = "A black suit jacket belonging to an agent of the Sol Federal Police. It is of exceptional quality."
+ icon_state = "agent_formal"
+
/obj/item/clothing/suit/storage/toggle/hoodie
name = "hoodie"
desc = "A warm sweatshirt."
@@ -384,44 +386,46 @@
desc = "A warm, black sweatshirt."
color = COLOR_DARK_GRAY
+/obj/item/clothing/suit/storage/agent_rain
+ name = "\improper SFP patrol cloak"
+ desc = "A black raincloak belonging to an agent of the Sol Federal Police. It is almost certainly wind and waterproof."
+ icon_state = "agent_raincloak"
+ valid_accessory_slots = list(ACCESSORY_SLOT_INSIGNIA)
+ blood_overlay_type = "coat"
+
/obj/item/clothing/suit/storage/mbill
name = "shipping jacket"
desc = "A green jacket bearing the logo of Major Bill's Shipping."
icon_state = "mbill"
-/obj/item/clothing/suit/poncho/roles/security
+/obj/item/clothing/suit/poncho/security
name = "security poncho"
desc = "A simple, comfortable cloak without sleeves. This one is black and red, which are standard Security colors."
- species_restricted = null
icon_state = "secponcho"
-/obj/item/clothing/suit/poncho/roles/medical
+/obj/item/clothing/suit/poncho/medical
name = "medical poncho"
desc = "A simple, comfortable cloak without sleeves. This one is white with a blue tint, which are standard Medical colors."
- species_restricted = null
icon_state = "medponcho"
-/obj/item/clothing/suit/poncho/roles/engineering
+/obj/item/clothing/suit/poncho/engineering
name = "engineering poncho"
desc = "A simple, comfortable cloak without sleeves. This one is yellow and orange, which are standard Engineering colors."
- species_restricted = null
icon_state = "engiponcho"
-/obj/item/clothing/suit/poncho/roles/science
+/obj/item/clothing/suit/poncho/science
name = "science poncho"
desc = "A simple, comfortable cloak without sleeves. This one is white with a few bottle green stripes, corporate colors."
- species_restricted = null
icon_state = "sciponcho"
-/obj/item/clothing/suit/poncho/roles/science/nanotrasen
+/obj/item/clothing/suit/poncho/nanotrasen
name = "\improper NanoTrasen poncho"
desc = "A simple, comfortable cloak without sleeves. This one is white with a few red stripes, colors of NanoTrasen. Go NanoTrasen!"
icon_state = "sciponcho_nt"
-/obj/item/clothing/suit/poncho/roles/cargo
+/obj/item/clothing/suit/poncho/cargo
name = "cargo poncho"
desc = "A simple, comfortable cloak without sleeves. This one is tan and grey, which are standard Cargo colors."
- species_restricted = null
icon_state = "cargoponcho"
/*
diff --git a/code/modules/clothing/under/accessories/armor_tag.dm b/code/modules/clothing/under/accessories/armor_tag.dm
index 7a30bf4265db1..79b8858526e3f 100644
--- a/code/modules/clothing/under/accessories/armor_tag.dm
+++ b/code/modules/clothing/under/accessories/armor_tag.dm
@@ -33,6 +33,11 @@
desc = "An armor tag with the acronym SAARE printed in olive-green lettering on it."
icon_state = "saaretag"
+/obj/item/clothing/accessory/armor_tag/sfp
+ name = "\improper SFP tags"
+ desc = "A set of high-visibility armor tags made of reflective materials. The pale blue rectangle is a hallmark of the Sol Federal Police."
+ icon_state = "sfptag"
+
/obj/item/clothing/accessory/armor_tag/press
name = "\improper PRESS tag"
diff --git a/code/modules/clothing/under/accessories/chaplain.dm b/code/modules/clothing/under/accessories/chaplain.dm
index abc78d33c87dc..36d6c34bf4c08 100644
--- a/code/modules/clothing/under/accessories/chaplain.dm
+++ b/code/modules/clothing/under/accessories/chaplain.dm
@@ -60,3 +60,10 @@
name = "chaplain insignia (taoism)"
desc = "An insignia worn by chaplains. The yin yang represents Taoism."
icon_state = "taoinsignia"
+
+
+/obj/item/clothing/accessory/stole
+ name = "stole"
+ desc = "A long, colourful liturgical vestment used by Christian clergy."
+ icon_state = "stole"
+ w_class = ITEM_SIZE_SMALL
diff --git a/code/modules/clothing/under/accessories/pronouns.dm b/code/modules/clothing/under/accessories/pronouns.dm
index 91693989f5fbb..c7a9d6d65a525 100644
--- a/code/modules/clothing/under/accessories/pronouns.dm
+++ b/code/modules/clothing/under/accessories/pronouns.dm
@@ -1,47 +1,8 @@
/obj/item/clothing/accessory/pronouns
- abstract_type = /obj/item/clothing/accessory/pronouns
- name = "base pronouns badge"
+ name = "customisable pronouns badge"
+ desc = "A badge showing the wearer's pronouns. Customisable!"
icon_state = "pronounpin"
item_state = "pronouns"
on_rolled_down = ACCESSORY_ROLLED_NONE
slot = ACCESSORY_SLOT_INSIGNIA
accessory_flags = ACCESSORY_REMOVABLE | ACCESSORY_HIGH_VISIBILITY
-
-
-/obj/item/clothing/accessory/pronouns/they
- name = "they/them pronouns badge"
- desc = "A badge showing the wearer's pronouns: they, them and theirs."
-
-
-/obj/item/clothing/accessory/pronouns/hehim
- name = "he/him pronouns badge"
- desc = "A badge showing the wearer's pronouns: he, him and his."
-
-
-/obj/item/clothing/accessory/pronouns/sheher
- name = "she/her pronouns badge"
- desc = "A badge showing the wearer's pronouns: she, her and hers."
-
-
-/obj/item/clothing/accessory/pronouns/hethey
- name = "he/they pronouns badge"
- desc = "A badge showing the wearer's pronouns: he, him and his or they, them and theirs."
-
-
-/obj/item/clothing/accessory/pronouns/shethey
- name = "she/they pronouns badge"
- desc = "A badge showing the wearer's pronouns: she, her and hers or they, them and theirs."
-
-/obj/item/clothing/accessory/pronouns/heshe
- name = "he/she pronouns badge"
- desc = "A badge showing the wearer's pronouns: he, him and his or she, her and hers."
-
-
-/obj/item/clothing/accessory/pronouns/zehir
- name = "ze/hir pronouns badge"
- desc = "A badge showing the wearer's pronouns: ze, hir and hirs."
-
-
-/obj/item/clothing/accessory/pronouns/ask
- name = "ask my pronouns badge"
- desc = "A badge asking others to ask for the wearer's pronouns."
diff --git a/code/modules/clothing/under/accessories/wristwatches.dm b/code/modules/clothing/under/accessories/wristwatches.dm
index d3cdd25ef14a5..b3885e6086f0a 100644
--- a/code/modules/clothing/under/accessories/wristwatches.dm
+++ b/code/modules/clothing/under/accessories/wristwatches.dm
@@ -5,6 +5,25 @@
body_location = HANDS
+/obj/item/clothing/accessory/wristwatch/examine(mob/user, distance)
+ . = ..()
+ if (distance > 1)
+ return
+ var/list/date = text2numlist(stationdate2text(), "-")
+ var/year = date[1]
+ var/month = GLOB.month_names[date[2]]
+ var/day = date[3]
+ var/time = stationtime2text()
+ to_chat(user, "You check \the [src]. It is [time] on the [day]\th of [month], [year].")
+
+
+/obj/item/clothing/accessory/wristwatch/OnTopic(mob/user, list/href_list)
+ if (href_list["check_watch"])
+ if (istype(user))
+ examinate(user, src)
+ return TOPIC_HANDLED
+
+
/obj/item/clothing/accessory/wristwatch/leather
name = "leather wrist watch"
desc = "A rugged timekeeping device. Its leather strap is quite fashionable."
@@ -15,22 +34,3 @@
name = "fancy wrist watch"
desc = "A gaudy timekeeping device. It probably cost more than your education."
icon_state = "wristwatch_fancy"
-
-
-/obj/item/clothing/accessory/wristwatch/examine(mob/user, distance)
- . = ..()
- if (distance <= 1)
- CheckTime(user)
-
-
-/obj/item/clothing/accessory/wristwatch/proc/CheckTime(mob/user)
- var/extra_days = round(station_time_in_ticks / (1 DAY)) DAYS
- var/timeofday = world.timeofday + extra_days
- to_chat(user, "You check \the [src]. The time is [stationtime2text()] on the [time2text(timeofday, "DD")]\th of [time2text(timeofday, "Month")], [GLOB.using_map.game_year].")
-
-
-/obj/item/clothing/accessory/wristwatch/OnTopic(mob/user, list/href_list)
- if(href_list["check_watch"])
- if(istype(user))
- examinate(user, src)
- return TOPIC_HANDLED
diff --git a/code/modules/culture_descriptor/culture/cultures_human.dm b/code/modules/culture_descriptor/culture/cultures_human.dm
index b0a069d445ca7..5ab94cda55787 100644
--- a/code/modules/culture_descriptor/culture/cultures_human.dm
+++ b/code/modules/culture_descriptor/culture/cultures_human.dm
@@ -201,6 +201,24 @@
dominates the green planet, and the myriad of exotic life found in its freshwater system."
economic_power = 0.7
+/singleton/cultural_info/culture/human/theia
+ name = CULTURE_HUMAN_THEIA
+ description = "Theia is an inhabited system on the borders of the Sol Central Government known primarily for being the headquarters of the Third Fleet. \
+ Located strategically at the gateway closest to several key frontier systems, Theia became known early on as a strategic chokepoint worth defending. \
+ Today, military and civilian personnel alike call the Theia system home and work tirelessly to maintain it as the Fortress of Sol. "
+ economic_power = 1.1
+
+/singleton/cultural_info/culture/human/offworld
+ name = CULTURE_HUMAN_OFFWORLD
+ description = "You are from one of many far flung and outlying settlements that aren't notable enough to be on standard Solar maps. Raised out of touch and out of connection with the galaxyat large, \
+ those who live so far from anything only look to their close family and friends rather than any larger group. Whether it's a fueling station, an agriculutral dome, or a planet that is far removed from \
+ the luxuries of the gateway network, such people are raised in small, confined environments with few others, and tend to be most familiar with older, reliable but outdated \
+ technology. An independent sort, Offworlders are more likely to be isolationist and self-driven."
+ economic_power = 0.9
+ language = LANGUAGE_SPACER
+
+// NON SCG BELOW
+
/singleton/cultural_info/culture/human/magnitka
name = CULTURE_HUMAN_MAGNITKA
description = "Magnitka often gives birth to rough-hewn, sturdy citizens with its austere political and environmental climate, and many are often well-sought for the \
@@ -218,37 +236,93 @@
economic_power = 1
language = LANGUAGE_SPACER
-/singleton/cultural_info/culture/human/offworld
- name = CULTURE_HUMAN_OFFWORLD
- description = "You are from one of many far flung and outlying settlements that aren't notable enough to be on standard Solar maps. Raised out of touch and out of connection with the galaxyat large, \
- those who live so far from anything only look to their close family and friends rather than any larger group. Whether it's a fueling station, an agriculutral dome, or a planet that is far removed from \
- the luxuries of the gateway network, such people are raised in small, confined environments with few others, and tend to be most familiar with older, reliable but outdated \
- technology. An independent sort, Offworlders are more likely to be isolationist and self-driven."
- economic_power = 0.9
- language = LANGUAGE_SPACER
-
-/singleton/cultural_info/culture/human/confederate
- name = CULTURE_HUMAN_CONFEDC
- description = "You are from the core of the Gilgamesh Colonial Confederation. Largely influenced by the planet Terra(not Earth), the Confederation's capital, your people embody what it means to be a part of the GCC. \
+/singleton/cultural_info/culture/human/confederate_terra
+ name = CULTURE_HUMAN_CONFED_TERRA
+ description = "You are from the core of the Gilgamesh Colonial Confederation. Being from the Confederation's capital, your people embody what it means to be a part of the GCC. \
Unfortunately, the years since the war have not been easy on Terra and the long period of economic recovery has not made life easy. The people of Terra are typically employed \
in the military, industrial, government or service sectors, with an emphasis being placed on mandatory military service. Terrans today are generally poor, bitter and a somewhat broken people angry and \
resentful about their loss in the Gaia Conflict. An upbringing from Terra emphasises an odd mix of service to the state, liberalism and militarism."
language = LANGUAGE_HUMAN_RUSSIAN
- economic_power = 0.9
+ economic_power = 1.1
+
+/singleton/cultural_info/culture/human/confederate_zemlya
+ name = CULTURE_HUMAN_CONFED_ZEMLYA
+ description = "You are from the core of the Gilgamesh Colonial Confederation. Being from Gilgamesh's Industrial Capital, your people embody what it means to be a part of the working class GCC. \
+ Unfortunately, the years since the war have not been easy on Zemlya and the long period of economic recovery has not made life easy. The people of Zemlya are typically employed \
+ in the vast industrial sector, less patriotic then those from Terra itself, Zemlyans are still an extremely proud people who have pride in their industrial and working class origins."
+ language = LANGUAGE_HUMAN_RUSSIAN
+ economic_power = 1.0
+
+/singleton/cultural_info/culture/human/confederate_sestris
+ name = CULTURE_HUMAN_CONFED_SESTRIS
+ description = " You are from the Union of Sestris and Bratis - second only to Gilgamesh in terms of political and economic power within the GCC, \
+ citizens of Sestris enjoy a generally high standard of living and many can be found within the ranks of the ICCG Defense Forces. Those from Amelie, \
+ within Sestris itself are immensely proud of their Franco heratige, with many holding on to some of their cultural roots. "
+ language = LANGUAGE_HUMAN_RUSSIAN
+ secondary_langs = list(LANGUAGE_HUMAN_EURO)
+ economic_power = 1.3
+
+/singleton/cultural_info/culture/human/confederate_putkari
+ name = CULTURE_HUMAN_CONFED_PUTKARI
+ description = "You are from Putkari in the Baroda system. Settled in the wake of the Terran Commonwealth's exploration Boom, Putkari was abandoned by \
+ the SCG following it's founding and left to die. Embracing the newly founded GCC, Putkari has been a loyal and devoted member of the Confederation \
+ ever since. Extremely hostile to the SCG ever since it's abandonment, Putkarians are some of the most vocal within the Confederation in terms of \
+ resentment of the loss in the Gaia Conflict, many beat the war drums and fan the fires of jingoism in hopes of one day enacting a form of vengance. "
+ language = LANGUAGE_HUMAN_INDIAN
+ economic_power = 0.7
+
+/singleton/cultural_info/culture/human/confederate_altair
+ name = CULTURE_HUMAN_CONFED_ALTAIR
+ description = "You are from Altair. Once a free economic zone, the breaking of the moon of Qabil brought sweeping and more authoritarian change to Altair. \
+ One of the more materially wealthy members of the Confederation outside of the Founders, Altarians are not overly interested in the Confederation as a whole, \
+ with most choosing to be public workers such as paramedics or infastructure maintainers for the duration of their mandatory state service."
+ language = LANGUAGE_HUMAN_ARABIC
+ economic_power = 1.0
+
+/singleton/cultural_info/culture/human/confederate_penglai
+ name = CULTURE_HUMAN_CONFED_PENGLAI
+ description = "You are from Penglai, a traditionalist world within the Gilgamesh Colonial Confederation. A small world with a marginal atmosphere, \
+ breathable by its inhabitants, its main economic contribution to the confederation is in rare earth elements, of which it has a great deal. Another \
+ colony that was in need of support following the founding of the SCG, Pengali is a content member of the Confederation while keeping their own traditions alive. "
+ language = LANGUAGE_HUMAN_CHINESE
+ economic_power = 0.8
+
+/singleton/cultural_info/culture/human/confederate_providence
+ name = CULTURE_HUMAN_CONFED_PROVIDENCE
+ description = "You are from Providence, settled originally by private ventures, Providence's planet of Atlanticus developed a booming space station industry, \
+ resulting in the construction of three mega-space-complexes within the system. Bolstered by a flood of working class immigrants and research funding following \
+ their entry to the Confederation, those from Providence are typically quite pleased with their position within the Confederation, though many still choose to \
+ emigrate elsewhere in hopes of finding work outside of the industrial or scientific sectors. "
+ language = LANGUAGE_HUMAN_RUSSIAN
+ economic_power = 1.0
+
+/singleton/cultural_info/culture/human/confederate_valy
+ name = CULTURE_HUMAN_CONFED_VALY
+ description = "You are from Valy, the 'black sheep' of the Confederation. Brought into the Confederation when Valy's civil war was ended by the GCN's intervention \
+ Valy has possessed a resistance to the Confederation ever since. The emergance of the Frontier Alliance has emboldened these resistance actions, with \
+ public desires to join the Alliance only being held back by the Confederation's continued presence. Those from Valy are typically quite bitter about their present \
+ situation, with many who choose to emigrate continuing to support efforts to bring about the Alliance's agenda in 'freeing Valy from it's shackles'. "
+ language = LANGUAGE_HUMAN_RUSSIAN
+ economic_power = 0.6
/singleton/cultural_info/culture/human/confederate_colony
name = CULTURE_HUMAN_CONFEDO
- description = "You are from the outskirts of the Gilgamesh Colonial Confederation. Terran Colonists have a mixed view of their nation state, raging from strong nationalism to resentment for the state, but \
- they all have the legacy of resource extraction and mandatory conscription in common. Being from a nation of conscripts means that Terran Colonists are often resourceful and experienced, \
- having grown to cope with the horrors of dysfunctional economics and mandatory military service. Terrans today are generally poor, bitter and a somewhat broken people angry and \
+ description = "You are from the outskirts of the Gilgamesh Colonial Confederation. Confederates have a mixed view of their nation state, raging from strong nationalism to resentment for the state, but \
+ they all have the legacy of resource extraction and mandatory conscription in common. Being from a nation of conscripts means that Confederates are often resourceful and experienced, \
+ having grown to cope with the horrors of dysfunctional economics and mandatory military service. Confederates today are generally poor, bitter and a somewhat broken people angry and \
resentful about their loss in the Gaia Conflict. Colonial Confederation education emphasizes service to the state, liberalism and militarism."
language = LANGUAGE_HUMAN_RUSSIAN
economic_power = 0.7
/singleton/cultural_info/culture/human/gaia
name = CULTURE_HUMAN_GAIAN
- description = "Gaia is the sole planet in the Galilei system, serving as the DMZ between the Sol Central Government and the Independent Colonial Confederation of Gilgamesh. It is an agricultural world, though various conflicts across the planet's surface have left it scarred. The planet is divided into Sol-Controlled Gaian Administrative Area and Independent-Guided Protectorate of Gaia, with the International City of New Venice remaining a neutral zone inside the DMZ that circles the planet's equator. The planet's population remain divided even more then 10 years after the Gaia Conflict. While Gaia is divided, the current Mayor of New Venice serves as a vital mediator between the galactic superpowers. The Gaian People are tired of war, and long to see their families once again; They suffered hard twenty years prior, and will not let themselves suffer again."
- economic_power = 0.9
+ description = "Gaia is the sole planet in the Galilei system, serving as the DMZ between the Sol Central Government and the Independent Colonial Confederation of Gilgamesh. \
+ It is an agricultural world, though various conflicts across the planet's surface have left it scarred. The planet is divided into Sol-Controlled Gaian Administrative Area \
+ and Independent-Guided Protectorate of Gaia, with the International City of New Venice remaining a neutral zone inside the DMZ that circles the planet's equator. \
+ The planet's population remain divided even more then 10 years after the Gaia Conflict. While Gaia is divided, the current Mayor of New Venice serves as a vital mediator \
+ between the galactic superpowers. The Gaian People are tired of war, and long to see their families once again; They suffered hard twenty years prior, and will not let themselves suffer again."
+ language = LANGUAGE_HUMAN_IBERIAN
+ economic_power = 1.0
/singleton/cultural_info/culture/human/other
name = CULTURE_HUMAN_OTHER
diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm
index 3091e4abd4e3f..4dd82ca47dbd2 100644
--- a/code/modules/economy/Accounts.dm
+++ b/code/modules/economy/Accounts.dm
@@ -4,6 +4,7 @@
var/account_number = 0
var/remote_access_pin = 0
var/money = 0
+ var/opening_balance = 0
var/list/transaction_log = list()
var/suspended = 0
var/security_level = 0 //0 - auto-identify from worn ID, require only account number
@@ -22,6 +23,9 @@
/datum/money_account/proc/get_balance()
return money
+/datum/money_account/proc/get_profit()
+ return money - opening_balance
+
/datum/money_account/proc/log_msg(msg, machine_id)
var/datum/transaction/log/T = new(src, msg, machine_id)
return T.perform()
@@ -54,7 +58,7 @@
var/datum/transaction/singular/T = new(M, (source_db ? source_db.machine_id : "NTGalaxyNet Terminal #[rand(111,1111)]"), starting_funds, "Account creation")
if(!source_db)
//set a random date, time and location some time over the past few decades
- T.date = "[num2text(rand(1, 31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], [GLOB.using_map.game_year-rand(8, 18)]"
+ T.date = "[num2text(rand(1, 31))] [pick(GLOB.month_names)], [GLOB.using_map.game_year-rand(8, 18)]"
T.time = "[rand(0,24)]:[rand(11,59)]"
M.account_number = random_id("station_account_number", 111111, 999999)
@@ -88,6 +92,7 @@
//add the account
T.perform()
+ M.opening_balance = M.money
all_money_accounts.Add(M)
return M
diff --git a/code/modules/events/money_hacker.dm b/code/modules/events/money_hacker.dm
index 65bd97c7db25e..a5400286358b8 100644
--- a/code/modules/events/money_hacker.dm
+++ b/code/modules/events/money_hacker.dm
@@ -45,7 +45,7 @@ var/global/account_hack_attempted = 0
var/purpose = pick("Ne$ ---ount fu%ds init*&lisat@*n","PAY BACK YOUR MUM","Funds withdrawal","pWnAgE","l33t hax","liberationez")
var/datum/transaction/singular/T = new(affected_account, name, -amount, purpose)
var/date1 = "31 December, 1999"
- var/date2 = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], [rand(1000,3000)]"
+ var/date2 = "[num2text(rand(1,31))] [pick(GLOB.month_names)], [rand(1000,3000)]"
T.date = pick("", stationdate2text(), date1, date2)
var/time1 = rand(0, 99999999)
var/time2 = "[round(time1 / 36000)+12]:[pad_left(time1 / 600 % 60, 2, "0")]"
diff --git a/code/modules/events/shipping_error.dm b/code/modules/events/shipping_error.dm
index 3579f773c6546..242a8c08dbf35 100644
--- a/code/modules/events/shipping_error.dm
+++ b/code/modules/events/shipping_error.dm
@@ -1,6 +1,9 @@
/datum/event/shipping_error/start()
var/datum/supply_order/O = new /datum/supply_order()
- O.ordernum = SSsupply.ordernum
+ O.ordernum = rand(1, 9000)
+ var/randomtimeofday = rand(0, 864000) // 24 hours in deciseconds
+ O.timestamp = time2text(randomtimeofday, "hh:mm")
O.object = pick(SSsupply.master_supply_list)
O.orderedby = random_name(pick(MALE,FEMALE), species = SPECIES_HUMAN)
SSsupply.shoppinglist += O
+ SSsupply.points = max(0, SSsupply.points - O.object.cost)
diff --git a/code/modules/fabrication/designs/micro/designs_cutlery.dm b/code/modules/fabrication/designs/micro/designs_cutlery.dm
index 3229b3812d718..593e09febae7d 100644
--- a/code/modules/fabrication/designs/micro/designs_cutlery.dm
+++ b/code/modules/fabrication/designs/micro/designs_cutlery.dm
@@ -1,43 +1,43 @@
/datum/fabricator_recipe/cutlery
name = "fork, aluminium"
- path = /obj/item/material/kitchen/utensil/fork
+ path = /obj/item/material/utensil/fork
category = "Cutlery"
fabricator_types = list(FABRICATOR_CLASS_MICRO)
/datum/fabricator_recipe/cutlery/spoon_aluminium
name = "spoon, aluminium"
- path = /obj/item/material/kitchen/utensil/spoon
+ path = /obj/item/material/utensil/spoon
/datum/fabricator_recipe/cutlery/spork_aluminium
name = "spork, aluminium"
- path = /obj/item/material/kitchen/utensil/spork
+ path = /obj/item/material/utensil/spork
/datum/fabricator_recipe/cutlery/knife_aluminium
name = "table knife, aluminium"
- path = /obj/item/material/knife/table
+ path = /obj/item/material/utensil/knife
/datum/fabricator_recipe/cutlery/foon_aluminium
name = "foon, aluminium"
- path = /obj/item/material/kitchen/utensil/foon
+ path = /obj/item/material/utensil/foon
hidden = TRUE
/datum/fabricator_recipe/cutlery/fork_plastic
name = "fork, plastic"
- path = /obj/item/material/kitchen/utensil/fork/plastic
+ path = /obj/item/material/utensil/fork/plastic
/datum/fabricator_recipe/cutlery/spoon_plastic
name = "spoon, plastic"
- path = /obj/item/material/kitchen/utensil/spoon/plastic
+ path = /obj/item/material/utensil/spoon/plastic
/datum/fabricator_recipe/cutlery/spork_plastic
name = "spork, plastic"
- path = /obj/item/material/kitchen/utensil/spork/plastic
+ path = /obj/item/material/utensil/spork/plastic
/datum/fabricator_recipe/cutlery/knife_plastic
name = "table knife, plastic"
- path = /obj/item/material/knife/table/plastic
+ path = /obj/item/material/utensil/knife/plastic
/datum/fabricator_recipe/cutlery/foon_plastic
name = "foon, plastic"
- path = /obj/item/material/kitchen/utensil/foon/plastic
- hidden = TRUE
\ No newline at end of file
+ path = /obj/item/material/utensil/foon/plastic
+ hidden = TRUE
diff --git a/code/modules/fabrication/designs/micro/designs_glasses.dm b/code/modules/fabrication/designs/micro/designs_glasses.dm
index 20a4f9fb06edb..3f21efb21b815 100644
--- a/code/modules/fabrication/designs/micro/designs_glasses.dm
+++ b/code/modules/fabrication/designs/micro/designs_glasses.dm
@@ -30,7 +30,7 @@
/datum/fabricator_recipe/drinkingglass/flute
path = /obj/item/reagent_containers/food/drinks/glass2/flute
-/datum/fabricator_recipe/drinkingglass/coffecup
+/datum/fabricator_recipe/drinkingglass/coffeecup
path = /obj/item/reagent_containers/food/drinks/glass2/coffeecup
/datum/fabricator_recipe/drinkingglass/cognac
@@ -40,4 +40,4 @@
path = /obj/item/reagent_containers/food/drinks/glass2/goblet
/datum/fabricator_recipe/drinkingglass/coffeecup/glass
- path = /obj/item/reagent_containers/food/drinks/glass2/coffeecup/glass
\ No newline at end of file
+ path = /obj/item/reagent_containers/food/drinks/glass2/coffeecup/glass
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
index 8f728ec365813..e7365929c3ac6 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -329,14 +329,14 @@ h1.alert, h2.alert {color: #a4bad6;}
.disarm {color: #990000;}
.passive {color: #660000;}
-.danger {color: #c51e1e;}
-.warning {color: #c51e1e; font-style: italic;}
-.subtle {color: #4343ca; font-size: 75%; font-style: italic;}
+.danger {color: #f73e50; font-weight: bold;}
+.warning {color: #f58e09; font-weight: bold; font-style: italic;}
+.subtle {color: #808991; font-style: italic;}
.boldannounce {color: #c51e1e; font-weight: bold;}
.rose {color: #ff5050;}
-.info {color: #6685f5;}
+.info {color: #b13ef3; font-style: italic;}
.debug {color: #ff66ff;}
-.notice {color: #6685f5;}
+.notice {color: #327fd1;}
.alium {color: #00ff00;}
.cult {color: #aa1c1c;}
.legion {color: #e09000; font-weight: bold; font-family: 'Courier New', Courier, monospace}
diff --git a/code/modules/goonchat/browserassets/css/browserOutput_white.css b/code/modules/goonchat/browserassets/css/browserOutput_white.css
index 1d9a4424d9814..2db550c3cbfaf 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput_white.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput_white.css
@@ -326,14 +326,14 @@ h1.alert, h2.alert {color: #000080;}
.disarm {color: #990000;}
.passive {color: #660000;}
-.danger {color: #ff0000;}
-.warning {color: #ff0000; font-style: italic;}
-.subtle {color: #000099; font-size: 75%; font-style: italic;}
+.danger {color: #dc3545; font-weight: bold;}
+.warning {color: #cc7606; font-weight: bold; font-style: italic;}
+.subtle {color: #919ca7; font-style: italic;}
.boldannounce {color: #ff0000; font-weight: bold;}
.rose {color: #ff5050;}
-.info {color: #0000CC;}
+.info {color: #9b53c4; font-style: italic;}
.debug {color: #ff00ff;}
-.notice {color: #000099;}
+.notice {color: #0d5ef3;}
.alium {color: #00ff00;}
.cult {color: #800080; font-weight: bold; font-style: italic;}
.legion {color: #e09000; font-weight: bold; font-family: 'Courier New', Courier, monospace}
diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm
index 3deaf875b6edc..b5ea465884ac8 100644
--- a/code/modules/hydroponics/seed_datums.dm
+++ b/code/modules/hydroponics/seed_datums.dm
@@ -188,7 +188,7 @@
name = "bloodtomato"
seed_name = "blood tomato"
display_name = "blood tomato plant"
- mutants = list("killer")
+ mutants = list("killertomato")
chems = list(/datum/reagent/nutriment = list(1,10), /datum/reagent/blood = list(1,5))
splat_type = /obj/decal/cleanable/blood/splatter
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 1c633cf218458..2631feb973993 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -100,7 +100,7 @@
var/o_access = O.GetAccess()
. |= o_access
-/obj/item/device/electronic_assembly/Bump(atom/AM)
+/obj/item/device/electronic_assembly/Bump(atom/AM, called)
collw = weakref(AM)
.=..()
if(istype(AM, /obj/machinery/door/airlock) || istype(AM, /obj/machinery/door/window))
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 9965aec7116fb..5813cfdf9e3d3 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -175,6 +175,7 @@
. += create_recipe_list(/datum/stack_recipe/box)
. += new/datum/stack_recipe/cardborg_suit(src)
. += new/datum/stack_recipe/cardborg_helmet(src)
+ . += new/datum/stack_recipe/envelope(src)
. += new/datum/stack_recipe_list("folders", create_recipe_list(/datum/stack_recipe/folder))
/material/aluminium/generate_recipes(reinforce_material)
diff --git a/code/modules/materials/recipes_furniture.dm b/code/modules/materials/recipes_furniture.dm
index 1ea81db12049e..e0b2007c54ffd 100644
--- a/code/modules/materials/recipes_furniture.dm
+++ b/code/modules/materials/recipes_furniture.dm
@@ -15,8 +15,6 @@
/datum/stack_recipe/furniture/chair/display_name()
return modifiers ? jointext(modifiers + ..(), " ") : ..()
-/datum/stack_recipe/furniture/chair/padded
- req_amount = 2
#define PADDED_CHAIR(color) /datum/stack_recipe/furniture/chair/padded/##color{\
result_type = /obj/structure/bed/chair/padded/##color;\
diff --git a/code/modules/materials/recipes_items.dm b/code/modules/materials/recipes_items.dm
index 7a944b929bc40..b1a7554018abc 100644
--- a/code/modules/materials/recipes_items.dm
+++ b/code/modules/materials/recipes_items.dm
@@ -47,20 +47,20 @@
/datum/stack_recipe/fork
title = "fork"
- result_type = /obj/item/material/kitchen/utensil/fork/plastic
+ result_type = /obj/item/material/utensil/fork/plastic
on_floor = 1
send_material_data = 1
/datum/stack_recipe/knife
title = "table knife"
- result_type = /obj/item/material/knife/table
+ result_type = /obj/item/material/utensil/knife
on_floor = 1
difficulty = 2
send_material_data = 1
/datum/stack_recipe/spoon
title = "spoon"
- result_type = /obj/item/material/kitchen/utensil/spoon/plastic
+ result_type = /obj/item/material/utensil/spoon/plastic
on_floor = 1
send_material_data = 1
@@ -349,4 +349,4 @@
result_type = /obj/item/cane/staff
req_amount = 5
difficulty = 0
- time = 25
\ No newline at end of file
+ time = 25
diff --git a/code/modules/materials/recipes_storage.dm b/code/modules/materials/recipes_storage.dm
index 236691f66f448..b250051c5f188 100644
--- a/code/modules/materials/recipes_storage.dm
+++ b/code/modules/materials/recipes_storage.dm
@@ -38,6 +38,10 @@
req_amount = 3
on_floor = 1
+/datum/stack_recipe/envelope
+ title = "envelope"
+ result_type = /obj/item/folder/envelope
+
/datum/stack_recipe/folder
title = "folder"
result_type = /obj/item/folder
diff --git a/code/modules/mechs/components/software.dm b/code/modules/mechs/components/software.dm
index d9a1d45a8323b..a50424642859b 100644
--- a/code/modules/mechs/components/software.dm
+++ b/code/modules/mechs/components/software.dm
@@ -8,7 +8,7 @@
/obj/item/circuitboard/exosystem/engineering
name = "exosuit software (engineering systems)"
contains_software = list(MECH_SOFTWARE_ENGINEERING)
- origin_tech = list(TECH_DATA = 1)
+ origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
/obj/item/circuitboard/exosystem/utility
name = "exosuit software (utility systems)"
@@ -20,10 +20,10 @@
name = "exosuit software (medical systems)"
contains_software = list(MECH_SOFTWARE_MEDICAL)
icon_state = "mcontroller"
- origin_tech = list(TECH_DATA = 3,TECH_BIO = 2)
+ origin_tech = list(TECH_DATA = 1,TECH_BIO = 1)
/obj/item/circuitboard/exosystem/weapons
name = "exosuit software (basic weapon systems)"
contains_software = list(MECH_SOFTWARE_WEAPONS)
icon_state = "mainboard"
- origin_tech = list(TECH_DATA = 4, TECH_COMBAT = 3)
+ origin_tech = list(TECH_DATA = 1, TECH_COMBAT = 3)
diff --git a/code/modules/mechs/equipment/combat.dm b/code/modules/mechs/equipment/combat.dm
index 89da797082398..18a97293b1697 100644
--- a/code/modules/mechs/equipment/combat.dm
+++ b/code/modules/mechs/equipment/combat.dm
@@ -92,7 +92,7 @@
toggle()
playsound(owner.loc,'sound/mecha/internaldmgalarm.ogg',35,1)
*/
- owner.add_heat(difference)
+ owner.add_heat(difference * 2)
if(difference >= 0)
toggle()
OVERHEAT = TRUE
diff --git a/code/modules/mechs/equipment/utility.dm b/code/modules/mechs/equipment/utility.dm
index 36d1679c53af8..176ba2bfbd14b 100644
--- a/code/modules/mechs/equipment/utility.dm
+++ b/code/modules/mechs/equipment/utility.dm
@@ -30,7 +30,7 @@
return
if(chosen_obj.density)
for(var/atom/A in get_turf(src))
- if(A != src && A.density && !(A.atom_flags & ATOM_FLAG_CHECKS_BORDER))
+ if(!istype(A, /obj/structure/cargopile) && A.density && !(A.atom_flags & ATOM_FLAG_CHECKS_BORDER))
to_chat(user, SPAN_WARNING("\The [A] blocks you from pulling out \the [chosen_obj]."))
return
if(!do_after(user, 0.5 SECONDS, src, DO_PUBLIC_UNIQUE)) return
diff --git a/code/modules/mob/grab/normal/grab_normal.dm b/code/modules/mob/grab/normal/grab_normal.dm
index 81e6541935cf1..08b87163bcd2e 100644
--- a/code/modules/mob/grab/normal/grab_normal.dm
+++ b/code/modules/mob/grab/normal/grab_normal.dm
@@ -257,11 +257,12 @@
return 0 //unsuitable weapon
user.visible_message(SPAN_DANGER("\The [user] begins to slit \the [affecting]'s throat with \the [W]!"))
- user.next_move = world.time + 20 //also should prevent user from triggering this repeatedly
- if(!do_after(user, 2 SECONDS * user.skill_delay_mult(SKILL_COMBAT), affecting, DO_DEFAULT | DO_USER_UNIQUE_ACT | DO_PUBLIC_PROGRESS))
+ var/attack_time = 3 SECONDS * user.skill_delay_mult(SKILL_COMBAT, 0.125) // 3.75 ~ 2.25 seconds
+ if(!do_after(user, attack_time, affecting, DO_DEFAULT | DO_USER_UNIQUE_ACT | DO_PUBLIC_PROGRESS))
return 0
- if(!(G && G.affecting == affecting)) //check that we still have a grab
+ if(!(G && G.affecting == affecting))
return 0
+ user.next_move = world.time + 1 SECOND
var/damage_mod = 1
var/damage_flags = W.damage_flags()
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index e6f7ca8761882..3d584b242a7d2 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -1,5 +1,5 @@
/mob/proc/hear_say(message, verb = "says", datum/language/language, alt_name, italics, mob/speaker, sound/speech_sound, sound_vol)
- if (!client)
+ if (!client && !teleop)
return
var/is_ghost = isghost(src)
@@ -110,6 +110,10 @@
display_verb = "[verb] ([language.shorthand])"
display_message = language.format_message(display_message, display_verb)
+ if (teleop)
+ teleop.on_hear_say({"[SPAN_CLASS("game say", "[display_controls][SPAN_NOTICE(SPAN_BOLD("NEAR YOU: "))][SPAN_CLASS("name", display_name)][alt_name] [display_message]")]"})
+ return
+
on_hear_say({"[SPAN_CLASS("game say", "[display_controls][SPAN_CLASS("name", display_name)][alt_name] [display_message]")]"})
if (istype(language, /datum/language/noise))
diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm
index db1b5005b48c9..ba8896392b2fc 100644
--- a/code/modules/mob/living/bot/bot.dm
+++ b/code/modules/mob/living/bot/bot.dm
@@ -227,7 +227,7 @@
..(message, null, verb)
-/mob/living/bot/Bump(atom/A)
+/mob/living/bot/Bump(atom/A, called)
if(on && botcard && istype(A, /obj/machinery/door))
var/obj/machinery/door/D = A
if(!istype(D, /obj/machinery/door/firedoor) && !istype(D, /obj/machinery/door/blast) && D.check_access(botcard))
diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm
index 8797246c3a319..b4c120879a6e5 100644
--- a/code/modules/mob/living/bot/medibot.dm
+++ b/code/modules/mob/living/bot/medibot.dm
@@ -20,6 +20,7 @@
var/treatment_oxy = /datum/reagent/tricordrazine
var/treatment_fire = /datum/reagent/tricordrazine
var/treatment_tox = /datum/reagent/tricordrazine
+ var/treatment_virus = /datum/reagent/spaceacillin
var/treatment_emag = /datum/reagent/toxin
var/declare_treatment = 0 //When attempting to treat a patient, should it notify everyone wearing medhuds?
diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm
index 6f6f7ed6c0bba..0ab3a2f057f01 100644
--- a/code/modules/mob/living/bot/mulebot.dm
+++ b/code/modules/mob/living/bot/mulebot.dm
@@ -203,7 +203,7 @@
if(T == src.loc)
unload(dir)
-/mob/living/bot/mulebot/Bump(mob/living/carbon/human/M)
+/mob/living/bot/mulebot/Bump(mob/living/carbon/human/M, called)
if(!safety && istype(M))
visible_message(SPAN_WARNING("[src] knocks over [M]!"))
M.Stun(8)
diff --git a/code/modules/mob/living/carbon/alien/diona/gestalt/gestalt_movement.dm b/code/modules/mob/living/carbon/alien/diona/gestalt/gestalt_movement.dm
index 3299fc29e01b1..13882e7b14115 100644
--- a/code/modules/mob/living/carbon/alien/diona/gestalt/gestalt_movement.dm
+++ b/code/modules/mob/living/carbon/alien/diona/gestalt/gestalt_movement.dm
@@ -2,7 +2,7 @@
if(nymphs[user]) step(src, direction) // ANARCHY! DEMOCRACY! ANARCHY! DEMOCRACY!
// Naaaa na na na na naa naa https://www.youtube.com/watch?v=iMH49ieL4es
-/obj/structure/diona_gestalt/Bump(atom/movable/AM, yes) // what a useful argname, thanks oldcoders
+/obj/structure/diona_gestalt/Bump(atom/movable/AM, called)
. = ..()
if(AM && can_roll_up_atom(AM) && AM.Adjacent(src))
var/turf/stepping = AM.loc
diff --git a/code/modules/mob/living/carbon/allergy.dm b/code/modules/mob/living/carbon/allergy.dm
new file mode 100644
index 0000000000000..77262b3074388
--- /dev/null
+++ b/code/modules/mob/living/carbon/allergy.dm
@@ -0,0 +1,112 @@
+
+/* This file contains all the procs processing allergy onset, healing, and symptoms.
+For the file where the allergy trait is defined; check datum/traits/maluses/allergy.dm
+Mild allergies increase heart rate and give itch messages. Inaprovaline resolves these symptoms; but the allergy will keep running as long as a reagent is in the system.
+Severe allergies cause breathing problems and an even faster heart rate. Inaprovaline markedly stabilizes these symptoms; but only adrenaline can stop a severe allergy
+As long as you have inaprovaline in your system, an allergy cannot trigger. Key is to keep inaprov longer than the allergen exists above threshold after treatment */
+
+/*
+Checks if allergy will be triggered at a reagent level. Called by handle_allergy().
+If all offending reagent levels fall below threshold and no severe allergy is running; will stop allergies.
+Also checks if medications that stop allergies from triggering are in system. This is done after the list of active_allergies is updated.
+*/
+/mob/living/carbon/proc/check_allergy(datum/reagent/reagent, current_level = 0)
+ if (!ispath(reagent))
+ return
+ var/allergy_severity = GetTraitLevel(/singleton/trait/malus/allergy, reagent)
+ if (!allergy_severity)
+ return
+ var/threshold = 1/allergy_severity //For Medium sized mobs; threshold of 1 for minor allergies and 0.33 for major allergies.
+ if (current_level < threshold)
+ LAZYREMOVE(active_allergies, reagent)
+ return
+
+ LAZYDISTINCTADD(active_allergies, reagent)
+ start_allergy(allergy_severity)
+
+///This starts an allergy. Dosage/drug are handled at check_allergy proc, if you call this proc directly you must do your own checks.
+/mob/living/carbon/proc/start_allergy(allergy_severity)
+ if (trait_flags & SEVERE_ALLERGY)
+ return
+ if ((trait_flags & MILD_ALLERGY) && allergy_severity <= TRAIT_LEVEL_MINOR)
+ return
+ if (chem_effects[CE_STABLE] || chem_doses[/datum/reagent/adrenaline])
+ return
+
+ switch (allergy_severity)
+ if (TRAIT_LEVEL_MINOR)
+ trait_flags |= MILD_ALLERGY
+ to_chat(src, SPAN_DANGER("You start feeling uncontrollably itchy!"))
+ next_allergy_time = world.time + 2 MINUTES
+
+ if (TRAIT_LEVEL_MAJOR)
+ trait_flags |= SEVERE_ALLERGY
+ to_chat(src, SPAN_DANGER("Your throat starts swelling up and it suddenly becomes very difficult to breathe!"))
+ next_allergy_time = world.time + 1 MINUTES
+
+ else
+ crash_with("Allergy called with incorrect severity of [allergy_severity].")
+
+///Ends allergies and unsets flag. Conditions handled at handle_allergy proc; if you call this directly do your own checks.
+///If no severity supplied will end all allergies.
+/mob/living/carbon/proc/stop_allergy(allergy_flag)
+ if (!(trait_flags & (MILD_ALLERGY|SEVERE_ALLERGY)))
+ return
+
+ if ((trait_flags & MILD_ALLERGY) && (!allergy_flag || (allergy_flag & MILD_ALLERGY)))
+ if (!chem_effects[CE_STABLE]) //People with inaprov aren't itching to start with.
+ to_chat(src, SPAN_NOTICE("You feel the itching subside."))
+ trait_flags &= ~MILD_ALLERGY
+
+ if ((trait_flags & SEVERE_ALLERGY) && (!allergy_flag || (allergy_flag & SEVERE_ALLERGY)))
+ to_chat(src, SPAN_NOTICE("You feel your airways open up and breathing feels easier!"))
+ trait_flags &= ~SEVERE_ALLERGY
+
+/mob/living/var/next_allergy_time = 0
+/mob/living/proc/handle_allergy()
+ return
+
+///Main proc through which all other allergy procs are called; it is called by carbon/Life().
+///If adrenaline is in system, all active allergies will be stopped. Having inaprov (CE_STABLE) will prevent them from retriggering when adrenaline washes out.
+/mob/living/carbon/handle_allergy()
+ if (stat)
+ return
+ if (!HAS_TRAIT(src, /singleton/trait/malus/allergy))
+ return
+ var/list/allergy_list = traits[/singleton/trait/malus/allergy]
+
+ for (var/picked as anything in allergy_list)
+ if (!(picked in chem_doses) && !(picked in active_allergies))
+ continue
+ var/datum/reagent/reagent = picked
+ check_allergy(reagent, chem_doses[reagent])
+
+ if ((trait_flags & MILD_ALLERGY) && (!length(active_allergies)))
+ stop_allergy(MILD_ALLERGY)
+
+ if ((trait_flags & SEVERE_ALLERGY) && chem_doses[/datum/reagent/adrenaline] >= 1)
+ stop_allergy(SEVERE_ALLERGY)
+
+ run_allergy_symptoms()
+
+
+///Proc called by handle_allergy, handles chemical effects and symptoms.
+/mob/living/carbon/proc/run_allergy_symptoms()
+ if (!(trait_flags & (MILD_ALLERGY|SEVERE_ALLERGY)))
+ return
+
+ add_chemical_effect(CE_PULSE, 2)
+ if (trait_flags & SEVERE_ALLERGY)
+ add_chemical_effect(CE_BREATHLOSS, 2)
+ add_chemical_effect(CE_PULSE, 2)
+ if (prob(50))
+ add_chemical_effect(CE_VOICELOSS, 1)
+
+ if (!can_feel_pain() || world.time < next_allergy_time || chem_effects[CE_STABLE])
+ return
+
+ to_chat(src, SPAN_WARNING("You feel uncontrollably itchy!"))
+ var/delay = 2 MINUTES
+ if (trait_flags & SEVERE_ALLERGY)
+ delay /= 2
+ next_allergy_time = world.time + delay
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 451db3156ef38..9853c78963a29 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -30,6 +30,7 @@
R.clear_reagents()
set_nutrition(400)
set_hydration(400)
+ stop_allergy()
..()
/mob/living/carbon/Move(NewLoc, direct)
@@ -170,6 +171,7 @@
/mob/living/carbon/swap_hand()
+ . = ..()
hand = !hand
if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object)
if(hand) //This being 1 means the left hand is in use
@@ -382,10 +384,14 @@
if(alert("Are you sure you want to [player_triggered_sleeping ? "wake up?" : "sleep for a while? Use 'sleep' again to wake up"]", "Sleep", "No", "Yes") == "Yes")
player_triggered_sleeping = !player_triggered_sleeping
-/mob/living/carbon/Bump(atom/movable/AM, yes)
- if(now_pushing || !yes)
+/mob/living/carbon/Bump(atom/movable/AM, called)
+ if(now_pushing || !called)
return
..()
+ //[SIERRA-ADD] VIRUSOLOGY
+ if(istype(AM, /mob/living/carbon) && prob(10))
+ src.spread_disease_to(AM, "Contact")
+ //[/SIERRA-ADD] VIRUSOLOGY
/mob/living/carbon/slip(slipped_on, stun_duration = 8)
if(!has_gravity())
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index c0510b3a889e5..4c99a696b088c 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -40,3 +40,5 @@
var/stasis_value
var/player_triggered_sleeping = 0
+ ///Reagents towards which there is an active allergy.
+ var/list/active_allergies = list()
\ 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 dfb72a5639484..35317c9bab2ef 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -174,14 +174,14 @@
if (src.stat)
msg += "[SPAN_WARNING("[P.He] [P.is]n't responding to anything around [P.him] and seems to be unconscious.")]\n"
if((stat == DEAD || is_asystole() || losebreath || status_flags & FAKEDEATH) && distance <= 3)
- msg += "[SPAN_WARNING("[P.He] [P.does] not appear to be breathing.")]\n"
+ msg += "[SPAN_DANGER("[P.He] [P.does] not appear to be breathing.")]\n"
if (fire_stacks > 0)
msg += "[P.He] looks flammable.\n"
else if (fire_stacks < 0)
msg += "[P.He] looks wet.\n"
if(on_fire)
- msg += "[SPAN_WARNING("[P.He] [P.is] on fire!.")]\n"
+ msg += "[SPAN_DANGER("[P.He] [P.is] on fire!.")]\n"
var/ssd_msg = species.get_ssd(src)
if(ssd_msg && (!should_have_organ(BP_BRAIN) || has_brain()) && stat != DEAD)
@@ -223,7 +223,7 @@
var/obj/item/organ/external/E = organs_by_name[organ_tag]
if(!E)
- wound_flavor_text[organ_descriptor] = "[P.He] [P.is] missing [P.his] [organ_descriptor].\n"
+ wound_flavor_text[organ_descriptor] = SPAN_WARNING("[P.He] [P.is] missing [P.his] [organ_descriptor].\n")
continue
wound_flavor_text[E.name] = ""
@@ -245,20 +245,20 @@
hidden_bleeders[hidden] += E.name
else
if(E.is_stump())
- wound_flavor_text[E.name] += "[P.He] [P.has] a stump where [P.his] [organ_descriptor] should be.\n"
+ wound_flavor_text[E.name] += SPAN_DANGER("[P.He] [P.has] a stump where [P.his] [organ_descriptor] should be.\n")
if(LAZYLEN(E.wounds) && E.parent)
- wound_flavor_text[E.name] += "[P.He] [P.has] [E.get_wounds_desc()] on [P.his] [E.parent.name]. "
+ wound_flavor_text[E.name] += SPAN_DANGER("[P.He] [P.has] [E.get_wounds_desc()] on [P.his] [E.parent.name]. ")
else
if(!is_synth && BP_IS_ROBOTIC(E) && (E.parent && !BP_IS_ROBOTIC(E.parent) && !BP_IS_ASSISTED(E.parent)))
- wound_flavor_text[E.name] = "[P.He] [P.has] a [E.name].\n"
+ wound_flavor_text[E.name] = SPAN_INFO("[P.He] [P.has] a [E.name].\n")
var/wounddesc = E.get_wounds_desc()
if(wounddesc != "nothing")
- wound_flavor_text[E.name] += "[P.He] [P.has] [wounddesc] on [P.his] [E.name]. "
+ wound_flavor_text[E.name] += SPAN_DANGER("[P.He] [P.has] [wounddesc] on [P.his] [E.name]. ")
if(!hidden || distance <=1)
if(E.dislocated > 0)
- wound_flavor_text[E.name] += "[P.His] [E.joint] is dislocated! "
+ wound_flavor_text[E.name] += SPAN_WARNING("[P.His] [E.joint] is dislocated! ")
if(((E.status & ORGAN_BROKEN) && E.brute_dam > E.min_broken_damage) || (E.status & ORGAN_MUTATED))
- wound_flavor_text[E.name] += "[P.His] [E.name] is dented and swollen! "
+ wound_flavor_text[E.name] += SPAN_DANGER("[P.His] [E.name] is dented and swollen! ")
for(var/datum/wound/wound in E.wounds)
var/list/embedlist = wound.embedded_objects
@@ -271,14 +271,12 @@
else if(!parsedembed.Find("multiple [embedded.name]"))
parsedembed.Remove(embedded.name)
parsedembed.Add("multiple "+embedded.name)
- wound_flavor_text["[E.name]"] += "The [wound.desc] on [P.his] [E.name] has \a [english_list(parsedembed, and_text = " and a ", comma_text = ", a ")] sticking out of it! "
+ wound_flavor_text["[E.name]"] += SPAN_DANGER("The [wound.desc] on [P.his] [E.name] has \a [english_list(parsedembed, and_text = " and a ", comma_text = ", a ")] sticking out of it! ")
for(var/hidden in hidden_bleeders)
- wound_flavor_text[hidden] = "[P.He] [P.has] blood soaking through [hidden] around [P.his] [english_list(hidden_bleeders[hidden])]! "
+ wound_flavor_text[hidden] = SPAN_DANGER("[P.He] [P.has] blood soaking through [hidden] around [P.his] [english_list(hidden_bleeders[hidden])]! ")
- var/wound_msg = ""
for(var/limb in wound_flavor_text)
- wound_msg += wound_flavor_text[limb]
- msg += SPAN_WARNING(wound_msg)
+ msg += wound_flavor_text[limb]
for(var/obj/implant in get_visible_implants(0))
if(implant in shown_objects)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 9ff7c549fabc5..8d44287a24820 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -943,6 +943,11 @@
if(H.brainmob.mind)
H.brainmob.mind.transfer_to(src)
qdel(H)
+ //[SIERRA-ADD] VIRUSOLOGY
+ for (var/ID in virus2)
+ var/datum/disease2/disease/V = virus2[ID]
+ V.cure(src)
+ //[/SIERRA-ADD]
losebreath = 0
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 03317ede2e982..c9d7ee2f069fd 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -61,6 +61,11 @@
apply_effect(4, EFFECT_WEAKEN, armor_block)
return
+//[SIERRA-ADD] VIRUSOLOGY
+ if(istype(M,/mob/living/carbon))
+ M.spread_disease_to(src, "Contact")
+//[/SIERRA-ADD] VIRUSOLOGY
+
for (var/obj/item/grab/G in H)
if (G.assailant == H && G.affecting == src)
if(G.resolve_openhand_attack())
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 1c4da4029e33b..b5dbd48eb60b1 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -964,8 +964,16 @@
/mob/living/carbon/human/proc/handle_hud_list()
+ var/foundVirus = 0 //SIERRA-ADD
if (GET_BIT(hud_updateflag, HEALTH_HUD) && hud_list[HEALTH_HUD])
var/image/holder = hud_list[HEALTH_HUD]
+//SIERRA-ADD VIRUSOLOGY
+ for (var/ID in virus2)
+ if (ID in virusDB)
+ foundVirus = 1
+ break
+
+//SIERRA-ADD
if(stat == DEAD || status_flags & FAKEDEATH)
holder.icon_state = "0" // X_X
else if(is_asystole())
@@ -978,6 +986,10 @@
var/image/holder = hud_list[LIFE_HUD]
if(stat == DEAD || status_flags & FAKEDEATH)
holder.icon_state = "huddead"
+//SIERRA-ADD VIRUSOLOGY
+ else if(foundVirus)
+ holder.icon_state = "hudill"
+//SIERRA-ADD
else
holder.icon_state = "hudhealthy"
hud_list[LIFE_HUD] = holder
@@ -1001,6 +1013,10 @@
holder2.icon_state = "huddead"
else if(has_brain_worms())
holder2.icon_state = "hudbrainworm"
+//SIERRA-ADD VIRUSOLOGY
+ else if(foundVirus)
+ holder.icon_state = "hudill"
+//SIERRA-ADD
else
holder2.icon_state = "hudhealthy"
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index aab68c683bead..2052a0416ac8e 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -15,6 +15,8 @@
//Chemicals in the body
handle_chemicals_in_body()
+ handle_allergy()
+
//Random events (vomiting etc)
handle_random_events()
diff --git a/code/modules/mob/living/carbon/viruses.dm b/code/modules/mob/living/carbon/viruses.dm
index 9f657c52aa5cf..ca6a3b1a0fb09 100644
--- a/code/modules/mob/living/carbon/viruses.dm
+++ b/code/modules/mob/living/carbon/viruses.dm
@@ -1,16 +1,69 @@
/mob/living/carbon
var/immunity = 100 //current immune system strength
+//[SIERRA-ADD] VIRUSOLOGY
var/immunity_norm = 100 //it will regenerate to this value
/mob/living/carbon/proc/handle_viruses()
if(status_flags & GODMODE) return 0 //godmode
+ if(bodytemperature > 406)
+ for (var/ID in virus2)
+ var/datum/disease2/disease/V = virus2[ID]
+ V.cure(src)
+ if(life_tick % 3) //don't spam checks over all objects in view every tick.
+ for(var/obj/decal/cleanable/O in view(1,src))
+ if(istype(O,/obj/decal/cleanable/blood))
+ var/obj/decal/cleanable/blood/B = O
+ if(isnull(B.virus2))
+ B.virus2 = list()
+ if(LAZYLEN(B.virus2))
+ for (var/ID in B.virus2)
+ var/datum/disease2/disease/V = B.virus2[ID]
+ infect_virus2(src,V)
+
+ else if(istype(O,/obj/decal/cleanable/mucus))
+ var/obj/decal/cleanable/mucus/M = O
+ if(isnull(M.virus2))
+ M.virus2 = list()
+ if(LAZYLEN(M.virus2))
+ for (var/ID in M.virus2)
+ var/datum/disease2/disease/V = M.virus2[ID]
+ infect_virus2(src,V)
+
+ if(LAZYLEN(virus2))
+ for (var/ID in virus2)
+ var/datum/disease2/disease/V = virus2[ID]
+ if(isnull(V)) // Trying to figure out a runtime error that keeps repeating
+ CRASH("virus2 nulled before calling activate()")
+ else
+ V.process(src)
+ // activate may have deleted the virus
+ if(!V) continue
+
+ // check if we're immune
+ var/list/common_antibodies = V.antigen & src.antibodies
+ if(LAZYLEN(common_antibodies))
+ V.dead = 1
+//[/SIERRA-ADD] VIRUSOLOGY
if(immunity > 0.2 * immunity_norm && immunity < immunity_norm)
immunity = min(immunity + 0.25, immunity_norm)
+//[SIERRA-ADD] VIRUSOLOGY
+ if(life_tick % 5 && immunity < 15 && chem_effects[CE_ANTIVIRAL] < VIRUS_COMMON && !LAZYLEN(virus2))
+ var/infection_prob = 5 - immunity
+ var/turf/simulated/T = loc
+ if(istype(T))
+ infection_prob += T.dirt
+ if(T.dirt >= 50)
+ if(prob(infection_prob))
+ infect_mob_random_greater(src)
+ else
+ if(prob(infection_prob))
+ infect_mob_random_lesser(src)
+//[/SIERRA-ADD] VIRUSOLOGY
/mob/living/carbon/proc/virus_immunity()
var/antibiotic_boost = reagents.get_reagent_amount(/datum/reagent/spaceacillin) / (REAGENTS_OVERDOSE/2)
return max(immunity/100 * (1+antibiotic_boost), antibiotic_boost)
/mob/living/carbon/proc/immunity_weakness()
- return max(2-virus_immunity(), 0)
\ No newline at end of file
+ return max(2-virus_immunity(), 0)
diff --git a/code/modules/mob/living/carbon/xenobiological/xenobiological.dm b/code/modules/mob/living/carbon/xenobiological/xenobiological.dm
index 6ac95c42b74ba..7238c133e2e90 100644
--- a/code/modules/mob/living/carbon/xenobiological/xenobiological.dm
+++ b/code/modules/mob/living/carbon/xenobiological/xenobiological.dm
@@ -117,8 +117,8 @@
return tally
-/mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes)
- if ((!(yes) || now_pushing))
+/mob/living/carbon/slime/Bump(atom/movable/AM, called)
+ if ((!(called) || now_pushing))
return
now_pushing = 1
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 1d18fb3537547..1afbb67ef3a36 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -64,7 +64,7 @@ default behaviour is:
return 0
return ..()
-/mob/living/Bump(atom/movable/AM, yes)
+/mob/living/Bump(atom/movable/AM, called)
// This is boilerplate from /atom/movable/Bump() but in all honest
// I have no clue what is going on in the logic below this and I'm
@@ -75,7 +75,7 @@ default behaviour is:
// End boilerplate.
spawn(0)
- if ((!( yes ) || now_pushing) || !loc)
+ if ((!( called ) || now_pushing) || !loc)
return
now_pushing = 1
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index ccfc073bbcf5d..b68582cc3956b 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -68,6 +68,8 @@
/// An associative list of /singleton/trait and trait level - See individual traits for valid levels
var/list/traits
+ /// Flags set by traits triggering behavior; currently used for allergies.
+ var/trait_flags
/// Some combination of HAZARD_FLAG_*. When set, the flagged hazard types will not damage the mob.
var/ignore_hazard_flags = EMPTY_BITFIELD
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index fa38f46b4221f..6a4095f65c5eb 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -114,6 +114,8 @@ var/global/list/ai_verbs_default = list(
var/default_ai_icon = /singleton/ai_icon/blue
var/static/list/custom_ai_icons_by_ckey_and_name
+ idcard = /obj/item/card/id/synthetic/ai
+
/mob/living/silicon/ai/proc/add_ai_verbs()
src.verbs |= ai_verbs_default
src.verbs -= /mob/living/verb/ghost
diff --git a/code/modules/mob/living/silicon/robot/flying/module_flying_cultivator.dm b/code/modules/mob/living/silicon/robot/flying/module_flying_cultivator.dm
index ee72c0163f823..421a1d12768d4 100644
--- a/code/modules/mob/living/silicon/robot/flying/module_flying_cultivator.dm
+++ b/code/modules/mob/living/silicon/robot/flying/module_flying_cultivator.dm
@@ -2,8 +2,8 @@
name = "cultivator drone module"
display_name = "Cultivator"
channels = list(
- "Science" = TRUE,
- "Service" = TRUE
+ "Service" = TRUE,
+ "Science" = TRUE
)
sprites = list("Drone" = "drone-hydro")
diff --git a/code/modules/mob/living/silicon/robot/modules/module_clerical.dm b/code/modules/mob/living/silicon/robot/modules/module_clerical.dm
index 29068d4100253..3a890f10fc14b 100644
--- a/code/modules/mob/living/silicon/robot/modules/module_clerical.dm
+++ b/code/modules/mob/living/silicon/robot/modules/module_clerical.dm
@@ -28,7 +28,7 @@
/obj/item/device/scanner/plant,
/obj/item/storage/plants,
/obj/item/robot_harvester,
- /obj/item/material/kitchen/rollingpin,
+ /obj/item/material/rollingpin,
/obj/item/material/knife/kitchen,
/obj/item/crowbar,
/obj/item/rsf,
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index f5c6e7e28bcee..6511a718461bc 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -284,6 +284,20 @@
recalculate_synth_capacities()
if(module)
notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name)
+ addtimer(new Callback(src, .proc/announce_module_change), 2 SECONDS)
+
+/mob/living/silicon/robot/proc/announce_module_change()
+ var/singleton/security_state/security_state = GET_SINGLETON(GLOB.using_map.security_state)
+
+ if(!src || !(src.z in GLOB.using_map.station_levels))
+ return // don't announce offmap borgs
+
+ var/channel
+ if(length(module.channels) >= 1 && !security_state.current_security_level_is_same_or_higher_than(security_state.high_security_level))
+ channel = module.channels[1]
+ else
+ channel = "Common" // common if code red or no radio channels, replicates behavior that crew have
+ GLOB.global_announcer.autosay("[name] has loaded the [module.name].", "Robotic Module Oversight", channel)
/mob/living/silicon/robot/get_cell()
return cell
@@ -450,6 +464,8 @@
if(module)
for(var/datum/matter_synth/ms in module.synths)
stat("[ms.name]: [ms.energy]/[ms.max_energy_multiplied]")
+ stat("Local Time:", "[stationtime2text()]")
+ stat("Local Date:", "[stationdate2text()]")
/mob/living/silicon/robot/restrained()
return 0
diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm
index d0b94a707501d..42c2e35bd82f0 100644
--- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm
@@ -28,13 +28,22 @@
var/blood_per_tick = 3
var/health_per_tick = 0.8
pass_flags = PASS_FLAG_TABLE
-
+ var/datum/disease2/disease/carried //[SIERRA-ADD] VIRUSOLOGY
bleed_colour = "#aad9de"
ai_holder = /datum/ai_holder/hostile/melee/vagrant
/datum/ai_holder/hostile/melee/vagrant
+
+//[SIERRA-ADD] VIRUSOLOGY
+/mob/living/simple_animal/hostile/vagrant/Initialize()
+ . = ..()
+ if(prob(25))
+ carried = new/datum/disease2/disease()
+ carried.makerandom(rand(2, 4))
+//[/SIERRA-ADD] VIRUSOLOGY
+
/datum/ai_holder/hostile/melee/vagrant/engage_target()
if(ishuman(target))
var/mob/living/carbon/human/H = target
@@ -53,7 +62,10 @@
H.Stun(1)
H.visible_message(SPAN_DANGER("\the [holder] latches onto \the [H], pulsating!"))
V.forceMove(V.gripping.loc)
-
+ //[SIERRA-ADD] VIRUSOLOGY
+ if(V.carried && length(V.gripping.virus2) == 0)
+ infect_virus2(V.gripping, V.carried, 1)
+ //[/SIERRA-ADD] VIRUSOLOGY
/mob/living/simple_animal/hostile/vagrant/Process_Spacemove()
return 1
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 60932e7b78177..1b02c7ca507e6 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -610,7 +610,9 @@
else //Otherwise we're probably just holding their arm to lead them somewhere
var/grabtype
- if(H.has_organ(BP_L_ARM) || H.has_organ(BP_R_ARM)) //If they have at least one arm
+ if ((H.has_organ(BP_L_HAND) || H.has_organ(BP_R_HAND)) && (zone_sel.selecting == BP_L_HAND || zone_sel.selecting == BP_R_HAND))
+ grabtype = "hand"
+ else if(H.has_organ(BP_L_ARM) || H.has_organ(BP_R_ARM)) //If they have at least one arm
grabtype = "arm"
else //If they have no arms
grabtype = "shoulder"
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 7de3edeeac4e8..72ef605ecb7a7 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -360,27 +360,47 @@
to_chat(src, "You will now default to [default_run_intent] when moving quickly.")
/client/verb/setmovingslowly()
- set hidden = 1
- if(mob)
+ set hidden = TRUE
+ if (!mob)
+ return
+ if (mob.get_preference_value(/datum/client_preference/toggle_run) == GLOB.PREF_NO)
mob.set_moving_slowly()
+
/mob/proc/set_moving_slowly()
- if(!default_walk_intent)
+ if (!default_walk_intent)
default_walk_intent = get_movement_datum_by_missing_flag(MOVE_INTENT_QUICK)
- if(default_walk_intent && move_intent != default_walk_intent)
+ if (default_walk_intent && move_intent != default_walk_intent)
set_move_intent(default_walk_intent)
+
/client/verb/setmovingquickly()
- set hidden = 1
- if(mob)
+ set hidden = TRUE
+ if (!mob)
+ return
+ if (mob.get_preference_value(/datum/client_preference/toggle_run) == GLOB.PREF_NO)
mob.set_moving_quickly()
+ else
+ mob.toggle_moving_quickly()
+
/mob/proc/set_moving_quickly()
- if(!default_run_intent)
+ if (!default_run_intent)
default_run_intent = get_movement_datum_by_flag(MOVE_INTENT_QUICK)
- if(default_run_intent && move_intent != default_run_intent)
+ if (default_run_intent && move_intent != default_run_intent)
set_move_intent(default_run_intent)
+
+/mob/proc/toggle_moving_quickly()
+ var/quick = get_movement_datum_by_flag(MOVE_INTENT_QUICK)
+ if (move_intent == quick)
+ var/slow = get_movement_datum_by_missing_flag(MOVE_INTENT_QUICK)
+ if (slow && move_intent != slow)
+ set_move_intent(slow)
+ else if (quick)
+ set_move_intent(quick)
+
+
/mob/proc/can_sprint()
return FALSE
diff --git a/code/modules/mob/skills/skill.dm b/code/modules/mob/skills/skill.dm
index 307407d401360..8ed4c35cc6b7b 100644
--- a/code/modules/mob/skills/skill.dm
+++ b/code/modules/mob/skills/skill.dm
@@ -146,9 +146,9 @@ GLOBAL_LIST_EMPTY(skills)
name = "Information Technology"
desc = "Describes your understanding of computers, software and communication. Not a requirement for using computers, but definitely helps. Used in telecommunications and programming of computers and AIs."
levels = list( "Unskilled" = "You know how to use the computers and communication devices that you grew up with. You can use a computer console, a handheld or wall-mounted radio, and your headset, as well as your PDA. You know what an AI is, but you may see them as either \"people made of silicon\" or \"only machines\"; you know they have to obey their laws, but you don't know much about how or why they work.",
- "Basic" = "You know the basics of programming, but you're not very good at it and couldn't do it professionally. You have a pretty good idea of what makes AIs tick. You understand how information is stored in a computer, and you can fix simple computer problems. You're computer-literate, but you still make mistakes. If you tried to subvert the AI, you might make mistakes in wording your new laws. - The antagonist access decryption program has a chance to avoid tripping alarms and working more effectively. This increases with level.",
+ "Basic" = "You know the basics of programming, but you're not very good at it and couldn't do it professionally. You have a pretty good idea of what makes AIs tick. You understand how information is stored in a computer, and you can fix simple computer problems. You're computer-literate, but you still make mistakes. If you tried to subvert the AI, you might make mistakes in wording your new laws. - The antagonist access decryption program has a chance to avoid tripping alarms and working more effectively. This increases with level. - You can use the command line on modular computers (type \"man\" for a list).",
"Trained" = "At this level, you're probably working with computers on a daily basis. You understand and can repair the telecommunications network. Your understanding of AI programming and psychology lets you fix problems with the AIs or cyborgs--or create problems, if you so desire. You can program computers and AIs and change their laws effectively. - You can fully operate the Network Monitor, E-mail Administration, and AI Management Programs.",
- "Experienced" = "You have years of experience with computer networks, AI systems, telecommunications, and sysadmin tasks. You know the systems used on a daily basis intimately, and can diagnose complex problems. - The antagonist dos program gives extra fake attacking nodes to the system log. - You can use the command line on modular computers (type \"man\" for a list).",
+ "Experienced" = "You have years of experience with computer networks, AI systems, telecommunications, and sysadmin tasks. You know the systems used on a daily basis intimately, and can diagnose complex problems. - The antagonist dos program gives extra fake attacking nodes to the system log.",
"Master" = "People are probably starting to wonder whether you might be a computer yourself. Computer code is your first language; you relate to AIs as easily as (probably more easily than) organics. You could build a telecommunications network from the ground up.")
// Category: Service
@@ -336,3 +336,13 @@ GLOBAL_LIST_EMPTY(skills)
"Trained" = "You can accurately measure out reagents, grind powders, and perform chemical reactions. You may still lose some product on occasion, but are unlikely to endanger yourself or those around you. - You can fully operate the chem dispenser.",
"Experienced" = "You work as a chemist, or else you are a doctor with training in chemistry. If you are a research chemist, you can create most useful chemicals; if you are a pharmacist, you can make most medications. At this stage, you're working mostly by-the-book. You can weaponize your chemicals by making grenades, smoke bombs, and similar devices. - You can examine held containers for scannable reagents.",
"Master" = "You specialized in chemistry or pharmaceuticals; you are either a medical researcher or professional chemist. You can create custom mixes and make even the trickiest of medications easily. You understand how your pharmaceuticals interact with the bodies of your patients. You are probably the originator of at least one new chemical innovation. - You can examine held containers for all reagents.")
+
+/singleton/hierarchy/skill/medical/chemistry/virology
+ ID = "virology"
+ name = "Virology"
+ desc = "Virology requires a specialist to have not only a deep knowledge of viruses, but also the ability to work with them, similar to how a chemist works with chemicals. This means not only understanding chemical reactions and their effects, but also knowing how these reactions will affect the human body. Thus, a virologist must have not only knowledge of virology, but also medical skills. An analogy can be drawn with a medical chemist, who must have experience working with chemicals and understand what effect they will have in order to use them safely in medicine."
+ levels = list( "Unskilled" = "You know that virologist work with viruses; you know that they can be very dangerous. You probably know basic defence against viruses..",
+ "Trained" = "You can engeener viruses. You have some training in safety and you won't infect yourself while work... probably. You can almost safely use the virologist equipment.")
+ prerequisites = list(SKILL_CHEMISTRY = SKILL_TRAINED)
+ default_max = SKILL_BASIC
+ difficulty = SKILL_AVERAGE
diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm
index eb57b68aa22f3..34491246d9062 100644
--- a/code/modules/modular_computers/file_system/programs/generic/supply.dm
+++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm
@@ -171,6 +171,7 @@
var/datum/supply_order/O = new /datum/supply_order()
O.ordernum = SSsupply.ordernum
+ O.timestamp = stationtime2text()
O.object = P
O.orderedby = idname
O.reason = reason
@@ -230,9 +231,24 @@
return 1
+ if(href_list["order_back_to_pending"])
+ var/id = text2num(href_list["order_back_to_pending"])
+ var/datum/supply_order/SO = find_order_by_id(id, SSsupply.shoppinglist)
+ if(SO)
+ SSsupply.requestlist += SO
+ SSsupply.shoppinglist -= SO
+ SSsupply.points += SO.object.cost
+
+ else
+ to_chat(user, SPAN_WARNING("Could not find order number [id] to move back to pending."))
+
+ return 1
+
if(href_list["deny_order"])
var/id = text2num(href_list["deny_order"])
var/datum/supply_order/SO = find_order_by_id(id, SSsupply.requestlist)
+ if(alert(user, "Are you sure?", "Deny Order", "Yes", "No") != "Yes")
+ return 1
if(SO)
SSsupply.requestlist -= SO
else
@@ -243,6 +259,8 @@
if(href_list["cancel_order"])
var/id = text2num(href_list["cancel_order"])
var/datum/supply_order/SO = find_order_by_id(id, SSsupply.shoppinglist)
+ if(alert(user, "Are you sure?", "Cancel Order", "Yes", "No") != "Yes")
+ return 1
if(SO)
SSsupply.shoppinglist -= SO
SSsupply.points += SO.object.cost
@@ -254,6 +272,8 @@
if(href_list["delete_order"])
var/id = text2num(href_list["delete_order"])
var/datum/supply_order/SO = find_order_by_id(id, SSsupply.donelist)
+ if(alert(user, "Are you sure?", "Delete Order", "Yes", "No") != "Yes")
+ return 1
if(SO)
SSsupply.donelist -= SO
else
@@ -358,6 +378,7 @@
/datum/nano_module/supply/proc/order_to_nanoui(datum/supply_order/SO, list_id)
return list(list(
"id" = SO.ordernum,
+ "time" = SO.timestamp,
"object" = SO.object.name,
"orderer" = SO.orderedby,
"cost" = SO.object.cost,
@@ -378,6 +399,7 @@
var/t = ""
t += "
Adds ability to select minor or severe allergies to selected reagents in character setup screen.
+
Adds Allergy autoinjectors in loadout; can only be equipped if character has an allergy. Contains inaprovaline and epinephrine.
+
Minor allergies cause itching and resolve on their own with time. Can also be resolved with inaprovaline.
+
Major allergies cause breathing problems, do not resolve on their own. Require inaprovaline for stabilization and epinephrine to reverse the reaction.
+
Medical records automatically populate with allergies selected in setup screen.
+
Can now set specific traits as requirements for loadout items; currently only used for allergy autoinjectors.
+
Adds verbs in mob variable panel to add/remove traits
+
+
+
02.12 - 2024
+
Обновления Baneuus:
+
+
Уменьшил замедло дионам с 5 до 2
+
Увеличил расход воды дионам.
+
Сделал возможность дионам изучить ксеноязыки.
+
+
+
01.12 - 2024
+
Обновления DieSiege:
+
+
Порт спрайтов нижнего белья с инфинити. Три вида трусов, один вид бюстгалтера.
+
+
Обновления LordNest:
+
+
Исправил зону второго пода и добавил кнопки для взрывостойких дверей для реактора
+
Добавили ГККшникам дробовики для охоты на фауну и ланчбоксы
+
+
+
30.11 - 2024
+
Обновления DieSiege:
+
+
Возвращение/порт планет для выбора
+
Жителям Плутона возвращен Гаттер как доступный для выбора язык
+
+
Обновления The_Spanish_1nquisition:
+
+
Added Party Cards for the SCG's major political parties
+
Added Cultural Options for Wikified Planets
+
Added Passports for said Planets
+
+
+
29.11 - 2024
+
Обновления Banditoz:
+
+
Borgs can now see the in-round date and time.
+
+
Обновления SierraKomodo:
+
+
Half-pint glass no longer appears twice in the microlathe.
+
+
+
27.11 - 2024
Обновления Builder13:
-
Fixed lighting for shuttles after transition.
-
Fixed Delete channel button for NTNet Relay Chat Client.
-
Fixed Take image verb for borgs.
-
Fixed atmospherics for late loaded away sites.
-
Fixed ventcrawl for animals once they attacked somebody (example:borers).
-
Fixed a lack of the specific reagents for some of the snacks.
-
Фикс краша консоли РнД
+
Fixed languages for papers printed from faxes and photocopiers.
+
Увеличено максимальное количество символов для записей персонажа на 500
-
Обновления Builer13:
+
Обновления Hubblenaut:
-
Через кейбинд больше нельзя дропнуть недропаемые вещи (аугменты)
+
Characters that are at least 'experienced' in atmospherics will find that the rapid piping device will place pipes intuitively based on mouse position.
+
Fixes escape pods not repressurizing after launch.
+
Adds an airlock controller to the engine room
+
Fixes the paint sprayer for borgs.
-
Обновления MLGTASTICa:
+
Обновления JebediahTechnic:
-
Sugar doses over 50 units now cause brain damage for species with the sugar malus(unathi and unathi-homeworld monkeys)
+
Laser DMR's damage increased dramatically, long-range accuracy buffed, one-handed and un-scoped accuracy negatives increased, rate of fire slightly increased.
+
+
Обновления JuneauQT:
+
+
Added a slight margin of error to the number of ruins shown by an exoplanet scan
+
+
Обновления Lexanx:
+
+
возвращены охлаждающие пояса
+
Зона посадки в адванседлендинге теперь видна в виде "тени"
+
+
Обновления LynxQueen:
+
+
Slows e-cig consumation and also allows player to take drags off of the e-cig
Обновления Mucker:
-
Increased traitor scaling coefficient to 7, meaning fewer traitors will be selected with smaller in-game player counts.
+
Edited the IT Skill description to reflect that the command line is usable with Basic skill.
+
Adjusted the following computer command skill requirements: ifconfig -> Basic, hwinfo -> Basic, status -> Basic, log -> Skilled, sysnotify -> Experienced.
-
Обновления Neonvolt:
+
Обновления PurplePineapple:
-
Изменен атмос Воксшипа для предотвращения утечек при спавне
+
Adds missing toggle verbs to take off the suit when the RIG is offline and only when offline.
+
The speed at which you can activate your RIG is dependent on your EVA skill. Trained is the same as previous normal.
-
Обновления Nyvrem:
+
Обновления Sbotkin:
-
Skrianhi Tea now actually does tea things, like being hot.
+
MRE crates come with at least one vegan and at least one sugar-free protein option.
-
Обновления PsiOmegaDelta:
+
Обновления SierraKomodo:
-
Select loadout items now dislay an extended description when selected for use.
+
Fixes certain railguns having invalid sprite overlays.
+
Mercenaries can now buy the energy marksman rifle through the uplink for 50 buckaroos. _Do_ test this out for me.
+
power cell rack PSU machines now accept power cells again. Probably also fixes some other non-standard item->machinery interactions.
+
Attempting to add a non-component item to a machine that can accept said item, but is already full, now displays a user feedback message.
+
Fixes machine frames being unwrenchable.
+
+
Обновления Spookerton:
+
+
Organ scarring is correctly reported by scanners.
+
Non-metallic utensils are no longer conductive.
+
Utensils indicate their material in their name.
+
+
Обновления TheStripes:
+
+
Tweaked the th'oom reagent description to make its delectable origins unclear.
+
+
+
25.11 - 2024
+
Обновления Banditoz:
+
+
Fixed images in newscaster articles not showing up if the channel has special symbols in its title.
+
+
Обновления Builder13:
+
+
Fixed a bug where Mules were not getting guaranteed psi latency
+
+
Обновления Hubblenaut:
+
+
Fixes various issues with the paint sprayer
+
Fixes pipes, wires, atmos machinery and other specific object types adjacent to walls being hard to click.
+
The construction of support lattices is no longer blocked by objects on lower z-levels.
+
Construction of lattices and floors on holes is no longer free.
+
Adds headpats. Aim for the head when performing a hug.
+
Fixes the emergency shield generator not blocking air.
+
Fixes taped paper not correctly being placed under the cursor.
+
Fixes the removal or placing of floor causing dark areas.
+
Adds a radial menu for choosing cable colors.
+
A multitool is no longer necessary for choosing cable colors. Use them in your hand.
+
Removes purple cable so all cable colors fit on one menu page.
+
Fixes not being able to put the light replacer into a container.
+
The paint sprayer now uses a radial menu and has some more decals available.
+
The paint sprayer now uses mouse position to determine the direction of all decals on placement -- not just quarter-tiles.
+
The paint sprayer can now once again be used on airlocks without issue.
+
Pumps and valves are now hidden by catwalks.
+
Mapped pumps and valves can be removed without having to pry off the floor tile.
+
New sprites for grey, white and dark floor and mono floor tiles
+
+
Обновления JuneauQT:
+
+
Shrouded, Chlorine, and Volcanic exoplanet clouds now generate the way they were intended to instead of being solid black
+
Added the Alliance United Flotillas Branch and three ranks for it to ID cards (and all other places Branch can be set.)
+
ICCGN and SCGA ranks now have their officer/enlisted badge included in their define.
+
Refactors ranking orders of Fleet and Expeditionary Corps ranks to the newer standard
+
The 'Admiral' and 'Commandant of the Expeditionary Corps' ranks of the Expedtionary Corps now function correctly.
+
+
Обновления Merlin1230:
+
+
Chairs and beds return their construction cost when deconstructed
+
Padded chairs now only cost 1 sheet to make
+
Makeshift splints are now fixed and can be made again by applying tape to a rod
+
+
Обновления Mucker:
+
+
Nacelles APCs are no longer affected by the grid check event.
+
Added a verb to set how long before the initial continue vote occurs to the 'Server' tab.
+
Say messages heard by your mob while aghosted will show up in chat with a 'Near you:' prefix.
+
Shuttle control consoles will once again reconnect to their shuttle if dismantled and rebuilt.
+
Added logging of computer commands to the Secrets 'Investigation' menu.
Обновления PurplePineapple:
-
Adds a variable to energy weapons allowing them to be marked as "disposable" guns. Energy guns with disposable set to true are not able to be charged or used with an inducer.
-
Security basic supply packs no longer contain electrolasers. They can be purchased separately with a cheaper supply pack that contains disposable electrolasers.
-
Disposable tasers have 10 shots now.
+
Changes the wood pump shotgun to 'Crawford' from 'Bulldog' to reduce confusion. The riot version is now the 'Bateman'.
Обновления Qlonever:
-
Investigators can now take labcoats and sterile gear from the loadout menu.
+
Toggling fullscreen no longer adds a line of empty space to the window.
Обновления Ryan180602:
-
Added two documents for bridge crew. (прим. ГР Сьерры - Торчевская тема)
-
Added documents specific for COS, CE, CMO, CSO/Pathfinder, CO/SCGR, XO/DC/CS. (прим. ГР Сьерры - Торчевская тема)
-
Remove disorientor from lockers (прим. ГР Сьерры - это касается только Торча)
-
Remove disorientor design from protolathe.
-
Give parapen a 1.5s delay, and only 5u of VB.
+
Hyperzine now reacts negatively with opiates
Обновления Sbotkin:
-
Various changes to the supply department, most notable: DC office and the warehouse lights.
-
Deck crew helmets and hardhats can be worn in the hazard vest's suit slot.
-
Minor shuffles in the orderable goods.
-
Envelopes and folders are shreddable.
-
Miners lose access to the exploration freq, deck technicians gain access to the hailing freq and the Pathfinder gains access to the supply freq.
-
Artifacts no longer break on scan halting.
+
Medical system control for mechs is available for printing from round start.
+
All system controls require Data 1 and yield the appropriate origin tech upon destruction.
+
Fleet сhaplains can be unskilled in small arms now.
+
Envelopes are craftable from cardboard.
+
Envelopes can be sealed and resealed with rubber stamps. Open envelope will show the last stamp it was sealed with.
+
Fixed metal foam not blocking air.
+
Changes the wording of the cryo cell's cryostasis setting, making it more clear. High intensity makes people freeze deeper and metabolize slower, good for stasis. Low intensity makes people freeze less and metabolize faster, good for healing.
+
Added stoles (accessory) for chaplains, in the loadout.
+
Added the matching hood to the chaplain's locker.
+
Holopad and a filling cabinet for the chaplain's office.
+
Various religious stuff can be carried on the chaplain's hoodie.
Обновления SierraKomodo:
-
Fixed borg bottle racks not being able to pick anything up.
-
Airlocks can now be further damaged after the panel breaks with a sufficiently strong weapon, allowing you to fully break the airlock open by force instead of prying it or (if the door was bolted at the time it broke) going through the process of cutting through the bolts and cover.
-
Fully broken doors can be dismantled with a welding tool, giving back a small amount of resources.
-
Adds the base corrupted hivebot mobs and beacon used during the Legion itnroduction event, for future usage.
-
Broken emags now retain all fingerprint and fibre information from their unbroken form.
-
Broken emags now remain in your hand instead of dropping to the floor.
-
Hacking tools no longer act as multi tools while enabled.
+
Toolbelts can now hold Rapid Construction Devices
+
Droppers can now be used on mobs on help intent again.
+
Firing a gun now uses the same red text style for the user as is used for observers.
+
Cargo piles stacked on the same tile no longer block eachother from being cleaned up.
+
Colors used for certain types of in-chat messages have been adjusted. Primarily, there is now a different in color between warning (red -> orange bold italic) and danger (red bold), and notice (blue), info (blue -> purple), and subtle (blue -> gray italic).
+
Removing papers from noticeboards now places the paper in your hands instead of on the floor, if there's a free hand.
+
Removing papers from noticeboards now properly adds fingerprints to the removed paper.
+
Colors and styles used for various injury states when examining carbon mobs have been individually tweaked. Injuries are now red again.
+
Added additional lines to the list of options for legion broadcasts.
+
Chat messages for buckling and unbuckling are now blue instead of OH GOD OH FUCK RED.
Обновления Spookerton:
-
Added a "View Byond Account" link to player panel when the mob has a ckey.
-
Wheelchairs are subject to regular mob slowdowns.
-
Mobs that are not human, robot, or an admin observer cannot interact with microwaves.
+
Atom overlays and underlays no longer incorrectly appear modifiable via VV.
+
Hydrogen tanks' supply order name better reflects its contents.
Plant potency affects the brightness of bioluminescent plants
+
more memos
-
Обновления ВашНикнейм:
+
Обновления caledfwlchschime:
-
Пофиксил баг с белыми бровями, теперь у них есть функция выбора цвета.
+
Added sound effects for legion voices.
+
+
Обновления thestripes:
+
+
Rewrites the hailer description to be less rude.
-
21.10 - 2024
-
Обновления Builder13:
+
23.11 - 2024
+
Обновления ВашНикнейм:
-
Возвращены OOC заметки персонажа. Их можно настроить через кнопку Set OOC notes рядом с кнопками флавора. Заполненные OOC заметки можно смотреть через examine персонажа
+
Аномалии на тайле облак больше не дают им раскрываться (Больше не выйдет спрятаться от всасывающей аномалии в пучинах облак)
+
Переписана работа всасывающей гравитационной аномалии
+
Мех больше не неуявзим для обак
+
Теперь везде в коде не Zjarka, а Zharka
+
Добавил дикий самопальный детектор Гюрза для ГКК
+
Облака излучают персиковый свет
+
Трава излучает приятные зеленоватый свет
+
Переписана работа облаков
+
Выдал на склад ГКК 1 гюрзу и 3 пачки болтиков. Спасибо местному инженеру.
+
Добавил иконки Гюрзы
-
14.10 - 2024
+
22.11 - 2024
Обновления Lexanx:
-
Добавлена возможность сохранять сканы с бодисканнера.
Makes observ cleanup tracking use datum vars instead of a list
+
Добавил звуки для аирлоков
+
Increases large map loading speed
+
Добавил face direction по нажатию иконки интента движения с зажатым ctrl
-
30.09 - 2024
-
Обновления Shegar:
+
13.11 - 2024
+
Обновления KandJX:
-
Временный откат позволяющий прокликивать ИИшке
+
Добавил лестницу между бригом и мостиком.
+
Убрал шлюз в теха из комнаты капитана.
-
29.09 - 2024
-
Обновления UEDHighCommand:
+
12.11 - 2024
+
Обновления Builder13:
-
С Инфинити портировано Восхождение.
+
Больше нельзя получить галлюцинации от суперматерии при активных мезонных очках
-
28.09 - 2024
-
Обновления Builder13:
+
11.11 - 2024
+
Обновления BOT Eeshee:
+
+
Добавила перчатки, маски и изоли ЭК
+
+
Обновления Lexanx:
+
+
Баг взаимодействия синтетов
+
Некорректная зона меркшипа
+
Пофикшена кража тюрфов при взлете
+
+
Обновления Shegar:
-
Возвращены старые шансы на дизарм. Стал более зависимым от проставленного скилла
+
Задник космоса не становится серым из-за летающих островов
+
Текст эндраунда мода аномалий не жирный
Обновления Teteshnik:
-
Пофиксил шлем ЕРТ
-
Добавил новую прическу
+
Переименовал спавнеры безбилетников
-
24.09 - 2024
+
10.11 - 2024
Обновления Builder13:
-
Возвращена возможность перемещения для карго поезда
-
Исправлено отображение для скрапа и переработанного скрапа
+
Радио при событии пси сигнала больше не должно воздействовать через стены
-
Обновления Lexanx:
+
Обновления Mucker:
-
Пофиксил взрывы
+
You can now "hold" a humanoid mobs' hand when pulling them and targeting one of their hands.
+
Antag latespawn scaling no longer considers players that aren't alive or are offship when deciding maximum antags.
Обновления Shegar:
-
ИИ больше не может открыть дверь у АВД
-
Interact with machine у ии должен теперь работать полноценно
-
Сбрасывание подлетевших суден: Пилот может сбрасывать подлетевшие судна. В этом процессе используются навыки пилота обоих сторон и тот факт, есть ли за управлением судна(Противника) пилот в прямом управлении.
-
Ремап ядра ИИ, апц сдвинут в центр ядра(К самому ИИ)
БСД теперь удаляет аномки после окончания ивента (Должен по крайней мере)
+
Мех при таране цели тоже делает шаг, от чего меха теперь невозможно заблочить не мехом/адхерантом/гбсом
+
Добавил глыбы на планету лёд. Красиво!
+
Детектор не какает обработкой без нужды, теперь его нужно включать.(Контрол + ЛКМ)
+
Теперь аномалии при осмотре детектером обнаруживаются полностью, а не частично (От чего шансы обнаружения довольно таки упали)
+
Полность переписана система влияния артефактов на определённые события с персонажами, добавлены новые эффекты. Усилена важность и польза контейнеров артефактов из-за этого.
+
Добавлена анимация уворота при паррировании.
+
Переписана система процессинга артефактов на персонажа. Она должна при любых взаимодействиях понимать, кто текущий носитель и влиять на него.
+
Добавил СНЕГ на ледяную планету с эффектом на экране и звуком.
+
Добавлен Z скан уровня для детектора
+
Добавил скалолазанье на планету ЛЁД. Помогайте друг другу, используйте кирки, готовьтесь физически и преодолевайте горы.
+
Добавлен установщик маячков для более комфортного построения пути на планетах.
+
Всасывающая гравианомалия изменена сопротивляться им стало сложнее, так как и задумывал разработчик, но в то же время, вы можете помогать своим друзьям выбираться из неё. Файнд аут ин гейм!
+
Логика электр подтипа Тесла переписана, теперь вся планета не сможет одновременно бахать
+
Достаточно высокий уровень науки позволит определять тип аномалии
+
Спавн аномалий от больших артефактов выведен из ротации.
+
Спрайты для артефактов, погода
+
Выдал Деплоер на склад ЭК. Детектор, мешочек и деплоер на склад шахтёров.
+
Исправлено описание детектора аномалий
+
Погода Буран, может подлагивать клиент. Пишите чё каво.
+
Сильно увеличен размер планет. Спавнит так же, как и от админки.
+
Добавлена аномальная планета: Летающие острова.
+
Сильно увеличил расстояния насёра аномалиями при БСД проливе, увеличено количество аномок.
+
Ослаблено СТАН влияние электры на жертву
+
Добавлена возможность от атлетики сопротивляться влиянию электры
+
Нёрф энергощитов меха, генерация тепла при получении урона увеличена в 2 раза
+
Добавил трамплин в билдер админов.
+
+
Обновления Spookerton:
+
+
Corrected Masculinity.
-
Обновления Vipo24:
+
Обновления The_Spanish_1nquisition:
-
Кислота вновь очень больно обжигает, как было раньше
+
Tornakov took a marker to his poster.
-
19.09 - 2024
-
Обновления Teteshnik:
+
09.11 - 2024
+
Обновления Shegar:
+
+
Минификсик для гитхаба
+
+
+
08.11 - 2024
+
Обновления Lexanx:
+
+
Теперь челноки/шаттлы способные летать в космосе и совершать посадки,
+
+
Обновления RocheHendson:
+
+
Seedship теперь имеет должности для захода
+
Seedship командование теперь может поставить имя своему наследию
+
+
+
07.11 - 2024
+
Обновления Mucker:
+
+
Adjusted the spawn target for merc and raider to 3, and traitor to 1.
+
+
Обновления PsiOmegaDelta:
+
+
Select loadout items again display an extended description when selected for use.
+
+
Обновления Ryan180602:
+
+
Wristwatches show the date correctly.
+
Posibrains can be fixed outside chassis.
+
Removes the preset pronoun badge types, people can now customise them to their wish.
+
Adds another entry for the pride pins. Letting people take two now.
+
Throat-slit timer changed from 3.24 ~ 0.8! seconds to 3.75 ~ 2.25. On success, the user cannot act again for an extra second.
+
+
Обновления sdtwbaj:
+
+
Flora can be cut away with a hatchet.
+
Trees can be destroyed, and drop wood!
+
woodcutting.ogg from Polaris
+
tree stumps from Polaris
+
+
Обновления sick trigger:
+
+
Orders from supply now record what time the requst was made
+
+
Обновления sick-trigger:
-
Пофиксил лодаут ниндзи, так-же удалил костыль.
-
Портировал букеты в билд
+
Fixed being unable to spawn on landed colony ship.
-
16.09 - 2024
+
06.11 - 2024
+
Обновления Baneuus:
+
+
Резоми хихикают как резоми, а не как люди.
+
Вернул звук вздоха резоми.
+
Повысил температуру, которая для резоми считается "комфортной" до 21.6 С*
+
Усилил найтвижн резоми.
+
Удалил мерков из спауна при режиме революции
+
Теперь sechud lenses резоми работают нормально
+
Обновления Builder13:
-
Портировано отображение для скана контактов у сенсоров
-
Портирована экстренная кнопка бедствия
+
Откат трех секунд подсистемы машин
+
+
Обновления SierraKomodo:
+
+
Shuttle control consoles can no longer be synced to shuttles if not actually on the shuttle.
+
Regular non-overmap shuttle control consoles will no longer function on overmap shuttles, and vice-versa.
+
Shuttle control consoles now automatically sync to the shuttle they're built on when created, instead of needing to be set by multitooling the board before creation.
+
Shuttle control consoles that are not properly connected to a shuttle now have a new error screen sprite.
+
+
Обновления Teteshnik:
+
+
Добавил некоторым расам возможность стать безбилетником
+
Поменял название безбилетника на неизвестного сделано угоду айди
+
+
Обновления rootoo807:
+
+
Fixes broken sprites / adds missing sprites for armbands, insulated gloves, soft caps, blood masks on GAS. GAS can no longer wear overalls or wizard voidsuit [snakes don't have legs for pants :( ].
+
Adds missing sprite for flipped veteran's cap.
-
15.09 - 2024
-
Обновления ВашНикнейм:
+
05.11 - 2024
+
Обновления awkardlyconfusedneuralnetwork:
-
Выдал детекторы для ЭК
+
Убрался за собой
-
14.09 - 2024
+
04.11 - 2024
Обновления Builder13:
-
Добавлена возможность вставки и вытаскивания предмета из интегральной платы без ее удаления из корпуса
-
Добавлены интегральные платы list pick, image comparsion scanner, floor magnet.
-
Сделаны дополнения для плат intelligence control circuit и examiner
+
Добавлена кнопка add trait в создание персонажа. Сейчас там есть опции только для регенерации Унати.
+
+
Обновления NinjaPikachushka:
+
+
Худ-Кнопки мага перестали сбегать.
+
+
Обновления totalynotglist:
+
+
Экспериментальная оптимизация подсистемы Machines на 33.3%.
Обновления ВашНикнейм:
-
Сбор артефактов в мехе запрещён
-
Генерация артефактов и аномалий жёстко ограничена математикой.
-
Сбор артефактов теперь работает так, как я и задумывал
-
Добавил планетарную генерацию аномалий (по всей планете), зависящая от типа планеты
-
URM (Universal Research Machine) - новое устройство на петрове для анализа артов(мелких).
-
Добавлена ледяная планета
-
Добавил спрайты маячков, детектора, URM
-
Выдал ЭК коллекторы,маячки и новые детекторы. Колония, воксы, мусорщики - получили болтики.
-
Изменил русский на английский в аномалиях там, где это неуместно
-
Дал билдер аномалий в билдер с возможностью тонкой настройки
+
Экран меха обновляется при переключении Power, выключении от перегрева, при выбивании сенсора.
+
Если у меха выбита грудь, то раз в 20-40 секунд мех получает полный перегрев.
-
11.09 - 2024
+
03.11 - 2024
+
Обновления Builder13:
+
+
Добавлена единственная возможность чинить переломы для Адхерантов - через минеральные ванны. Процедура может быть длительной.
+
Генокрад больше не утрачивает навыки от профессии при получении роли
+
Возвращены шансы на пси латентность при заходе в раунд
+
Пси сигнал возвращен в ротацию событий
+
Возвращена переменная stop_sight_update для мобов, чтобы исключить обновление зрения при ее включении
+
+
Обновления Gaaxer, awkardlyconfusedneuralnetwork:
+
+
Инит ксеноархиологии теперь быстрее
+
+
Обновления Gaxeer, awkardlyconfusedneuralnetwork:
+
+
Починил обновление оверлея газов
+
Починил то, что рычаг на конвейере проходит все объекты в мире
+
+
Обновления KOJIECO:
+
+
Добавил скрелльскую одежду для всех каст от Failu.
+
+
Обновления Lexanx:
+
+
Новые фуллскрин оверлеи повреждений ИПС и Адхерентов и ППТ
+
Предмет(Explosion Wather) для получения научных очков из взрывов снова работает
+
Джетпаки в ветке исследований РнД
+
Кинетический сборщик в производстве РнД
+
Платы мусоропереработчиков в ветке исследований РнД
Исправлены дополнительные пропавшие спрайты Восхождения и недоработки связанные с их расами
+
Обновления Teteshnik:
-
Удалил трэйси
-
Портирован халат робототехника с инфинити.
+
Поставил возможность изменения/добавления хоткея для фейс дира.
+
Новый флаг для профессий позволяющий делать профессию только возможным раундстартом
+
Добавил безбилетников
+
+
Обновления awkardlyconfusedneuralnetwork:
+
+
Инпут теперь обрабатывается раньше других сабсистем, должно повысить плавность игры.
+
Ускорил инит, да.
-
06.09 - 2024
-
Обновления ВашНикнейм:
+
23.10 - 2024
+
Обновления Builder13:
-
Ремап карты ниндзи, он получил сауну, додзе, озерцо и пару комнат. В целом, перенос с инфинити.
+
Фикс изменения названия и описания для предметов лоадаута
-
04.09 - 2024
+
22.10 - 2024
Обновления Builder13:
-
Wizard retains all the spells in the hud upon changing/getting body.
-
It is now possible to spawn wizard packages (examples: scrying orb, mastercrafted armor).
-
Fixes for some of the spells, so they are castable again.
+
Fixed lighting for shuttles after transition.
+
Fixed Delete channel button for NTNet Relay Chat Client.
+
Fixed Take image verb for borgs.
+
Fixed atmospherics for late loaded away sites.
+
Fixed ventcrawl for animals once they attacked somebody (example:borers).
+
Fixed a lack of the specific reagents for some of the snacks.
+
Фикс краша консоли РнД
+
+
Обновления Builer13:
+
+
Через кейбинд больше нельзя дропнуть недропаемые вещи (аугменты)
+
+
Обновления MLGTASTICa:
+
+
Sugar doses over 50 units now cause brain damage for species with the sugar malus(unathi and unathi-homeworld monkeys)
+
+
Обновления Mucker:
+
+
Increased traitor scaling coefficient to 7, meaning fewer traitors will be selected with smaller in-game player counts.
+
+
Обновления Neonvolt:
+
+
Изменен атмос Воксшипа для предотвращения утечек при спавне
+
+
Обновления Nyvrem:
+
+
Skrianhi Tea now actually does tea things, like being hot.
+
+
Обновления PsiOmegaDelta:
+
+
Select loadout items now dislay an extended description when selected for use.
+
+
Обновления PurplePineapple:
+
+
Adds a variable to energy weapons allowing them to be marked as "disposable" guns. Energy guns with disposable set to true are not able to be charged or used with an inducer.
+
Security basic supply packs no longer contain electrolasers. They can be purchased separately with a cheaper supply pack that contains disposable electrolasers.
+
Disposable tasers have 10 shots now.
+
+
Обновления Qlonever:
+
+
Investigators can now take labcoats and sterile gear from the loadout menu.
+
+
Обновления Ryan180602:
+
+
Added two documents for bridge crew. (прим. ГР Сьерры - Торчевская тема)
+
Added documents specific for COS, CE, CMO, CSO/Pathfinder, CO/SCGR, XO/DC/CS. (прим. ГР Сьерры - Торчевская тема)
+
Remove disorientor from lockers (прим. ГР Сьерры - это касается только Торча)
+
Remove disorientor design from protolathe.
+
Give parapen a 1.5s delay, and only 5u of VB.
+
+
Обновления Sbotkin:
+
+
Various changes to the supply department, most notable: DC office and the warehouse lights.
+
Deck crew helmets and hardhats can be worn in the hazard vest's suit slot.
+
Minor shuffles in the orderable goods.
+
Envelopes and folders are shreddable.
+
Miners lose access to the exploration freq, deck technicians gain access to the hailing freq and the Pathfinder gains access to the supply freq.
+
Artifacts no longer break on scan halting.
+
+
Обновления SierraKomodo:
+
+
Fixed borg bottle racks not being able to pick anything up.
+
Airlocks can now be further damaged after the panel breaks with a sufficiently strong weapon, allowing you to fully break the airlock open by force instead of prying it or (if the door was bolted at the time it broke) going through the process of cutting through the bolts and cover.
+
Fully broken doors can be dismantled with a welding tool, giving back a small amount of resources.
+
Adds the base corrupted hivebot mobs and beacon used during the Legion itnroduction event, for future usage.
+
Broken emags now retain all fingerprint and fibre information from their unbroken form.
+
Broken emags now remain in your hand instead of dropping to the floor.
+
Hacking tools no longer act as multi tools while enabled.
-
Обновления Gy1ta23:
+
Обновления Spookerton:
-
you can now select photographs in loadout with changeable descriptions
+
Added a "View Byond Account" link to player panel when the mob has a ckey.
+
Wheelchairs are subject to regular mob slowdowns.
+
Mobs that are not human, robot, or an admin observer cannot interact with microwaves.
+
+
Обновления gy1ta23:
+
+
Lockets and wallets can hold photo trinkets.
+
+
Обновления sick trigger:
+
+
Supply can purchase stasis cages
+
Fixes for selling artifacts and animals
+
Plant potency affects the brightness of bioluminescent plants
+
+
Обновления ВашНикнейм:
+
+
Пофиксил баг с белыми бровями, теперь у них есть функция выбора цвета.
-
01.09 - 2024
-
Обновления Shegar:
+
21.10 - 2024
+
Обновления Builder13:
+
+
Возвращены OOC заметки персонажа. Их можно настроить через кнопку Set OOC notes рядом с кнопками флавора. Заполненные OOC заметки можно смотреть через examine персонажа
+
+
+
14.10 - 2024
+
Обновления Lexanx:
+
+
Добавлена возможность сохранять сканы с бодисканнера.
[SPAN_COLOR("red", "SECRET - CODE WORDS: TORCH")]
@@ -110,10 +110,11 @@
new/obj/item/paper(src, memo, "Standing Orders")
new/obj/item/paper/umbra(src)
-/obj/item/folder/envelope/rep
+/obj/item/folder/envelope/preset/rep
desc = "A thick envelope. The SCG crest is stamped in the corner, along with 'TOP SECRET - TORCH UMBRA'."
+ seal_stamp = "General Secretary rubber stamp"
-/obj/item/folder/envelope/rep/Initialize()
+/obj/item/folder/envelope/preset/rep/Initialize()
. = ..()
new/obj/item/paper/umbra(src)
diff --git a/maps/torch/items/memos.dm b/maps/torch/items/memos.dm
index 028bc1ad895f8..7a2e2a174289d 100644
--- a/maps/torch/items/memos.dm
+++ b/maps/torch/items/memos.dm
@@ -177,6 +177,15 @@
name = "fleet rank abbreviations"
info = {"Some "internal use only" reports on proper and improper ways of abbreviating fleet ranks and roles, including emphasis that "sub" is NOT an authorized way, shorthand or otherwise, to refer to sub lieutenant."}
+/obj/item/paper/memo/generic/misuseofcom
+ name = "misuse of communications"
+ info = {"Some "internal use only" reports on telecommunications use, reminding personnel that all telecommunications data is automatically relayed to command upon its transcription to the server, and that if you don't want command to hear something, don't say it on radio or in emails."}
+
+
+/obj/item/paper/memo/generic/identificationissues
+ name = "your xeno crew members and you"
+ info = {"An at-length article with multiple images of well-meaning charts and comparing images on how to respectfully refer to xeno crewmembers, and that the expectations on what gender they may be will be different from human expectations. It is seemingly bulletproof, up until you reach the lines regarding increasingly esoteric (and invasive) methods of deciding what pronouns to use for them, when it would be easier to just ask or look for them on their IDs cards."}
+
// scgr memos
@@ -206,7 +215,7 @@
/obj/item/paper/memo/scgr/yourjob
name = "\improper SCG and you"
- info = {"Some "confidential" briefing documents, detailing the job of the SCGR in brief. It highlights they are a civilian, first and foremost, who functions as a general-purpose civil servant aboard the SEV Torch. They also should advise the Commanding Officer, assisting with bureaucratic affairs where required, and spearheading diplomatic negotations."}
+ info = {"Some "confidential" briefing documents, detailing the job of the SCGR in brief. It highlights they are a civilian, first and foremost, who functions as a general-purpose civil servant aboard the SEV Torch. They also should advise the Commanding Officer, assisting with bureaucratic affairs where required, and spearheading diplomatic negotations. At the bottom, underlined several times and in bold is "YOU ARE NOT A LAWYER"."}
/obj/item/paper/memo/scgr/perdiemdeny
name = "per diem denials"
@@ -224,6 +233,10 @@
name = "assembly floor proceedings"
info = {"A copy of the minutes from the Sol Assembly hearing over an emergency bill giving the SCG Defense Forces jurisdiction over the Expeditionary Corps (and by extension, the SEV Torch). The debate is vicious and devolves into angry bickering at points. The bill appears to have gotten uncomfortably close to being passed."}
+/obj/item/paper/memo/scgr/radicals
+ name = "radicalization investigation report"
+ info = {"A summary of a Senate investigation into the radicalization of government employees. The findings appear somewhat grim, with long lists of reports of politics seeping its way into the everyday functions of the Fleet, Diplomatic Service, SFP, and Expeditionary Corps. While the report clarifies that no major incidents have occurred thus far, the intertwining of politics and governmental operations will likely have grave consequences if let run rampant."}
+
// command memos
@@ -279,27 +292,29 @@
name = "non-judicial punishments"
info = {"A "for official use only" memorandum detailing options with regards to non-judicially punishing uniformed servicemembers. Such punishments include admonishment/reprimand, forfeiture of pay, restriction, extra duty, and reduction in rank. The punishments available and their severity depend on the rank of the accused and the imposing officer."}
-/obj/item/paper/memo/command/recall
- name = "order of recall"
- info = {"A notice from the Helios Board of Admiralty regarding the urgent return of the Torch to Mars - the Board has ordered debriefing and review regarding the diplomatic meetings with the Terran Pioneer Corps and the field execution of SLT Kristen Rohtin. The document stresses that the ship be wary of any vessels, Fleet or otherwise, masking their transponders."}
-
-/obj/item/paper/memo/command/roguefleeties
- name = "rogue fleet movements"
- info = {"An "internal use only" memorandum sent from Expeditionary Command, detailing the last known locations and naval capacity of several rogue Fifth Fleet vessels, including the SFV Nathan Hale. The data available in the report is uncomfortably sparse."}
-
-/obj/item/paper/memo/command/outpostreport1
- name = "\improper E-14b outpost report"
- info = {"An "internal use only" memo detailing the status of the research outpost in the E-14b system. It states that construction is still underway, and suggests efforts would benefit from better communication between EC and Terran engineering personnel."}
-
-/obj/item/paper/memo/command/outpostreport2
- name = "\improper E-14b outpost report"
- info = {"An "internal use only" memo detailing the status of the research outpost in the E-14b system. It states that construction has been delayed due to a migration of native ambulatory fungus at the site, and requests that the EC begin looking into low-impact mushroom removal methods."}
+/obj/item/paper/memo/command/outpostreport
+ name = "E-14b outpost report"
+ info = {"An "internal use only" memo detailing the status of the research outpost in the E-14b system. It states that construction is overall complete, and suggests efforts in better communication between EC and Confederate engineering personnel have born fruit, with several listed examples of the formed bonds."}
/obj/item/paper/memo/command/evasiveflight
name = "evasive flight maneuvers"
info = {"A hastily-penned report detailing strategies for evading ship-to-ship laser fire and missile strikes in the event of another attack on the Torch. The author highly recommends the tactical use of space dust and other debris, citing the successful evasive action taken during the attack by the SFV Nathan Hale."}
+/obj/item/paper/memo/command/confedsightings
+ name = "confederate naval protocols"
+ info = {"An "internal use only" memo sent from the Government Representative to the bridge crew reminding them that the SCG is, and will for the foreseeable future, be a peace with the GCC. As such, it is entirely unneeded to 'batten down the hatches' and prepare the ship for hostilities at the mere sighting of a Confederate Naval Vessel, and that such preparations implies Xenophobic tendencies and increases the probability of diplomatic incidents."}
+
+/obj/item/paper/memo/command/pioneerpranks
+ name = "pioneer prank reports"
+ info = {"An "internal use only" memo sent from Expeditionary Command reporting on an increase in "friendly pranks" between the Expeditionary Corps and Pioneerng Corps. The report details how the warming of relations between the two Corps has brought pranks usually kept within the Expeditonary Corps into the inter-Corps realm. The report advises Non-Expeditionary Corps personnel to interpret Pioneers acting oddly as nothing more than attempts at pranking a EC vessel. It lists an example of how a Pioneer crew used the derelict hull of a cargo vessel to scare the SEV Komarov into believing they were being followed by a ghost ship."}
+
+/obj/item/paper/memo/command/miranda
+ name = "miranda line caution"
+ info = {"A notice from the Ministry of Stellar Charts to the command of the SEV Torch. It is long and full of technical Cartography, but is quite clearly summarized when it says "although the Miranda Line was drawn as the edge of 'Known' Space during the Collapse of the Terran Commonwealth, the Space you are exploring was known to Humanity, but the charts were lost, it is not impossible for you to come across evidence of previous human presence."}
+/obj/item/paper/memo/command/testing
+ name = "research testing complaints"
+ info = {"A growing stack of interdepartmental complaints from various members of the Engineering department concerning the repeated instances of explosives testing in the Science department aboard the ship. It heavily implies that should further occurances of damage to the Vessel take place, engineering staff may "cause bureaucratic barricades". A handwritten note at the bottom of the memo from the Chief of Security advises heavy handed legal consequences for those involved with testing in the event of future explosive related incidents to prevent "understandable yet annoying actions" from the engineering department in the form of more paperwork.."}
// supply memos
@@ -315,10 +330,6 @@
name = "in defense of the bar"
info = {"An "internal use only" memo sent from the Executive Officer on behalf of Expeditionary Command detailing that the service department does not need self-defense weapons, and any arguments to the contrary will be handled internally. A personal memo has been added; an underlined "STOP ASKING US" penned onto the page."}
-/obj/item/paper/memo/supply/officelocation
- name = "supply office location reminder"
- info = {"An "internal use only" memo issued to supply staff, reminding them that the supply office is to the aft of the hangar, not the fore, and that they should ensure they know the way to work."}
-
/obj/item/paper/memo/supply/shipping
name = "shipping report"
info = {"Some "internal use only" reports about the recent items coming and going from Expeditionary Corps vessels, with 70% of the orders being filed as replacement chemical cartridges."}
@@ -379,18 +390,30 @@
name = "radio damage complaint"
info = {"An "internal use only" report on complaints of garbled static emitting from radios during shifts with IPC crew members onboard. The report further goes onto state that when inquiring about this to IPC crew members on the radio, their radios would emit the same noises instead of getting a clear answer from them."}
-/obj/item/paper/memo/engineering/hulldamage
- name = "damage control report"
- info = {"An "internal use only" report on damages to the hull following the attack by the SFV Nathan Hale. It suggests that the repairs currently in place are temporary at best, and that the Torch will need hefty drydock maintenance before its next deep space mission. The report goes on to recommend petitioning EXO for additional funding for maintenance and upkeep."}
-
-/obj/item/paper/memo/engineering/tcommssabotage
- name = "damage control report"
- info = {"An "internal use only" report on damages to ship systems following the 5/14 sabotage incident. It suggests that the saboteur exploited a previously-unknown vulnerability in the ship's telecommunications systems to shut down long-range communications - the system will need a full inspection from DAIS management before it can be deemed properly secure again. How the saboteur discovered the exploit is still unknown."}
-
/obj/item/paper/memo/engineering/bsddamage
name = "\improper Bluespace drive safety notice"
info = {"A "confidential" memo from Krri'gli Engineering regarding the new Bluespace drive. It explains in very slow and simple language that this is a "Bluespace drive", a very expensive and volatile piece of machinery, and that you should not break this one or remove the exotic particle shielding. The author does not appear to have a very high opinion of human engineering or mental faculties."}
+/obj/item/paper/memo/engineering/maintventing
+ name = "venting complaint"
+ info = {"A "sensitive" memo from a formerly Enlisted contractor aboard the Torch. In somewhat colourful language it outlines how a single breach of the hull anywhere in the maintenance corridors will vent the entirety of the corridors on that side of the vessel. Attached are almost identical copies of the complaint, each filed exactly a year before the previous one, dating back to the Torch's refit in 2305."}
+
+/obj/item/paper/memo/engineering/researchbombs
+ name = "testing complaint"
+ info = {"A draft of an "internal use only" memo from the Chief Engineer about repeated instances of Researchers testing explosives in the Misc Lab, resulting in damage to the vessel's thruster fuel storage tank. It states that should this keep happening, legal action will need to be taken against those testing to prevent the engineering staff from 'drowning the system in paperwork'."}
+
+/obj/item/paper/memo/engineering/slowstart
+ name = "slow power setup"
+ info = {"An "internal use only" report on complaints about failures to meet Engine Startup standards has led to Torch maneuvers being delayed, power outages in critical areas of the ship, and damage going unrepaired due to power setup still being performed late in the shift. It goes on to recommend Engineering set up reliable power generation and distribution before undertaking any non-standard modifications."}
+
+/obj/item/paper/memo/engineering/obtusecomms
+ name = "obtuse radio communications"
+ info = {"An "internal use only" report on complaints about obtuse and confusing radio abbreviation and protocols created by members of Engineering. The writer goes on at great length how slowing comms down to use ridiculous abbreviations and shorthand is not helpful, and that nonstandard radio etiquette is not required due to the clarity and use-case of the Torch's communication suite. It asks Engineering to talk normally and use common shorthand, but it highlights the rising use of Non-ZAC communications on net with another, less lengthy complaint. The author ends by asking why their nickname is 'NUB'"}
+
+/obj/item/paper/memo/engineering/browsinghabits
+ name = "intranet browsing methods"
+ info = {"An "internal use only" memo sent from the Chief Engineer, regarding the use of the Torch's local intranet and the brief periods when the vessel is in range of access to the extranet. It notes that, while information is freely available online, that all of these queries are logged as a mandatory security measure, and unsubtly hints that some crew members are racking up increasingly alarming browsing habits. It notes some ranging from how to bootleg chemicals, how to create bombs or homemade firearms, to accessing Wetskrell during shift hours."}
+
// medical memos
@@ -496,8 +519,11 @@
/obj/item/paper/memo/exploration/pioneers
name = "pioneers and you"
- info = {"An "internal use only" memo detailing proper ettiquette for explorers interacting with Terran Pioneer Corps personnel. It stresses very heavily that yes, most Terrans do speak ZAC; no, you should not share your funny Pan-Slavic impression; and no, you should ABSOLUTELY not ask if they know any war criminals."}
+ info = {"An "internal use only" memo detailing proper ettiquette for explorers interacting with Confederate Pioneer Corps personnel. It stresses very heavily that yes, most Confederates do speak ZAC; no, you should not share your funny Pan-Slavic impression; and no, you should ABSOLUTELY not ask if they know any war criminals."}
+/obj/item/paper/memo/exploration/mice
+ name = "invasive species and shuttles"
+ info = {"Some "internal use only" documents that discuss the introduction of invasive species to terraformed or near-earth exoplanets through negligence and improper vermin control onboard spaceships. The document focuses almost exclusively on species that originate from Earth, with a highlight on Mice. Inspections of Hangar Bays, Landing Shuttles and Cargo is paramount to preventing an introduction of Invasive species. The author cites a report about the Charon landing while harboring an infestation of mice, and the ecological devastation that followed. "}
// research memos
@@ -565,7 +591,13 @@
name = "contractor safety and you"
info = {"An "internal use only" corporate document reminding corporate liaisons to report any unsafe behavior from contractors that they either see directly or is reported to them. It goes on to explain that ensuring the health and safety compliance of those under contract not only helps to keep up an image of security but ensures that the reputation of EXO as a whole is not tarnished due to a workplace accident."}
+/obj/item/paper/memo/corporate/legion
+ name = "internal communications"
+ info = {"A stack of "confidential" communications inside the EXO pertaining to the recent encounter with the 'Legion'. The almost unregulated panic among some of the discussions is quite clear, with the overall worry more focused on possible financial losses then danger to the SCG or SCG personnel."}
+/obj/item/paper/memo/corporate/miranda
+ name = "miranda line memo"
+ info = {"A "secret" memo from the EXO Head Office. It is somewhat lacking in specifics, but is quite clear that should the Torch locate any traces of human presence past the Miranda Line, that any involvement whatsoever of the EXO or its subsidiaries in the presence is to be denied."}
// security memos
@@ -612,3 +644,18 @@
/obj/item/paper/memo/security/extremism
name = "anti-radicalization pamphlet"
info = {"An "internal use only" document detailing strategies for identifying signs and risk factors for radicalization, created in light of perceived extremism in the SCGF. It discusses low self-esteem, stress, marginalization, repeat disciplinary issues, and excessive interest in weaponry."}
+
+
+/obj/item/paper/memo/security/useofforce
+ name = "use of force complaint"
+ info = {"An inter-departmental memo from the Chief Medical Officer to the Chief of Security and Brig Chief about the amount of detainees treated for injuries "far greater then would be needed" following their detainment. It has a quite graphic description of a crewmember who's legs were broken for simply walking away from a master at arms."}
+
+
+/obj/item/paper/memo/security/testing
+ name = "research testing notice"
+ info = {"An inter-departmental memo from the Chief Engineer, co-signed by the Seinor Enlisted Advisor conserning repeated instances of the research department testing explosive devices aboard the vessel. Attached is a copy of the vessel's SOP pertaining to research operations, with in big bold letters "Testing of any explosives with risk of penetrating the hull or causing mass destruction must be done at an away site." with a note that the testing aboard has repeatedly caused damage to the thruster fuel storage tank, and that engineering staff are 'prepared to file as much paperwork that is required'."}
+
+/obj/item/paper/memo/security/goodcomms
+ name = "security comm report"
+ info = {"An "internal use only" report created by mid-level EXO Security Officers, complimenting Torch for their effective, direct and information focused radio-communication. The author mentions an abbreviation table from years ago that is no longer used. It ends by gently reminding members that gossiping in person is fine, but not to do it in recorded rooms like interrogation."}
+
diff --git a/maps/torch/job/service_jobs.dm b/maps/torch/job/service_jobs.dm
index f73cda3d2c155..d21b75f02c2a5 100644
--- a/maps/torch/job/service_jobs.dm
+++ b/maps/torch/job/service_jobs.dm
@@ -61,7 +61,14 @@
/datum/mil_rank/fleet/o1,
/datum/mil_rank/fleet/o2,
/datum/mil_rank/ec/o1)
+<<<<<<< ours
min_skill = list(SKILL_BUREAUCRACY = SKILL_BASIC)
+=======
+ min_skill = list( // 1 point
+ SKILL_BUREAUCRACY = SKILL_BASIC, // 1 point
+ SKILL_WEAPONS = SKILL_UNSKILLED // Fleet chaplains may refuse weapon training
+ )
+>>>>>>> theirs
access = list(
access_morgue, access_chapel_office,
diff --git a/maps/torch/loadout/loadout_accessories.dm b/maps/torch/loadout/loadout_accessories.dm
index 20d4360f53728..23ac1a5c92e97 100644
--- a/maps/torch/loadout/loadout_accessories.dm
+++ b/maps/torch/loadout/loadout_accessories.dm
@@ -4,7 +4,7 @@
path = /obj/item/storage/medalbox/sol
cost = 6
allowed_branches = SOLGOV_BRANCHES
- flags = GEAR_HAS_NO_CUSTOMIZATION
+ flags = GEAR_HAS_NO_CUSTOMIZATION | GEAR_HAS_EXTENDED_DESCRIPTION
/datum/gear/accessory/solgov_award_military/New()
..()
@@ -24,7 +24,7 @@
description = "A selection of civilian awards awarded by the Sol Central Government."
path = /obj/item/storage/medalbox/sol
cost = 3
- flags = GEAR_HAS_NO_CUSTOMIZATION
+ flags = GEAR_HAS_NO_CUSTOMIZATION | GEAR_HAS_EXTENDED_DESCRIPTION
/datum/gear/accessory/solgov_award_civilian/New()
..()
@@ -166,6 +166,9 @@
/datum/gear/accessory/stethoscope
allowed_roles = STERILE_ROLES
+/datum/gear/accessory/stole
+ allowed_roles = list(/datum/job/chaplain)
+
/datum/gear/tactical/holster
allowed_roles = ARMED_ROLES
diff --git a/maps/torch/loadout/loadout_head.dm b/maps/torch/loadout/loadout_head.dm
index cf817571c10d3..896f5af767e8c 100644
--- a/maps/torch/loadout/loadout_head.dm
+++ b/maps/torch/loadout/loadout_head.dm
@@ -172,7 +172,7 @@
/datum/gear/tactical/armor_tag_corporate
- display_name = "Armor Tag Selection - Corporate Insignia"
+ display_name = "Armor Tag Selection - Faction Insignia"
path = /obj/item/clothing/accessory/armor_tag
flags = GEAR_HAS_NO_CUSTOMIZATION
@@ -182,4 +182,5 @@
var/list/options = list()
options["SAARE tag"] = /obj/item/clothing/accessory/armor_tag/saare
options["PCRC tag"] = /obj/item/clothing/accessory/armor_tag/pcrc
+ options["SFP tag"] = /obj/item/clothing/accessory/armor_tag/sfp
gear_tweaks += new /datum/gear_tweak/path (options)
diff --git a/maps/torch/loadout/loadout_suit.dm b/maps/torch/loadout/loadout_suit.dm
index 93198995ee2e1..5306f10ec891e 100644
--- a/maps/torch/loadout/loadout_suit.dm
+++ b/maps/torch/loadout/loadout_suit.dm
@@ -201,8 +201,8 @@
gear_tweaks += new/datum/gear_tweak/path(armors)
/datum/gear/suit/sfp
- display_name = "Agent's jacket"
- path = /obj/item/clothing/suit/storage/toggle/agent_jacket
+ display_name = "SFP agent jackets"
+ path = /obj/item/clothing/suit/storage
allowed_roles = list(
/datum/job/detective
)
@@ -211,6 +211,14 @@
)
flags = GEAR_HAS_NO_CUSTOMIZATION
+/datum/gear/suit/sfp/New()
+ ..()
+ var/list/options = list()
+ options["SFP leather jacket"] = /obj/item/clothing/suit/storage/toggle/agent_jacket
+ options["formal SFP jacket"] = /obj/item/clothing/suit/storage/toggle/agent_jacket/formal
+ options["SFP patrol cloak"] = /obj/item/clothing/suit/storage/agent_rain
+ gear_tweaks += new/datum/gear_tweak/path(options)
+
/datum/gear/suit/chest_rig/New()
allowed_roles = TECHNICAL_ROLES + SECURITY_ROLES + list(
/datum/job/doctor
diff --git a/maps/torch/robot/module_flying_surveyor.dm b/maps/torch/robot/module_flying_surveyor.dm
index c7542ab387b8d..ef23afb1747d5 100644
--- a/maps/torch/robot/module_flying_surveyor.dm
+++ b/maps/torch/robot/module_flying_surveyor.dm
@@ -2,8 +2,8 @@
name = "survey drone module"
display_name = "Surveyor"
channels = list(
- "Science" = TRUE,
- "Exploration" = TRUE
+ "Exploration" = TRUE,
+ "Science" = TRUE
)
networks = list(NETWORK_RESEARCH)
sprites = list(
diff --git a/maps/torch/structures/posters.dm b/maps/torch/structures/posters.dm
index 412b94e085826..bc9599aaaab67 100644
--- a/maps/torch/structures/posters.dm
+++ b/maps/torch/structures/posters.dm
@@ -10,7 +10,7 @@
/singleton/poster/torch/event1
icon_state="bsposter_event1"
name = "Justice for Joe"
- desc = "A hand-written poster demanding the release of one SCPO Joseph Tornakov from Fleet Intelligence custody. It's somewhat faded."
+ desc = "A hand-written poster demanding the release of one SCPO Joseph Tornakov from Fleet Intelligence custody. It's somewhat faded, and someone's drawn an impressive moustache on Tornakov in permanent marker. Someone has also written general anti-government statements written around the poster's fringes."
/singleton/poster/torch/event2
icon_state="bsposter_event2"
diff --git a/maps/torch/torch.dm b/maps/torch/torch.dm
index a1b5e3e9237ec..593a4dfdeccda 100644
--- a/maps/torch/torch.dm
+++ b/maps/torch/torch.dm
@@ -44,7 +44,6 @@
#include "datums/reports/corporate.dm"
#include "datums/reports/exploration.dm"
#include "datums/reports/medical.dm"
- #include "datums/reports/robotics.dm"
#include "datums/reports/science.dm"
#include "datums/reports/security.dm"
#include "datums/reports/solgov.dm"
diff --git a/maps/torch/torch2_deck4.dmm b/maps/torch/torch2_deck4.dmm
index 4d40373cc13a0..12c19ac7e95d3 100644
--- a/maps/torch/torch2_deck4.dmm
+++ b/maps/torch/torch2_deck4.dmm
@@ -12683,7 +12683,7 @@
/area/crew_quarters/lounge)
"Qu" = (
/obj/structure/table/standard,
-/obj/item/folder/envelope/dcorder,
+/obj/item/folder/envelope/preset/dcorder,
/turf/simulated/floor/tiled,
/area/quartermaster/deckchief)
"Qy" = (
@@ -12744,7 +12744,7 @@
/obj/random_multi/single_item/memo_research,
/obj/random_multi/single_item/memo_exploration,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/item/folder/envelope/exploorder,
+/obj/item/folder/envelope/preset/exploorder,
/turf/simulated/floor/tiled,
/area/command/pathfinder)
"QI" = (
diff --git a/maps/torch/torch3_deck3.dmm b/maps/torch/torch3_deck3.dmm
index cfe4de7d58b53..d6bc880cf5406 100644
--- a/maps/torch/torch3_deck3.dmm
+++ b/maps/torch/torch3_deck3.dmm
@@ -3215,7 +3215,7 @@
/obj/floor_decal/corner/grey/diagonal{
dir = 4
},
-/obj/item/material/kitchen/rollingpin{
+/obj/item/material/rollingpin{
pixel_x = 3
},
/obj/structure/table/marble,
@@ -3912,7 +3912,7 @@
pixel_x = 2;
pixel_y = 6
},
-/obj/item/folder/envelope/csorder,
+/obj/item/folder/envelope/preset/csorder,
/turf/simulated/floor/carpet/green,
/area/crew_quarters/chief_steward)
"iO" = (
@@ -9451,10 +9451,10 @@
/obj/machinery/light{
dir = 1
},
-/obj/structure/flora/pottedplant/flower,
/obj/machinery/alarm{
pixel_y = 24
},
+/obj/structure/filingcabinet,
/turf/simulated/floor/carpet/purple,
/area/chapel/office)
"wB" = (
@@ -10194,6 +10194,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 10
},
+/obj/machinery/hologram/holopad,
/turf/simulated/floor/carpet/purple,
/area/chapel/office)
"yC" = (
@@ -10485,7 +10486,7 @@
/turf/simulated/floor/tiled/dark,
/area/chapel/main)
"zx" = (
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/critical{
name = "south bump";
pixel_y = -28
},
@@ -12204,7 +12205,7 @@
/obj/decal/cleanable/dirt,
/obj/random/trash,
/obj/structure/table/marble,
-/obj/item/material/kitchen/rollingpin,
+/obj/item/material/rollingpin,
/obj/item/device/radio/intercom{
dir = 4;
pixel_x = -21
@@ -14752,7 +14753,7 @@
/turf/simulated/floor/tiled/white,
/area/crew_quarters/mess)
"Kp" = (
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/critical{
dir = 1;
name = "north bump";
pixel_y = 24
diff --git a/maps/torch/torch4_deck2.dmm b/maps/torch/torch4_deck2.dmm
index edd2c1bc8def3..d7c994318033c 100644
--- a/maps/torch/torch4_deck2.dmm
+++ b/maps/torch/torch4_deck2.dmm
@@ -3446,12 +3446,12 @@
d2 = 8;
icon_state = "4-8"
},
-/obj/machinery/door/airlock/hatch{
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/hatch/maintenance/bolted{
frequency = 1379;
- id_tag = "";
+ id_tag = "engine_exterior";
name = "Engine Airlock Exterior"
},
-/obj/machinery/door/firedoor,
/turf/simulated/floor/tiled/techfloor/grid,
/area/engineering/engine_room)
"gX" = (
@@ -4980,6 +4980,10 @@
dir = 8
},
/obj/floor_decal/industrial/outline/yellow,
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = -24
+ },
/turf/simulated/floor/tiled/steel_grid,
/area/engineering/engine_monitoring)
"kY" = (
@@ -4992,10 +4996,6 @@
/obj/item/clothing/glasses/meson,
/obj/item/clothing/glasses/meson,
/obj/floor_decal/industrial/outline/yellow,
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = 24
- },
/turf/simulated/floor/tiled/steel_grid,
/area/engineering/engine_monitoring)
"la" = (
@@ -5009,8 +5009,7 @@
},
/obj/floor_decal/industrial/outline/yellow,
/obj/machinery/firealarm{
- dir = 8;
- pixel_x = -24
+ pixel_y = 21
},
/turf/simulated/floor/tiled/techfloor/grid,
/area/engineering/engine_room)
@@ -5020,6 +5019,11 @@
dir = 5
},
/obj/floor_decal/industrial/outline/yellow,
+/obj/item/clothing/glasses/meson,
+/obj/item/clothing/glasses/meson,
+/obj/machinery/light/small{
+ dir = 1
+ },
/turf/simulated/floor/tiled/techfloor/grid,
/area/engineering/engine_room)
"le" = (
@@ -5315,12 +5319,12 @@
d2 = 8;
icon_state = "4-8"
},
-/obj/machinery/door/airlock/hatch{
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/hatch/maintenance/bolted{
frequency = 1379;
- id_tag = "";
+ id_tag = "engine_interior";
name = "Engine Airlock Interior"
},
-/obj/machinery/door/firedoor,
/turf/simulated/floor/tiled/techfloor/grid,
/area/engineering/engine_room)
"lQ" = (
@@ -5332,7 +5336,20 @@
/obj/floor_decal/industrial/warning{
dir = 10
},
-/obj/machinery/light/small,
+/obj/machinery/embedded_controller/radio/airlock/access_controller{
+ dir = 1;
+ id_tag = "engine_controller";
+ name = "Engine Room Access Controller";
+ pixel_y = -21;
+ req_access = list("ACCESS_ENGINE_EQUIP");
+ tag_exterior_door = "engine_exterior";
+ tag_interior_door = "engine_interior"
+ },
+/obj/machinery/access_button/airlock_interior{
+ master_tag = "engine_controller";
+ pixel_x = -23;
+ pixel_y = 23
+ },
/turf/simulated/floor/tiled/techfloor/grid,
/area/engineering/engine_room)
"lR" = (
@@ -5344,6 +5361,11 @@
/obj/floor_decal/industrial/warning{
dir = 6
},
+/obj/machinery/access_button/airlock_exterior{
+ master_tag = "engine_controller";
+ pixel_x = 23;
+ pixel_y = 23
+ },
/turf/simulated/floor/tiled/techfloor/grid,
/area/engineering/engine_room)
"lT" = (
@@ -5353,6 +5375,11 @@
d2 = 8;
icon_state = "2-8"
},
+/obj/machinery/access_button/airlock_exterior{
+ master_tag = "engine_controller";
+ pixel_x = -23;
+ pixel_y = 23
+ },
/turf/simulated/floor/tiled/techfloor,
/area/engineering/engine_room)
"lV" = (
@@ -5902,6 +5929,11 @@
d2 = 4;
icon_state = "1-4"
},
+/obj/machinery/access_button/airlock_interior{
+ master_tag = "engine_controller";
+ pixel_x = 23;
+ pixel_y = 23
+ },
/turf/simulated/floor/tiled/monotile,
/area/engineering/engine_monitoring)
"nw" = (
@@ -5914,7 +5946,8 @@
/area/engineering/engine_monitoring)
"nx" = (
/obj/structure/sign/warning/internals_required{
- name = "\improper RADIATION GEAR REQUIRED"
+ name = "\improper RADIATION GEAR REQUIRED";
+ pixel_y = 4
},
/turf/simulated/wall/r_wall/prepainted,
/area/engineering/engine_room)
diff --git a/maps/torch/torch5_deck1.dmm b/maps/torch/torch5_deck1.dmm
index 8133521349286..140bc9048936c 100644
--- a/maps/torch/torch5_deck1.dmm
+++ b/maps/torch/torch5_deck1.dmm
@@ -1495,7 +1495,7 @@
/turf/simulated/floor/tiled/techfloor,
/area/thruster/d1starboard)
"acY" = (
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/critical{
name = "south bump";
pixel_y = -28
},
@@ -9156,9 +9156,9 @@
/obj/structure/table/rack,
/obj/item/clothing/shoes/dutyboots,
/obj/item/clothing/accessory/storage/holster/thigh,
-/obj/item/clothing/glasses/tacgoggles,
/obj/item/clothing/suit/armor/pcarrier/medium/sol,
/obj/item/clothing/head/helmet,
+/obj/item/clothing/accessory/glassesmod/nvg,
/turf/simulated/floor/tiled/techfloor/grid,
/area/command/armoury/tactical)
"aEH" = (
@@ -10376,15 +10376,15 @@
/turf/simulated/wall/prepainted,
/area/maintenance/firstdeck/centralport)
"aKv" = (
-/obj/structure/table/rack,
/obj/floor_decal/industrial/outline/grey,
-/obj/item/storage/box/ammo/pistol,
-/obj/item/storage/box/ammo/pistol,
-/obj/item/storage/box/ammo/pistol,
-/obj/item/storage/box/ammo/pistol,
/obj/machinery/light{
dir = 1
},
+/obj/structure/table/steel,
+/obj/item/reagent_containers/food/snacks/toastedsandwich{
+ desc = "Discontinued after a slew of food poisoning related incidents following a failed attempt at using th'oom cheese, the beloved MRE Menu 9 grilled cheese is a well-sought after trophy for spacers and members of the Defense Forces alike.";
+ name = "special toasted sandwich"
+ },
/turf/simulated/floor/tiled/dark,
/area/security/armoury)
"aKw" = (
@@ -10830,10 +10830,8 @@
/obj/machinery/light{
dir = 1
},
-/obj/item/storage/box/ammo/pistol/rubber,
-/obj/item/storage/box/ammo/pistol/rubber,
-/obj/item/storage/box/ammo/pistol/rubber,
-/obj/item/storage/box/ammo/pistol/rubber,
+/obj/item/gun/energy/laser/xenofauna,
+/obj/item/gun/energy/laser/xenofauna,
/turf/simulated/floor/tiled/dark,
/area/security/secure_storage)
"aMD" = (
@@ -13058,7 +13056,7 @@
/turf/simulated/floor/tiled/techfloor,
/area/thruster/d1port)
"aTS" = (
-/obj/machinery/power/apc{
+/obj/machinery/power/apc/critical{
dir = 1;
name = "north bump";
pixel_y = 24
@@ -14020,13 +14018,15 @@
/turf/space,
/area/space)
"aWQ" = (
-/obj/structure/closet/secure_closet/guncabinet/sidearm,
/obj/machinery/power/apc{
name = "south bump";
pixel_y = -28
},
/obj/structure/cable/green,
/obj/floor_decal/industrial/outline/grey,
+/obj/structure/table/rack,
+/obj/item/storage/box/ammo/smg,
+/obj/item/storage/box/ammo/smg,
/turf/simulated/floor/tiled/dark,
/area/security/armoury)
"aXb" = (
@@ -14273,6 +14273,10 @@
d2 = 4;
icon_state = "2-4"
},
+/obj/structure/closet/secure_closet{
+ name = "Secure Evidence Locker";
+ req_access = list("ACCESS_SECURITY")
+ },
/turf/simulated/floor/plating,
/area/security/wing)
"bpA" = (
@@ -18296,10 +18300,10 @@
/obj/structure/table/rack,
/obj/item/clothing/shoes/dutyboots,
/obj/item/clothing/accessory/storage/holster/thigh,
-/obj/item/clothing/glasses/tacgoggles,
/obj/item/clothing/suit/armor/pcarrier/medium/sol,
/obj/item/clothing/head/helmet,
/obj/machinery/rotating_alarm/security_alarm,
+/obj/item/clothing/accessory/glassesmod/nvg,
/turf/simulated/floor/tiled/techfloor/grid,
/area/command/armoury/tactical)
"hrE" = (
@@ -21102,9 +21106,11 @@
/area/maintenance/substation/firstdeck)
"kSs" = (
/obj/structure/table/rack,
-/obj/item/gun/energy/ionrifle/small,
-/obj/item/gun/energy/ionrifle/small,
/obj/floor_decal/industrial/outline/grey,
+/obj/item/gun/projectile/shotgun/pump/empty,
+/obj/item/gun/projectile/shotgun/pump/empty,
+/obj/item/storage/box/ammo/beanbags,
+/obj/item/storage/box/ammo/beanbags,
/turf/simulated/floor/tiled/dark,
/area/security/secure_storage)
"kTb" = (
@@ -23916,10 +23922,8 @@
"ozG" = (
/obj/structure/table/rack,
/obj/floor_decal/industrial/outline/grey,
-/obj/item/storage/box/ammo/smg/rubber,
-/obj/item/storage/box/ammo/smg/rubber,
-/obj/item/storage/box/ammo/smg/rubber,
-/obj/item/storage/box/ammo/smg/rubber,
+/obj/item/storage/box/ammo/pistol/rubber,
+/obj/item/storage/box/ammo/pistol/rubber,
/turf/simulated/floor/tiled/dark,
/area/security/secure_storage)
"oAp" = (
@@ -24294,6 +24298,8 @@
/obj/item/gun/projectile/automatic/sec_smg/empty,
/obj/item/gun/projectile/automatic/sec_smg/empty,
/obj/item/gun/projectile/automatic/sec_smg/empty,
+/obj/item/storage/box/ammo/smg/rubber,
+/obj/item/storage/box/ammo/smg/rubber,
/turf/simulated/floor/tiled/dark,
/area/security/secure_storage)
"oXx" = (
@@ -24567,6 +24573,7 @@
"pud" = (
/obj/structure/table/steel,
/obj/floor_decal/industrial/outline/grey,
+/obj/machinery/recharger,
/turf/simulated/floor/tiled/techfloor,
/area/security/armoury)
"puw" = (
@@ -24629,12 +24636,10 @@
/turf/simulated/floor/plating,
/area/maintenance/firstdeck/aftport)
"pxv" = (
-/obj/structure/table/rack,
-/obj/item/storage/box/ammo/smg/rubber,
-/obj/item/storage/box/ammo/smg/rubber,
-/obj/item/storage/box/ammo/smg/rubber,
-/obj/item/storage/box/ammo/smg/rubber,
/obj/floor_decal/industrial/outline/grey,
+/obj/item/storage/box/ammo/pistol,
+/obj/item/storage/box/ammo/pistol,
+/obj/structure/table/rack,
/turf/simulated/floor/tiled/dark,
/area/security/armoury)
"pyb" = (
@@ -25990,8 +25995,6 @@
/area/rnd/xenobiology/xenoflora)
"rby" = (
/obj/structure/table/rack,
-/obj/item/gun/projectile/shotgun/pump/empty,
-/obj/item/gun/projectile/shotgun/pump/empty,
/obj/floor_decal/industrial/outline/grey,
/obj/machinery/rotating_alarm/security_alarm{
dir = 8
@@ -26000,6 +26003,8 @@
dir = 4
},
/obj/machinery/mech_recharger,
+/obj/item/gun/energy/ionrifle/small,
+/obj/item/gun/energy/ionrifle/small,
/turf/simulated/floor/tiled/dark,
/area/security/armoury)
"rcb" = (
@@ -26520,11 +26525,9 @@
/area/thruster/d1starboard)
"rEK" = (
/obj/structure/table/rack,
-/obj/item/storage/box/ammo/smg,
-/obj/item/storage/box/ammo/smg,
-/obj/item/storage/box/ammo/smg,
-/obj/item/storage/box/ammo/smg,
/obj/floor_decal/industrial/outline/grey,
+/obj/item/storage/box/ammo/stunshells,
+/obj/item/storage/box/ammo/stunshells,
/turf/simulated/floor/tiled/techfloor,
/area/security/armoury)
"rFb" = (
@@ -27478,10 +27481,11 @@
/turf/simulated/floor/tiled/freezer,
/area/rnd/xenobiology/xenoflora)
"sBg" = (
-/obj/structure/table/rack,
-/obj/item/storage/box/ammo/beanbags,
-/obj/item/storage/box/ammo/beanbags,
/obj/floor_decal/industrial/outline/grey,
+/obj/structure/closet/secure_closet{
+ name = "Secure Evidence Locker";
+ req_access = list("ACCESS_SECURITY")
+ },
/turf/simulated/floor/tiled/dark,
/area/security/armoury)
"sCb" = (
@@ -28697,13 +28701,11 @@
/turf/simulated/floor/plating,
/area/maintenance/firstdeck/aftport)
"uie" = (
-/obj/structure/table/rack,
/obj/floor_decal/industrial/outline/grey,
-/obj/item/storage/box/ammo/stunshells,
-/obj/item/storage/box/ammo/stunshells,
/obj/machinery/camera/network/security{
c_tag = "Security - Brig Secure Armory"
},
+/obj/structure/closet/secure_closet/guncabinet/sidearm,
/turf/simulated/floor/tiled/dark,
/area/security/armoury)
"uiY" = (
diff --git a/maps/torch/torch6_bridge.dmm b/maps/torch/torch6_bridge.dmm
index f44e672c6c2d9..6c56f55d182e1 100644
--- a/maps/torch/torch6_bridge.dmm
+++ b/maps/torch/torch6_bridge.dmm
@@ -1758,8 +1758,8 @@
/obj/structure/table/woodentable_reinforced/walnut,
/obj/random_multi/single_item/memo_command,
/obj/random_multi/single_item/memo_supply,
-/obj/item/folder/envelope/dcorder,
-/obj/item/folder/envelope/csorder,
+/obj/item/folder/envelope/preset/dcorder,
+/obj/item/folder/envelope/preset/csorder,
/turf/simulated/floor/wood/walnut,
/area/crew_quarters/heads/office/xo)
"de" = (
@@ -4197,7 +4197,7 @@
dir = 6
},
/obj/random_multi/single_item/memo_engineering,
-/obj/item/folder/envelope/ceorder,
+/obj/item/folder/envelope/preset/ceorder,
/turf/simulated/floor/tiled,
/area/crew_quarters/heads/office/ce)
"iU" = (
@@ -4899,7 +4899,7 @@
/obj/random_multi/single_item/memo_command,
/obj/random_multi/single_item/memo_supply,
/obj/random_multi/single_item/memo_medical,
-/obj/item/folder/envelope/ndaorder,
+/obj/item/folder/envelope/preset/ndaorder,
/obj/item/paper/immediateorder,
/turf/simulated/floor/tiled/dark,
/area/bridge)
@@ -5392,7 +5392,7 @@
/area/hallway/primary/bridge/aft)
"mT" = (
/obj/structure/table/woodentable/walnut,
-/obj/item/folder/envelope/cmdorder,
+/obj/item/folder/envelope/preset/cmdorder,
/turf/simulated/floor/wood/walnut,
/area/crew_quarters/heads/cobed)
"mV" = (
@@ -7711,7 +7711,7 @@
/obj/structure/noticeboard{
pixel_x = 32
},
-/obj/item/folder/envelope/cmdorder,
+/obj/item/folder/envelope/preset/cmdorder,
/turf/simulated/floor/wood/walnut,
/area/crew_quarters/heads/office/sgr)
"tC" = (
@@ -7970,7 +7970,7 @@
/obj/item/storage/secure/safe{
pixel_x = 36
},
-/obj/item/folder/envelope/rep,
+/obj/item/folder/envelope/preset/rep,
/obj/item/documents/scgr,
/turf/simulated/floor/wood/walnut,
/area/crew_quarters/heads/office/sgr)
@@ -8928,7 +8928,7 @@
},
/obj/item/stamp/cos,
/obj/random_multi/single_item/memo_security,
-/obj/item/folder/envelope/cosorder,
+/obj/item/folder/envelope/preset/cosorder,
/turf/simulated/floor/tiled/dark/monotile,
/area/crew_quarters/heads/office/cos)
"wD" = (
@@ -11116,7 +11116,7 @@
d2 = 4;
icon_state = "1-4"
},
-/obj/item/folder/envelope/lauletter1,
+/obj/item/folder/envelope/preset/lauletter1,
/turf/simulated/floor/carpet/blue,
/area/crew_quarters/heads/office/co)
"Fn" = (
@@ -12328,7 +12328,7 @@
/obj/floor_decal/corner/paleblue/diagonal,
/obj/structure/table/glass,
/obj/random_multi/single_item/memo_medical,
-/obj/item/folder/envelope/cmoorder,
+/obj/item/folder/envelope/preset/cmoorder,
/turf/simulated/floor/tiled/white,
/area/crew_quarters/heads/office/cmo)
"Kh" = (
@@ -12634,7 +12634,7 @@
/obj/floor_decal/corner/research{
dir = 5
},
-/obj/item/folder/envelope/exploorder,
+/obj/item/folder/envelope/preset/exploorder,
/turf/simulated/floor/tiled,
/area/crew_quarters/heads/office/rd)
"Lw" = (
@@ -12764,7 +12764,7 @@
/area/aquila/airlock)
"Mf" = (
/obj/structure/table/woodentable_reinforced/walnut/maple,
-/obj/item/folder/envelope/captain,
+/obj/item/folder/envelope/preset/captain,
/obj/random_multi/single_item/runtime,
/turf/simulated/floor/wood/walnut,
/area/crew_quarters/heads/office/co)
@@ -13289,7 +13289,7 @@
pixel_y = -4
},
/obj/item/hand_labeler,
-/obj/item/folder/envelope/clorder,
+/obj/item/folder/envelope/preset/clorder,
/turf/simulated/floor/carpet/green,
/area/crew_quarters/heads/office/cl/backroom)
"Ox" = (
diff --git a/maps/torch/torch_ranks.dm b/maps/torch/torch_ranks.dm
index d91760ff0e5fa..bd1451cd9fede 100644
--- a/maps/torch/torch_ranks.dm
+++ b/maps/torch/torch_ranks.dm
@@ -14,7 +14,8 @@
/datum/mil_branch/alien,
/datum/mil_branch/skrell_fleet,
/datum/mil_branch/iccgn,
- /datum/mil_branch/scga
+ /datum/mil_branch/scga,
+ /datum/mil_branch/auf
)
spawn_branch_types = list(
@@ -25,7 +26,8 @@
/datum/mil_branch/alien,
/datum/mil_branch/skrell_fleet,
/datum/mil_branch/iccgn,
- /datum/mil_branch/scga
+ /datum/mil_branch/scga,
+ /datum/mil_branch/auf
)
species_to_branch_blacklist = list(
@@ -121,7 +123,9 @@
/datum/mil_rank/ec/o1,
/datum/mil_rank/ec/o3,
/datum/mil_rank/ec/o5,
- /datum/mil_rank/ec/o6
+ /datum/mil_rank/ec/o6,
+ /datum/mil_rank/ec/o8,
+ /datum/mil_rank/ec/o10
)
spawn_rank_types = list(
@@ -230,20 +234,21 @@
/datum/mil_rank/sol/scientist
)
+//This variable returns decimal values for alt-ranks, but isn't player facing.
/datum/mil_rank/grade()
. = ..()
if(!sort_order)
return ""
- if(sort_order <= 10)
- return "E[sort_order]"
- return "O[sort_order - 10]"
+ if(sort_order <= 100)
+ return "E-[floor(sort_order / 10)]"
+ return "O-[floor((sort_order - 100) / 10)]"
// Within the scope of the Torch, this is the only necessary differentiation.
/datum/mil_rank/rank_category()
. = ..()
if(!sort_order)
return null
- if(sort_order <= 10)
+ if(sort_order <= 100)
return GET_SINGLETON(/singleton/rank_category/enlisted)
else
return GET_SINGLETON(/singleton/rank_category/commissioned)
@@ -264,145 +269,145 @@
name = "Crewman Recruit"
name_short = "CR"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted, /obj/item/clothing/accessory/solgov/specialty/enlisted)
- sort_order = 1
+ sort_order = 10
/datum/mil_rank/fleet/e2
name = "Crewman Apprentice"
name_short = "CA"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e2, /obj/item/clothing/accessory/solgov/specialty/enlisted)
- sort_order = 2
+ sort_order = 20
/datum/mil_rank/fleet/e3
name = "Crewman"
name_short = "CN"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e3, /obj/item/clothing/accessory/solgov/specialty/enlisted)
- sort_order = 3
+ sort_order = 30
/datum/mil_rank/fleet/e4
name = "Petty Officer Third Class"
name_short = "PO3"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e4, /obj/item/clothing/accessory/solgov/specialty/enlisted)
- sort_order = 4
+ sort_order = 40
/datum/mil_rank/fleet/e5
name = "Petty Officer Second Class"
name_short = "PO2"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e5, /obj/item/clothing/accessory/solgov/specialty/enlisted)
- sort_order = 5
+ sort_order = 50
/datum/mil_rank/fleet/e6
name = "Petty Officer First Class"
name_short = "PO1"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e6, /obj/item/clothing/accessory/solgov/specialty/enlisted)
- sort_order = 6
+ sort_order = 60
/datum/mil_rank/fleet/e7
name = "Chief Petty Officer"
name_short = "CPO"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e7, /obj/item/clothing/accessory/solgov/specialty/enlisted)
- sort_order = 7
+ sort_order = 70
/datum/mil_rank/fleet/e8
name = "Senior Chief Petty Officer"
name_short = "SCPO"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e8, /obj/item/clothing/accessory/solgov/specialty/enlisted)
- sort_order = 8
+ sort_order = 80
/datum/mil_rank/fleet/e9
name = "Master Chief Petty Officer"
name_short = "MCPO"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e9, /obj/item/clothing/accessory/solgov/specialty/enlisted)
- sort_order = 9
+ sort_order = 90
/datum/mil_rank/fleet/e9_alt1
name = "Command Master Chief Petty Officer"
name_short = "CMCPO"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e9_alt1, /obj/item/clothing/accessory/solgov/specialty/enlisted)
- sort_order = 9
+ sort_order = 91
/datum/mil_rank/fleet/e9_alt2
name = "Fleet Master Chief Petty Officer"
name_short = "FLTCM"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e9_alt2, /obj/item/clothing/accessory/solgov/specialty/enlisted)
- sort_order = 9
+ sort_order = 92
/datum/mil_rank/fleet/e9_alt3
name = "Force Master Chief Petty Officer"
name_short = "FORCM"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e9_alt3, /obj/item/clothing/accessory/solgov/specialty/enlisted)
- sort_order = 9
+ sort_order = 93
/datum/mil_rank/fleet/e9_alt4
name = "Master Chief Petty Officer of the Fleet"
name_short = "MCPOF"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/enlisted/e9_alt4, /obj/item/clothing/accessory/solgov/specialty/enlisted)
- sort_order = 9
+ sort_order = 94
/datum/mil_rank/fleet/o1
name = "Ensign"
name_short = "ENS"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/officer, /obj/item/clothing/accessory/solgov/specialty/officer)
- sort_order = 11
+ sort_order = 110
/datum/mil_rank/fleet/o2
name = "Sub-lieutenant"
name_short = "SLT"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/officer/o2, /obj/item/clothing/accessory/solgov/specialty/officer)
- sort_order = 12
+ sort_order = 120
/datum/mil_rank/fleet/o3
name = "Lieutenant"
name_short = "LT"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/officer/o3, /obj/item/clothing/accessory/solgov/specialty/officer)
- sort_order = 13
+ sort_order = 130
/datum/mil_rank/fleet/o4
name = "Lieutenant Commander"
name_short = "LCDR"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/officer/o4, /obj/item/clothing/accessory/solgov/specialty/officer)
- sort_order = 14
+ sort_order = 140
/datum/mil_rank/fleet/o5
name = "Commander"
name_short = "CDR"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/officer/o5, /obj/item/clothing/accessory/solgov/specialty/officer)
- sort_order = 15
+ sort_order = 150
/datum/mil_rank/fleet/o6
name = "Captain"
name_short = "CAPT"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/officer/o6, /obj/item/clothing/accessory/solgov/specialty/officer)
- sort_order = 16
+ sort_order = 160
/datum/mil_rank/fleet/o7
name = "Commodore"
name_short = "CDRE"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/flag, /obj/item/clothing/accessory/solgov/specialty/officer)
- sort_order = 17
+ sort_order = 170
/datum/mil_rank/fleet/o8
name = "Rear Admiral"
name_short = "RADM"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/flag/o8, /obj/item/clothing/accessory/solgov/specialty/officer)
- sort_order = 18
+ sort_order = 180
/datum/mil_rank/fleet/o9
name = "Vice Admiral"
name_short = "VADM"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/flag/o9, /obj/item/clothing/accessory/solgov/specialty/officer)
- sort_order = 19
+ sort_order = 190
/datum/mil_rank/fleet/o10
name = "Admiral"
name_short = "ADM"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/flag/o10, /obj/item/clothing/accessory/solgov/specialty/officer)
- sort_order = 20
+ sort_order = 200
/datum/mil_rank/fleet/o10_alt
name = "Fleet Admiral"
name_short = "FADM"
accessory = list(/obj/item/clothing/accessory/solgov/rank/fleet/flag/o10_alt, /obj/item/clothing/accessory/solgov/specialty/officer)
- sort_order = 20
+ sort_order = 201
/*
@@ -413,56 +418,61 @@
name = "Apprentice Explorer"
name_short = "AXPL"
accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/enlisted)
- sort_order = 1
+ sort_order = 10
/datum/mil_rank/ec/e3
name = "Explorer"
name_short = "XPL"
accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/enlisted/e3)
- sort_order = 3
+ sort_order = 30
/datum/mil_rank/ec/e5
name = "Senior Explorer"
name_short = "SXPL"
accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/enlisted/e5)
- sort_order = 5
+ sort_order = 50
/datum/mil_rank/ec/e7
name = "Chief Explorer"
name_short = "CXPL"
accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/enlisted/e7)
- sort_order = 7
+ sort_order = 70
/datum/mil_rank/ec/o1
name = "Ensign"
name_short = "ENS"
accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/officer)
- sort_order = 11
+ sort_order = 110
/datum/mil_rank/ec/o3
name = "Lieutenant"
name_short = "LT"
accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/officer/o3)
- sort_order = 13
+ sort_order = 130
/datum/mil_rank/ec/o5
name = "Commander"
name_short = "CDR"
accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/officer/o5)
- sort_order = 15
+ sort_order = 150
/datum/mil_rank/ec/o6
name = "Captain"
name_short = "CAPT"
accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/officer/o6)
- sort_order = 16
+ sort_order = 160
/datum/mil_rank/ec/o8
name = "Admiral"
name_short = "ADM"
accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/officer/o8)
- sort_order = 18
+ sort_order = 180
+/datum/mil_rank/ec/o10
+ name = "Commandant of the Expeditionary Corps"
+ name_short = "CMDT"
+ accessory = list(/obj/item/clothing/accessory/solgov/rank/ec/officer/o10)
+ sort_order = 200
/*
* Civilians
diff --git a/maps/torch/z1_admin.dmm b/maps/torch/z1_admin.dmm
index 9dc861af4e421..4dbcd1a6c50c6 100644
--- a/maps/torch/z1_admin.dmm
+++ b/maps/torch/z1_admin.dmm
@@ -2832,7 +2832,7 @@
"avz" = (
/obj/structure/table/standard,
/obj/random/donkpocket_box,
-/obj/item/material/kitchen/rollingpin,
+/obj/item/material/rollingpin,
/turf/unsimulated/floor{
icon_state = "white"
},
diff --git a/mods/RnD/code/experiment.dm b/mods/RnD/code/experiment.dm
index ad1a08c726a0b..8e4f5cd713a74 100644
--- a/mods/RnD/code/experiment.dm
+++ b/mods/RnD/code/experiment.dm
@@ -255,6 +255,7 @@ var/global/list/rnd_server_list = list()
reward = artefacts.rnd_points
points += reward
saved_small_artefacts += artefacts
+ SSanom.earned_rnd_points += reward
for(var/obj/item/small_artefact_scan_disk/input_disk in I.scanned_urm_interactions)
if(input_disk.interaction_id in saved_urm_interactions)
continue
diff --git a/mods/_maps/ascent_caulship/code/ascent_caulship_jobs.dm b/mods/_maps/ascent_caulship/code/ascent_caulship_jobs.dm
index aa27c9111b148..f9cc736bb51c1 100644
--- a/mods/_maps/ascent_caulship/code/ascent_caulship_jobs.dm
+++ b/mods/_maps/ascent_caulship/code/ascent_caulship_jobs.dm
@@ -5,7 +5,7 @@
return
/mob/living/carbon/human/proc/gyne_rename_lineage()
- set name = "Name Nest-Lineage"
+ set name = "Name Nest-Lineage — Caulship"
set category = "IC"
set desc = "Rename yourself and your alates."
@@ -45,7 +45,7 @@
verbs -= /mob/living/carbon/human/proc/gyne_rename_lineage
/mob/living/carbon/human/proc/serpentid_namepick()
- set name = "Choose a name"
+ set name = "Choose a name — Caulship"
set category = "IC"
set desc = "Rename yourself."
@@ -184,7 +184,7 @@
/datum/job/submap/ascent/queen
title = "Serpentid Queen"
- supervisors = "the Gyne"
+ supervisors = "the Gyne"
total_positions = 1
info = "You are a Monarch Serpentid Queen living on an independant Ascent vessel. Assist the Gyne in her duties and tend to your Workers."
outfit_type = /singleton/hierarchy/outfit/job/ascent/queen
diff --git a/mods/_maps/ascent_seedship/code/ascent_seedship_jobs.dm b/mods/_maps/ascent_seedship/code/ascent_seedship_jobs.dm
index 85e38e2db4b9e..0b37131054867 100644
--- a/mods/_maps/ascent_seedship/code/ascent_seedship_jobs.dm
+++ b/mods/_maps/ascent_seedship/code/ascent_seedship_jobs.dm
@@ -5,8 +5,8 @@
return
// Rename procs are already implemented in Ascent Caulship
-/* /mob/living/carbon/human/proc/gyne_rename_lineage_inf()
- set name = "Name Nest-Lineage"
+/mob/living/carbon/human/proc/gyne_rename_lineage_inf()
+ set name = "Name Nest-Lineage — Seedship"
set category = "IC"
set desc = "Rename yourself and your alates."
@@ -46,13 +46,13 @@
verbs -= /mob/living/carbon/human/proc/gyne_rename_lineage_inf
/mob/living/carbon/human/proc/serpentid_namepick_inf()
- set name = "Choose a name"
+ set name = "Choose a name — Seedship"
set category = "IC"
set desc = "Rename yourself."
- if(mind && istype(mind.assigned_job, /datum/job/submap/ascent))
- var/datum/job/submap/ascent/ascent_job = mind.assigned_job
- var/datum/submap/ascent/cutter = ascent_job.owner
+ if(mind && istype(mind.assigned_job, /datum/job/submap/ascent_inf))
+ var/datum/job/submap/ascent_inf/ascent_job = mind.assigned_job
+ var/datum/submap/ascent_inf/cutter = ascent_job.owner
if(istype(cutter))
if(!mind || mind.assigned_job != ascent_job)
return
@@ -70,7 +70,7 @@
return
fully_replace_character_name("[new_name]")
- verbs -= /mob/living/carbon/human/proc/serpentid_namepick_inf */
+ verbs -= /mob/living/carbon/human/proc/serpentid_namepick_inf
// Jobs.
/datum/job/submap/ascent_inf
@@ -79,11 +79,10 @@
allowed_ranks = list(/datum/mil_rank/alien)
total_positions = 1
supervisors = "youself"
- info = "You are Gyna on your own independent vessel. Your path has led you to this remote sector full of primitive bioforms. \
+ info = "Вы Кхармаани Гиина на вашем независимом корабле. Твой путь привел тебя к этим землям, насыщенными низшими формами жизни. \
\
- Show everyone your greatness, crush all those who dare to oppose you, establish your new nest here and bring prosperity to your lineage. \
- Your radars picked up a large ship equipped with a bluespace engine, until you find out who owns it, it's better not to give yourself away with vigorous activity. \
- Your ship was damaged during the bluespace jump, you need to restore it to fully function."
+ Покажи всем свое величие, распространи свой улей в этом секторе, приготовься к очередному приступу размножения и укрепи тут свою власть. \
+ Твои радары показали, что в этом секторе присутствует огромный корабль с скрелльским блюспейс двигателем на борту. Нападение на этот корабль, может привести к еще одной войной со скреллами"
outfit_type = /singleton/hierarchy/outfit/job/ascent
blacklisted_species = null
whitelisted_species = list(SPECIES_MANTID_GYNE)
@@ -111,23 +110,23 @@
if(!cutter.gyne_name)
cutter.gyne_name = TYPE_PROC_REF(/singleton/cultural_info/culture/ascent, create_gyne_name)
-
+
if(set_species_on_join)
H.set_species(set_species_on_join)
switch(H.species.name)
if(SPECIES_MANTID_GYNE)
H.real_name = "[random_id(/datum/species/mantid, 1, 99)] [cutter.gyne_name]"
- H.verbs |= /mob/living/carbon/human/proc/gyne_rename_lineage
+ H.verbs |= /mob/living/carbon/human/proc/gyne_rename_lineage_inf
if(SPECIES_MANTID_ALATE)
var/new_alate_number = is_species_whitelisted(H, SPECIES_MANTID_GYNE) ? random_id(/datum/species/mantid, 1000, 9999) : random_id(/datum/species/mantid, 10000, 99999)
H.real_name = "[new_alate_number] [cutter.gyne_name]"
if(SPECIES_MONARCH_WORKER)
H.real_name = "[TYPE_PROC_REF(/singleton/cultural_info/culture/ascent, create_worker_name)]"
- H.verbs |= /mob/living/carbon/human/proc/serpentid_namepick
+ H.verbs |= /mob/living/carbon/human/proc/serpentid_namepick_inf
if(SPECIES_MONARCH_QUEEN)
H.real_name = "["Queen "][TYPE_PROC_REF(/singleton/cultural_info/culture/ascent, create_queen_name)]"
- H.verbs |= /mob/living/carbon/human/proc/serpentid_namepick
+ H.verbs |= /mob/living/carbon/human/proc/serpentid_namepick_inf
H.name = H.real_name
if(H.mind)
H.mind.name = H.real_name
@@ -147,8 +146,8 @@
/datum/job/submap/ascent_inf/alate
title = "Ascent alate"
total_positions = 3
- supervisors = "your Gyne"
- info = "You are an Alate of an independent Ascent vessel. Your Gyne has directed you to this remote sector full of crawling primitives. Follow her instructions and bring prosperity to your nest-lineage."
+ supervisors = "Гиине"
+ info = "Ты Кхармаани Алат независимого корабля Восхождения. Гиина направила вас в этот сектор, полный ползущих примитивов. Верь в нее, до конца своей жизни и возведи новое гнездо, чтобы стать подобным ей или слится с ее телом."
outfit_type = /singleton/hierarchy/outfit/job/ascent/attendant
whitelisted_species = list(SPECIES_MANTID_ALATE)
requires_supervisor = "Ascent gyne"
@@ -160,9 +159,9 @@
/datum/job/submap/ascent_inf/drone
title = "Ascent drone"
- supervisors = "your Gyne"
+ supervisors = "Гиине"
total_positions = 1
- info = "You are a Machine Intelligence of an independent Ascent vessel. The Gyne you assist, and her children, have wandered into this sector full of primitive bioforms. Try to keep them alive, and assist where you can."
+ info = "Ты дрон Контролирущего Разума на отдаленном секторе. Гиина, направила вас с ее выводком, в этот сектор, полным примитивных созданий. Постарайся сохранить им жизнь и помочь во всем, чем можешь."
set_species_on_join = /mob/living/silicon/robot/flying/ascent
requires_supervisor = "Ascent gyne"
whitelisted_species = list(SPECIES_MANTID_ALATE)
@@ -171,8 +170,8 @@
title = "Serpentid adjunct"
supervisors = "вашей Королевой"
total_positions = 3
- info = "You are a Monarch Serpentid Worker serving as an attendant to your Queen on this vessel. Serve her however she requires."
- whitelisted_species = list(SPECIES_NABBER, SPECIES_MANTID_ALATE)
+ info = "Ты Серпентид-Монарх Рабочий, который служит своей королеве. Услужи ей и не заставь стыдится за тебя."
+ whitelisted_species = list(SPECIES_MANTID_ALATE, SPECIES_NABBER)
set_species_on_join = SPECIES_MONARCH_WORKER
outfit_type = /singleton/hierarchy/outfit/job/ascent/worker
min_skill = list(SKILL_EVA = SKILL_TRAINED,
@@ -186,9 +185,10 @@
title = "Serpentid queen"
supervisors = "другими Королевами и Гииной"
total_positions = 1
- info = "You are a Monarch Serpentid Queen living on an independant Ascent vessel. Assist the Gyne in her duties and tend to your Workers."
+ info = "Ты СМ-Королева, на независимом корабле Восхождения. Твоя родственная душа, Гиина, надеется на тебя и твоих прислуг."
whitelisted_species = list(SPECIES_NABBER, SPECIES_MANTID_GYNE)
set_species_on_join = SPECIES_MONARCH_QUEEN
+ outfit_type = /singleton/hierarchy/outfit/job/ascent/queen
min_skill = list(SKILL_EVA = SKILL_TRAINED,
SKILL_HAULING = SKILL_TRAINED,
SKILL_COMBAT = SKILL_TRAINED,
diff --git a/mods/_maps/ascent_seedship/code/ascent_seedship_shuttles.dm b/mods/_maps/ascent_seedship/code/ascent_seedship_shuttles.dm
index 3c05dd2d23b69..5b9aeba7e172a 100644
--- a/mods/_maps/ascent_seedship/code/ascent_seedship_shuttles.dm
+++ b/mods/_maps/ascent_seedship/code/ascent_seedship_shuttles.dm
@@ -73,6 +73,7 @@
/datum/shuttle/autodock/overmap/ascent_inf/two
name = "Lepidopterax"
warmup_time = 5
+ current_location = "nav_hangar_ascent_inf_two"
range = 2
dock_target = "ascent_inf_starboard"
shuttle_area = /area/ship/ascent_inf/shuttle_starboard
diff --git a/mods/_maps/ascent_seedship/maps/ascent_seedship.dmm b/mods/_maps/ascent_seedship/maps/ascent_seedship.dmm
index d462fa350cde6..7182dfdeba367 100644
--- a/mods/_maps/ascent_seedship/maps/ascent_seedship.dmm
+++ b/mods/_maps/ascent_seedship/maps/ascent_seedship.dmm
@@ -13,13 +13,13 @@
"aU" = (/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
"aV" = (/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"bf" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
-"bi" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/machinery/alarm/ascent{dir = 8; pixel_x = 24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_spike)
+"bi" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/machinery/alarm/ascent{dir = 8; pixel_x = 24},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_spike)
"bl" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"bx" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_hallway)
"bE" = (/obj/machinery/computer/ship/engines/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"bI" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard)
"bP" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
-"bR" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/space,/area/ship/ascent_inf/fore_starboard_spike)
+"bR" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_spike)
"bU" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"bY" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
"ca" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
@@ -27,7 +27,7 @@
"cg" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"cw" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{id_tag = "ascent_inf_port_pump"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"cy" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/aft_starboard_jut)
-"cA" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
+"cA" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"cB" = (/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation)
"cH" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/engineering)
"cJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard)
@@ -36,13 +36,14 @@
"da" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 1; id_tag = "ascent_inf_starboard_pump"},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"dg" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"dj" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
-"dk" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
-"ds" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
+"dk" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
+"ds" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
"dv" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
+"dA" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 8; frequency = 1331; id_tag = "ascent_inf_starboard_dock_left"; pixel_x = 20; pixel_y = 0; tag_airpump = "ascent_inf_shuttle_starboard_vent_inner"; tag_chamber_sensor = "ascent_inf_shuttle_starboard_interior_sensor"; tag_exterior_door = "ascent_inf_dock_starboard_external"; tag_interior_door = "ascent_inf_dock_starboard_internal"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
"dD" = (/obj/machinery/recharge_station/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
"dF" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"dH" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
-"dO" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/storage/box/syringes{pixel_y = 5},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_spike)
+"dO" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/storage/box/syringes{pixel_y = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_spike)
"dP" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation)
"dQ" = (/obj/structure/table/steel_reinforced/ascent,/obj/machinery/computer/mining{color = "PURPLE"; name = "distributor control"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
"dS" = (/turf/simulated/wall/r_titanium/ascent,/area/ship/ascent_inf/shuttle_starboard)
@@ -53,7 +54,7 @@
"eq" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/fore_port_prow)
"er" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"ex" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_spike)
-"eG" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
+"eG" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"eK" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
"eM" = (/obj/structure/hygiene/sink/ascent{pixel_y = -13},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_spike)
"eQ" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/inflatable_dispenser/ascents,/obj/item/clustertool,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
@@ -65,7 +66,7 @@
"fN" = (/obj/structure/table/rack/ascent,/obj/item/stack/cable_coil/cyan,/obj/item/stack/cable_coil/cyan,/obj/item/stack/cable_coil/cyan,/obj/item/stack/cable_coil/cyan,/obj/item/stack/cable_coil/cyan,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"fQ" = (/obj/structure/cable/cyan,/obj/machinery/power/terminal{dir = 8},/obj/structure/window/boron_reinforced,/obj/structure/window/boron_reinforced{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"fV" = (/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow)
-"fX" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/storage/box/autoinjectors{pixel_y = 5},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_spike)
+"fX" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/storage/box/autoinjectors{pixel_y = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_spike)
"gm" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external/bolted/ascent{airlock_type = "Internal"; frequency = 1331; id_tag = "ascent_inf_dock_starboard_internal"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
"gn" = (/obj/machinery/ion_engine,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"gw" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 1; id_tag = "ascent_inf_seedship_fore_pumps"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_hallway)
@@ -87,27 +88,27 @@
"hG" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"hM" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"hO" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard)
-"ig" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/aft_starboard_jut)
+"ig" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
"ih" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port)
"ij" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port)
-"ik" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/obj/overmap/visitable/ship/ascent_seedship_inf,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
+"ik" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/obj/overmap/visitable/ship/ascent_seedship_inf,/obj/submap_landmark/joinable_submap/ascent_seedship_inf,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"ip" = (/obj/machinery/computer/ship/navigation/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard)
"it" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/ascent,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
"iu" = (/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc/hyper/ascent/west,/obj/structure/hygiene/sink/ascent{dir = 1; icon_state = "sink"; pixel_y = 28},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"iv" = (/obj/structure/cable/cyan,/obj/machinery/power/smes/buildable/preset/ascent,/obj/structure/window/boron_reinforced,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"iC" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{id_tag = "ascent_inf_shuttle_starboard_vent_inner"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
-"iR" = (/obj/machinery/body_scanconsole/ascent{dir = 2},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
+"iR" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"iY" = (/obj/machinery/bodyscanner/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
"je" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/structure/bed/chair/padded/purple/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
-"jq" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
+"jq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
"jF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_jut)
"jK" = (/obj/machinery/atmospherics/omni/mixer,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"jO" = (/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
"jP" = (/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/aft_starboard_jut)
-"jR" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_x = -5; pixel_y = 1},/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_y = 2; pixel_x = 2},/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_y = -4; pixel_x = 6},/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_y = -4; pixel_x = -1},/obj/item/storage/bag/trash/purple/ascent{pixel_x = -9},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_spike)
+"jR" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_x = -5; pixel_y = 1},/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_y = 2; pixel_x = 2},/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_y = -4; pixel_x = 6},/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube{pixel_y = -4; pixel_x = -1},/obj/item/storage/bag/trash/purple/ascent{pixel_x = -9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_spike)
"jW" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"kc" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_port_dock_outer"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
-"kd" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
+"kd" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"ke" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"kg" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/stack/nanopaste,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard)
"ko" = (/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
@@ -129,8 +130,8 @@
"lp" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/airlock/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"lr" = (/obj/machinery/computer/ship/sensors/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"lx" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard)
-"lA" = (/obj/machinery/sleeper/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
-"lF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard)
+"lA" = (/obj/machinery/sleeper/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
+"lF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
"lH" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
"lI" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"lQ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/structure/window/boron_reinforced{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/engineering)
@@ -149,22 +150,22 @@
"nd" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/fore_starboard_spike)
"nf" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"nj" = (/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/machinery/power/apc/hyper/ascent/north,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port)
-"ns" = (/obj/machinery/chem_master{color = "PURPLE"; name = "chemical analyzer"},/obj/item/reagent_containers/dropper{pixel_x = -3; pixel_y = -5},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
+"ns" = (/obj/machinery/chem_master{color = "PURPLE"; name = "chemical analyzer"},/obj/item/reagent_containers/dropper{pixel_x = -3; pixel_y = -5},/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
"nt" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"nv" = (/obj/machinery/atmospherics/omni/mixer,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port)
"nB" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"nS" = (/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow)
"od" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"oi" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
-"ox" = (/obj/structure/cable/cyan{icon_state = "0-4"},/obj/machinery/power/apc/hyper/ascent/north,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard)
+"ox" = (/obj/structure/cable/cyan{icon_state = "0-4"},/obj/machinery/power/apc/hyper/ascent/north,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
"oA" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
"oE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"oJ" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
"oN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
"oP" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
-"oR" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/space,/area/ship/ascent_inf/fore_port_spike)
+"oR" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
"oU" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
-"oY" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "ascent_inf_starboard"; pixel_y = -24},/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard)
+"oY" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/obj/machinery/light/ascent,/obj/machinery/embedded_controller/radio/airlock/docking_port{cycle_to_external_air = 1; dir = 1; frequency = 1331; id_tag = "ascent_inf_starboard_upper"; pixel_y = -27; req_access = list("ACCESS_ASCENT"); tag_exterior_sensor = "ascent_inf_starboard_sensor"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard)
"pe" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port)
"pf" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"pj" = (/obj/structure/cable/cyan{icon_state = "0-2"},/obj/machinery/power/smes/buildable/preset/ascent,/obj/structure/window/boron_reinforced{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
@@ -172,6 +173,7 @@
"po" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_jut)
"pq" = (/obj/machinery/computer/ship/engines/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"px" = (/obj/structure/table/rack/ascent,/obj/item/device/multitool/mantid,/obj/item/device/multitool/mantid,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
+"pz" = (/obj/structure/table/rack/dark,/obj/item/tank/mantid/methyl_bromide,/obj/structure/cable/cyan{icon_state = "0-8"},/obj/machinery/power/apc/hyper/ascent/south,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge)
"pE" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
"pG" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge)
"pM" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
@@ -181,13 +183,13 @@
"pS" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"pW" = (/obj/structure/table/rack/ascent,/obj/item/stack/medical/splint,/obj/item/stack/medical/splint,/obj/item/stack/medical/splint,/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
"pX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
-"pY" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard)
+"pY" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
"qc" = (/obj/machinery/hologram/holopad/longrange/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard)
"qg" = (/obj/structure/bed/chair/padded/purple/ascent/gyne,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow)
"qj" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"qr" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
"qs" = (/obj/structure/bed/chair/padded/purple/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow)
-"qA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
+"qA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_prow)
"qL" = (/obj/structure/table/rack/dark,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
"qN" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/fore_starboard_jut)
"qZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
@@ -205,26 +207,26 @@
"sh" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_jut)
"si" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"so" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/habitation)
-"st" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
+"st" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"su" = (/obj/machinery/alarm/ascent{dir = 1; pixel_y = -24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway)
"sv" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 2; id_tag = "ascent_inf_starboard_pump_out_internal"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"sx" = (/obj/machinery/computer/ship/helm/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
-"sy" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_spike)
+"sy" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_spike)
"sA" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
"sH" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"sL" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard)
-"sQ" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/rpd,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
+"sQ" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/rpd,/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"sY" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 1; id_tag = "ascent_inf_starboard_pump"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"ta" = (/obj/structure/table/steel_reinforced/ascent,/obj/machinery/computer/mining{color = "PURPLE"; name = "compression dynamo control"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
"tg" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
-"th" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow)
+"th" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"ti" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_dock_starboard_external"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
"tv" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
"ty" = (/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4; icon_state = "intact"},/turf/simulated/wall/r_titanium/ascent,/area/ship/ascent_inf/shuttle_starboard)
"tC" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"tD" = (/obj/structure/table/rack/ascent,/obj/item/storage/ore{color = "PURPLE"; name = "mineral carrier"; pixel_y = 7},/obj/item/storage/ore{color = "PURPLE"; name = "mineral carrier"; pixel_y = 3},/obj/item/storage/ore{color = "PURPLE"; name = "mineral carrier"; pixel_y = -1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
"tF" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
-"tM" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
+"tM" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"tN" = (/obj/structure/window/boron_reinforced{dir = 1},/obj/structure/window/boron_reinforced{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"tO" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow)
"tP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
@@ -241,25 +243,25 @@
"uO" = (/obj/structure/cable/cyan{icon_state = "0-4"},/obj/machinery/power/terminal{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"uQ" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"uR" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
-"vy" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/obj/structure/mopbucket/ascent,/obj/item/mop/advanced/ascent,/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_spike)
+"vy" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/obj/structure/mopbucket/ascent,/obj/item/mop/advanced/ascent,/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_spike)
"vA" = (/obj/structure/table/rack/ascent,/obj/item/robot_parts/robot_component/diagnosis_unit,/obj/item/robot_parts/robot_component/diagnosis_unit,/obj/item/robot_parts/robot_component/diagnosis_unit,/obj/item/robot_parts/robot_component/diagnosis_unit,/obj/item/robot_parts/robot_component/diagnosis_unit,/obj/item/robot_parts/robot_component/actuator,/obj/item/robot_parts/robot_component/actuator,/obj/item/robot_parts/robot_component/actuator,/obj/item/robot_parts/robot_component/actuator,/obj/item/robot_parts/robot_component/actuator,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard)
"vF" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"vM" = (/obj/machinery/computer/ship/sensors/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard)
"vP" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
-"vS" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
+"vS" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"vT" = (/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc/hyper/ascent/south,/obj/structure/table/rack/ascent,/obj/item/storage/bag/trash/purple/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard)
"we" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation)
"wk" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 1; id_tag = "ascent_inf_port_dock_pump"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"wo" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 1; id_tag = "ascent_inf_port_dock_pump"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"wu" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/machinery/door/airlock/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
-"wx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
+"wx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"wz" = (/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc/hyper/ascent/south,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_spike)
"wI" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation)
"wJ" = (/obj/structure/hygiene/shower/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway)
"wL" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/access_button/airlock_interior{frequency = 1331; master_tag = "ascent_inf_seedship_fore_dock_controller"; pixel_x = -4; pixel_y = 24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway)
"wP" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9},/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"wR" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
-"wT" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/stack/material/glass/reinforced/fifty{pixel_x = 4; pixel_y = 5},/obj/item/stack/material/glass/fifty{pixel_x = -4; pixel_y = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
+"wT" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/stack/material/glass/reinforced/fifty{pixel_x = 4; pixel_y = 5},/obj/item/stack/material/glass/fifty{pixel_x = -4; pixel_y = 5},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"wU" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
"wV" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_spike)
"xc" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
@@ -291,7 +293,7 @@
"zd" = (/obj/machinery/ion_engine{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"zi" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard)
"zj" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
-"zk" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow)
+"zk" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 8; frequency = 1331; id_tag = "ascent_inf_port_dock_left"; pixel_x = 20; pixel_y = 0; tag_airpump = "ascent_inf_port_dock_pump"; tag_chamber_sensor = "ascent_inf_port_dock_sensor"; tag_exterior_door = "ascent_inf_port_dock_outer"; tag_interior_door = "ascent_inf_port_dock_inner"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"zn" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"zr" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"zw" = (/obj/structure/table/steel_reinforced/ascent,/obj/machinery/reagent_temperature{color = "PURPLE"; name = "reactant boiler"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
@@ -302,7 +304,7 @@
"zQ" = (/obj/machinery/reagentgrinder{color = "PURPLE"; name = "reactant obliterator"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
"zX" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port)
"Ac" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
-"Ae" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/bed/chair/padded/purple/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
+"Ae" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/bed/chair/padded/purple/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"Ag" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/hydroponics_port)
"Al" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm/ascent{dir = 4; pixel_x = -24},/obj/machinery/computer/ship/navigation/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"An" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_hallway)
@@ -310,18 +312,18 @@
"Av" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"Ay" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
"AC" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/engineering)
-"AH" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
+"AH" = (/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow)
"AO" = (/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge)
"AS" = (/obj/structure/bed/chair/padded/purple/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
"AT" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port)
"AU" = (/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"AV" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{id_tag = "ascent_inf_seedship_fore_pumps"},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_hallway)
-"Bb" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge)
+"Bb" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 1},/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"Bc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"Bd" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"Bf" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"Bh" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
-"Bs" = (/obj/submap_landmark/spawnpoint/ascent_seedship_inf/drone,/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/wing_starboard)
+"Bs" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge)
"BB" = (/obj/machinery/shipsensors,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"BF" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/obj/structure/closet/crate/freezer/meat/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway)
"BL" = (/obj/structure/table/steel_reinforced/ascent,/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
@@ -331,7 +333,7 @@
"BR" = (/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard)
"BV" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "ascent_inf_shuttle_starboard_interior_sensor"; pixel_x = -8; pixel_y = -24},/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
"Ce" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
-"Co" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 4; frequency = 1331; id_tag = "ascent_inf_starboard_dock"; pixel_x = -20; pixel_y = 0; tag_airpump = "ascent_inf_shuttle_starboard_vent_inner"; tag_chamber_sensor = "ascent_inf_shuttle_starboard_interior_sensor"; tag_exterior_door = "ascent_inf_dock_starboard_external"; tag_interior_door = "ascent_inf_dock_starboard_internal"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard)
+"Co" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 4; frequency = 1331; id_tag = "ascent_inf_starboard_dock_right"; pixel_x = -20; pixel_y = 0; tag_airpump = "ascent_inf_shuttle_starboard_vent_inner"; tag_chamber_sensor = "ascent_inf_shuttle_starboard_interior_sensor"; tag_exterior_door = "ascent_inf_dock_starboard_external"; tag_interior_door = "ascent_inf_dock_starboard_internal"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard)
"Cp" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"Cr" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
"Cs" = (/obj/machinery/ion_engine{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port)
@@ -341,8 +343,8 @@
"CB" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
"CJ" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
"CM" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/engineering)
-"CN" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
-"CQ" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
+"CN" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_prow)
+"CQ" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "ascent_inf_port_dock_sensor"; pixel_x = -8; pixel_y = 24},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"CS" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_spike)
"CU" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard)
"CZ" = (/obj/machinery/ion_engine{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
@@ -352,11 +354,11 @@
"DB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"DF" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway)
"DG" = (/obj/machinery/shipsensors,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
-"DY" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 4; frequency = 1331; id_tag = "ascent_inf_port_dock"; pixel_x = -20; pixel_y = 0; tag_airpump = "ascent_inf_port_dock_pump"; tag_chamber_sensor = "ascent_inf_port_dock_sensor"; tag_exterior_door = "ascent_inf_port_dock_outer"; tag_interior_door = "ascent_inf_port_dock_inner"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
-"Ed" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/obj/machinery/alarm/ascent{dir = 8; pixel_x = 24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_spike)
+"DY" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 4; frequency = 1331; id_tag = "ascent_inf_port_dock_right"; pixel_x = -20; pixel_y = 0; tag_airpump = "ascent_inf_port_dock_pump"; tag_chamber_sensor = "ascent_inf_port_dock_sensor"; tag_exterior_door = "ascent_inf_port_dock_outer"; tag_interior_door = "ascent_inf_port_dock_inner"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
+"Ed" = (/obj/machinery/alarm/ascent{dir = 8; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_spike)
"Ef" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"Ej" = (/obj/structure/bed/chair/padded/purple/ascent/gyne,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/aft_starboard_jut)
-"Eq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/alarm/ascent{dir = 4; pixel_x = -24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
+"Eq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/alarm/ascent{dir = 4; pixel_x = -24},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"Et" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port)
"Eu" = (/obj/structure/ore_box{color = "PURPLE"; name = "heavy duty box"},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
"EF" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_jut)
@@ -365,12 +367,12 @@
"EO" = (/obj/machinery/alarm/ascent{dir = 1; pixel_y = -24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/engineering)
"EW" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 4; id_tag = "ascent_inf_starboard_pump_out_external"},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/shuttle_starboard)
"EZ" = (/obj/structure/window/boron_reinforced{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
-"Fb" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow)
+"Fb" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"Fd" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"Fe" = (/obj/machinery/cryopod/ascent_spawn,/obj/submap_landmark/spawnpoint/ascent_seedship_inf/alate,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/habitation)
"Ff" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "ascent_inf_starboard_sensor"; pixel_x = -24; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 1; id_tag = "ascent_inf_starboard_pump"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"Fi" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/machinery/power/terminal{dir = 8},/obj/structure/window/boron_reinforced{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
-"Fl" = (/obj/machinery/botany/extractor,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/hydroponics_port)
+"Fl" = (/obj/machinery/botany/extractor,/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/hydroponics_port)
"Fu" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"Fz" = (/obj/structure/cable/cyan,/obj/machinery/alarm/ascent{dir = 1; pixel_y = -24},/obj/machinery/power/smes/buildable/preset/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_starboard)
"FF" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
@@ -387,7 +389,7 @@
"Gr" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_jut)
"Gz" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"GD" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port)
-"GE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
+"GE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/cyan{d1 = 1; d2 = 4; dir = 8; icon_state = "2-4"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
"GG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"GO" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"GZ" = (/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc/hyper/ascent/north,/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
@@ -396,11 +398,11 @@
"Hj" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation)
"Hk" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"Hu" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/reagent_containers/glass/beaker/large{pixel_y = 3},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
-"HC" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_starboard)
+"HC" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
"HG" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"HK" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation)
"HN" = (/obj/machinery/conveyor{dir = 4; id = "ascent"},/obj/machinery/mineral/processing_unit{color = "PURPLE"; input_turf = 4; name = "compression dynamo"; output_turf = 8},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
-"HY" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/aft_starboard_jut)
+"HY" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
"Ie" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"In" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"Io" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/obj/structure/window/boron_reinforced,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/engineering)
@@ -413,10 +415,10 @@
"IW" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{id_tag = "ascent_inf_seedship_fore_pumps"},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "ascent_inf_seedship_fore_dock_sensor"; pixel_y = 24},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_hallway)
"Ja" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"Je" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_spike)
-"Jj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/access_button/airlock_interior{frequency = 1331; master_tag = "ascent_inf_port_shuttle_dock"; pixel_x = 4; pixel_y = 24},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
+"Jj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/access_button/airlock_interior{frequency = 1331; master_tag = "ascent_inf_port_shuttle_dock"; pixel_x = 4; pixel_y = 24},/obj/machinery/light/ascent{dir = 1},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "ascent_inf_port_shuttle_dock_down"; pixel_x = -5; tag_airpump = "ascent_inf_port_pump"; tag_chamber_sensor = "ascent_inf_port_sensor"; tag_exterior_door = "ascent_inf_port_outer"; tag_interior_door = "ascent_inf_port_inner"; pixel_y = 20},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"Jl" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
-"Jt" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow)
-"Jw" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
+"Jt" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
+"Jw" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"JA" = (/obj/machinery/recharge_station/ascent,/obj/submap_landmark/spawnpoint/ascent_seedship_inf/drone,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
"JH" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{id_tag = "ascent_inf_port_pump"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"JN" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
@@ -431,10 +433,10 @@
"KC" = (/obj/structure/table/rack/dark,/obj/item/tank/jetpack/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation)
"KR" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port)
"KT" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
-"KV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_spike)
-"KY" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge)
+"KV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_starboard_spike)
+"KY" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"La" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
-"Ld" = (/obj/machinery/seed_extractor,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/hydroponics_starboard)
+"Ld" = (/obj/machinery/seed_extractor,/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/hydroponics_starboard)
"Lj" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{id_tag = "ascent_inf_seedship_fore_pumps"},/obj/machinery/embedded_controller/radio/airlock/docking_port{airflow_dest = "ascent_seedship_fore_dock_controller"; frequency = 1331; id_tag = "ascent_inf_seedship_fore_dock_controller"; pixel_y = 21; tag_airpump = "ascent_inf_seedship_fore_pumps"; tag_chamber_sensor = "ascent_inf_seedship_fore_dock_sensor"; tag_exterior_door = "ascent_inf_seedship_fore_external"; tag_interior_door = "ascent_inf_seedship_fore_internal"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_hallway)
"Ln" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_port_inner"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"Lu" = (/obj/structure/bed/chair/padded/purple/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/habitation)
@@ -454,25 +456,25 @@
"Ms" = (/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge)
"ME" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{dir = 2; id_tag = "ascent_inf_starboard_pump_out_internal"},/obj/machinery/embedded_controller/radio/airlock/docking_port{cycle_to_external_air = 1; dir = 4; frequency = 1331; id_tag = "ascent_inf_starboard"; pixel_x = -20; pixel_y = 0; req_access = list("ACCESS_ASCENT"); tag_exterior_sensor = "ascent_inf_starboard_sensor"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"MJ" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/hydroponics_starboard)
-"MK" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/material/knife/kitchen/cleaver/ascent,/obj/item/material/knife/kitchen/cleaver/ascent{pixel_y = 1; pixel_x = 6},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_spike)
+"MK" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/material/knife/kitchen/cleaver/ascent,/obj/item/material/knife/kitchen/cleaver/ascent{pixel_y = 1; pixel_x = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_spike)
"MV" = (/obj/structure/table/rack/ascent,/obj/item/clustertool,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/aft_starboard_jut)
"Na" = (/obj/machinery/conveyor{dir = 9; id = "ascent"},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
"Nc" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
-"Nl" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_port_dock_inner"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
-"Nm" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
-"Nx" = (/obj/structure/table/rack/ascent,/obj/item/gun/energy/particle,/obj/item/gun/energy/particle,/obj/item/rig/mantid,/obj/item/rig/mantid/nabber,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
+"Nl" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_port_dock_inner"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
+"Nm" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/methyl_bromide,/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
+"Nx" = (/obj/structure/table/rack/ascent,/obj/item/gun/energy/particle,/obj/item/rig/mantid/nabber,/obj/item/rig/mantid/nabber/seed,/obj/item/gun/energy/particle/small,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"Nz" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/light/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"ND" = (/obj/machinery/computer/ship/sensors/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
"NF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/bed/chair/padded/purple/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
-"NI" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
+"NI" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1331; id_tag = "ascent_inf_port_dock"; pixel_y = 20; tag_airpump = "ascent_inf_port_dock_pump"; tag_chamber_sensor = "ascent_inf_port_dock_sensor"; tag_exterior_door = "ascent_inf_port_dock_outer"; tag_interior_door = "ascent_inf_port_dock_inner"; pixel_x = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"NK" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"NO" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port)
-"NP" = (/obj/structure/cable/cyan{icon_state = "0-8"},/obj/machinery/power/apc/hyper/ascent/south,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge)
+"NP" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge)
"NY" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_jut)
-"Ob" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow)
+"Ob" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"Og" = (/obj/machinery/door/airlock/external/bolted/ascent{airlock_type = "Internal"; frequency = 1331; id_tag = "ascent_inf_starboard_inner"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"Os" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/reagent_containers/glass/beaker{pixel_y = 3; pixel_x = -5},/obj/item/reagent_containers/glass/beaker{pixel_y = 4; pixel_x = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
-"Ot" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/alarm/ascent{dir = 8; pixel_x = 24},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
+"Ot" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent,/obj/machinery/alarm/ascent{dir = 8; pixel_x = 24},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"OO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"OP" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway)
"OY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_jut)
@@ -482,14 +484,14 @@
"PD" = (/obj/machinery/shipsensors,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"PG" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"PI" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/obj/machinery/door/airlock/external/bolted/ascent{airlock_type = "Internal"; frequency = 1331; id_tag = "ascent_inf_starboard_inner"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
-"PL" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
+"PL" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent,/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"PS" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/fore_starboard_prow)
"PT" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"PY" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"PZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"Qb" = (/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/aft_starboard_jut)
"Qf" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/fore_hallway)
-"Qs" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 4},/obj/structure/table/steel_reinforced/ascent,/obj/item/device/scanner/health,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/wing_port)
+"Qs" = (/obj/machinery/atmospherics/unary/vent_scrubber/on/ascent{dir = 4},/obj/structure/table/steel_reinforced/ascent,/obj/item/device/scanner/health,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"QB" = (/obj/machinery/alarm/ascent{dir = 1; pixel_y = -24},/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
"QF" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"QI" = (/obj/structure/table/rack/dark,/obj/item/tank/mantid/reactor{pixel_x = 9},/obj/item/tank/mantid/reactor{pixel_x = 4},/obj/item/tank/mantid/reactor{pixel_x = -1},/obj/item/tank/mantid/reactor{pixel_x = -6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation)
@@ -513,6 +515,7 @@
"Sn" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"Sp" = (/obj/structure/table/steel_reinforced/ascent,/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"Sq" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
+"Sw" = (/obj/structure/table/steel_reinforced/ascent,/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
"Sy" = (/obj/machinery/computer/ship/navigation/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"Sz" = (/obj/structure/cable/cyan{icon_state = "0-4"},/obj/machinery/power/apc/hyper/ascent/south,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_jut)
"SH" = (/obj/structure/window/boron_reinforced,/obj/structure/window/boron_reinforced{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
@@ -529,7 +532,7 @@
"Uk" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"Uo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/black,/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_starboard_outer"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
"Ur" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/airlock/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
-"Uv" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/reagent_containers/food/drinks/cans/waterbottle/ascent{pixel_x = -6},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow)
+"Uv" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/reagent_containers/food/drinks/cans/waterbottle/ascent{pixel_x = -6},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"UE" = (/obj/structure/table/rack/dark,/obj/item/tank/mantid/methyl_bromide,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge)
"Ve" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation)
"Vg" = (/obj/structure/bed/chair/padded/purple/ascent/gyne,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/bridge)
@@ -539,23 +542,25 @@
"Vy" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"Vz" = (/obj/structure/cable/cyan{icon_state = "0-8"},/obj/machinery/power/apc/hyper/ascent/east,/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation)
"VB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
-"VE" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/storage/box/water/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_prow)
+"VE" = (/obj/structure/table/steel_reinforced/ascent,/obj/item/storage/box/water/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"VP" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/hydroponics_port)
"VR" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"Wl" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/wing_port)
"Wq" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
-"Wv" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
+"Wv" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden,/obj/machinery/embedded_controller/radio/airlock/docking_port{dir = 1; frequency = 1331; id_tag = "ascent_inf_starboard_dock"; pixel_y = -30; tag_airpump = "ascent_inf_shuttle_starboard_vent_inner"; tag_chamber_sensor = "ascent_inf_shuttle_starboard_interior_sensor"; tag_exterior_door = "ascent_inf_dock_starboard_external"; tag_interior_door = "ascent_inf_dock_starboard_internal"},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_starboard)
"Ww" = (/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_hallway)
"WN" = (/obj/machinery/alarm/ascent{dir = 1; pixel_y = -24},/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/habitation)
"WP" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_port)
-"WV" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_starboard_outer"},/obj/machinery/atmospherics/pipe/manifold/hidden/black,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "ascent_inf_starboard"; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
-"Xb" = (/obj/structure/table/rack/ascent,/obj/item/gun/energy/particle,/obj/item/rig/mantid/gyne,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
+"WV" = (/obj/machinery/door/airlock/external/bolted/ascent{frequency = 1331; id_tag = "ascent_inf_starboard_outer"},/obj/machinery/atmospherics/pipe/manifold/hidden/black,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "ascent_inf_starboard"; pixel_x = -23; pixel_y = -9},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
+"Xb" = (/obj/structure/table/rack/ascent,/obj/item/rig/mantid/nabber/queen/seed,/obj/item/rig/mantid/gyne,/obj/item/gun/energy/particle/small,/obj/item/gun/energy/particle,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
"Xc" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"Xf" = (/turf/simulated/wall/r_wall/ascent,/area/ship/ascent_inf/habitation)
"Xl" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"Xm" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_starboard)
-"Xu" = (/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4; icon_state = "intact"},/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/shuttle_starboard)
+"Xs" = (/obj/machinery/light/ascent{dir = 4},/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
+"Xu" = (/turf/simulated/floor/ascent,/area/ship/ascent_inf/fore_port_prow)
"XA" = (/obj/machinery/conveyor{dir = 4; id = "ascent"},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
+"XI" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/empty,/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/engineering)
"XJ" = (/obj/machinery/light/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_prow)
"XN" = (/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_port_spike)
"XO" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/light/ascent{dir = 8},/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
@@ -580,13 +585,13 @@
"ZF" = (/obj/machinery/atmospherics/unary/vent_pump/on/ascent{dir = 1; level = 2},/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/fore_starboard_jut)
"ZI" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/hydroponics/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"ZK" = (/obj/machinery/seed_storage,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/hydroponics_starboard)
-"ZN" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent/tiled,/area/ship/ascent_inf/shuttle_port)
+"ZN" = (/obj/structure/table/steel_reinforced/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/shuttle_port)
"ZO" = (/obj/wallframe_spawn/reinforced_phoron/titanium/ascent,/turf/simulated/floor/ascent,/area/ship/ascent_inf/aft_starboard_jut)
"ZR" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/light/ascent{dir = 1},/turf/simulated/floor/ascent,/area/ship/ascent_inf/wing_port)
"ZS" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10},/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
"ZU" = (/obj/machinery/conveyor{dir = 1; id = "ascent"},/turf/simulated/floor/ascent/airless,/area/ship/ascent_inf/fore_starboard_prow)
"ZW" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/methyl_bromide,/turf/simulated/floor/ascent,/area/ship/ascent_inf/hydroponics_starboard)
-"ZX" = (/obj/structure/table/rack/ascent,/obj/item/rig/mantid/nabber/seed,/obj/item/rig/mantid/seed,/obj/item/gun/energy/particle/small,/obj/item/gun/energy/particle/small,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
+"ZX" = (/obj/structure/table/rack/ascent,/obj/item/gun/energy/particle/small,/obj/item/rig/mantid/seed,/obj/item/rig/mantid,/obj/item/gun/energy/particle,/turf/simulated/floor/ascent,/area/ship/ascent_inf/bridge)
(1,1,1) = {"
SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
@@ -644,26 +649,26 @@ SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXqNrkrkhvNYGrshqNqNSXdSdSbIdSOgPIrfdSFzdSdSSXRsRscycycyGZzaEjzaRsRsRsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXqNaMrkpoNYjFOYyQqNqNzddSdSdSFfdasYdSdSdSzdRsRsMVcyigcyCtcyHYcydHRsZwSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXqNqNrkrkpoNYZFrkIRUiqNSXzdzddSMEsvhrdSzdzdSXRswRwRdHQVLajqGEoNdHRjRsZwSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXPSoJoJoJoJoJqNqNrkrkpoNYEFSzrQPeqNSXSXEWXuWVyCUotyELSXSXRssfsfdHcQdHAHdsQBcQdHRsZwSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXPSPSnszQOszwIvPSPSPSPSPSPSPSPSitPSPSPSPSPSPStiuytiemememememememememememcaemememMJMJMJMJMJMJMJMJMJSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXndndndndndndndndndndPSuDrOrOrOrOrOrOhCXAHNXANarOrOoUrOrOrOkorOPSiCfJiCemCopYhFlFziemJABsJAoxyDhFkgemGmLdZKZWZIaVZIZIMJSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXPSoJoJoJoJoJqNqNrkrkpoNYEFSzrQPeqNSXSXEWtyWVyCUotyELSXSXRssfsfdHcQdHdHdsQBcQdHRsZwSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXPSPSnszQOszwSwPSPSPSPSPSPSPSPSitPSPSPSPSPSPStiuytiemememememememememememcaemememMJMJMJMJMJMJMJMJMJSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXndndndndndndndndndndPSuDrOrOrOrOrOrOhCXAHNXANarOrOoUrOrOrOkodAPSiCfJiCemCopYhFlFziemJAemJAoxyDhFkgemGmLdZKZWZIaVZIZIMJSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXndndndndndsysysyfXdOZzZzKVbiPSjOrOrOHuIvIvrOZUdQrItaHbrOrOoUrOrOrOrOrOLRYOBVWvgmVsVtyiWqqrrZqrTbqrqrMezipmCrEKEKEKtgjWxvjWGzMJMJMJMJMJCZSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXCSZzZzZzJeZzZzZzZzZzZzwzkGahxubYrOrOrOrOrOrOrOrOAydjdjdjdjlHrOrOrOXJrOPSemememcVcVcVUrcVcVcVTwvAmFFVnbCBCBJNdgoESlNKbPbPBfpfuCuCZSbPMJMJCZSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXCSZzZzZzJeZzZzZzZzZzZzwzkGahxubYrOrOrOrOrOrOrOrOAydjdjdjdjlHrOrOrOXJrOPSemememcVcVcVUrcVcVcVTwvAmFFVnbCBCBJNdgoESlNKbPbPBfpfuCuCZSaVMJMJCZSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXndndndndndndndndndbRbRndndndPSwUsAbYrOrOrOrOXJqAhnCNrOrOXJrOrOPSPSPSPSPSsocVcVcVUEMslkMsUEcVcVcVJRHCCJzihOCrIEzFInCeGpxvjKwPNcNcNcAUbPMJMJCZSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXPSPSPSzjDvrOrOrOPSRaxytDxYPSXflYXfXfFeaxFesosocVSppqCppGlkpGCppqSpcVpPziCJziSaemACACFdFdFdFdACACMJMJMJMJMJMJMJMJCZSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXlWtvxpoAKwsAQNPSPSlgPSPSPSaJQIKCcBsosososocVcVYtAOljpGlkpGYtAOljcVcVIzCJlxemACznznzneQfNYvwTACACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXlWtvxpoAKwsAQNPSPSlgPSPSPSaJQIKCcBsosososocVcVYtAOljpGlkpGYtAOljcVcVIzCJlxemACznXIzneQfNYvwTACACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXQfQfPSPSPSPSPSlgPSwJGiwJXfsoHjVeVeZuVeVedPxRcVpGpGpGpGpGlkpGpGpGpGNxcVemRHememACVykJnBLLLLLLLLPmMrACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXQfLjAVIWQfwLSjGiWwDFGiOPXfsotTsoLuVqLusokBVeGgAsNzZEaIpGlkKYsxpqpGxcPYkSZmmGCMACKTKflQpjYTEZEZtNKfzrACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXXTMfAnAnLFugbxlXrHrHhDrHenVeweVzDjDjDjrnsosocVcVcVxcGOZEikVBxcVgpGXbPYxxLYcgcgbllIsHmbtRFiLLgKhAKfKfACBBSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXQfgwdUgwQfBFsuGiksDFGiOPXfsotTsohqlehqsoHjVeGgZEJlZEkepGlkBbSylrpGxcPYcHZmZlEOACKTKfIoivfQJWJWSHKfzrACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXQfLjAVIWQfwLSjGiWwDFGiOPXfsotTsoLuVqLusokBVeGgAsNzZEaIpGlkKYsxpqpGiRPYkSZmmGCMACKTKflQpjYTEZEZtNKfzrACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXXTMfAnAnLFugbxlXrHrHhDrHenVeweVzDjDjDjrnsosocVcVcVxcGOZEikVBpGVgpGXbPYxxLYcgcgbllIsHmbtRFiLLgKhAKfKfACBBSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXQfgwdUgwQfBFsuGiksDFGiOPXfsotTsohqlehqsoHjVeGgZEJlZEkepGlkBbSylrpGiRPYcHZmZlEOACKTKfIoivfQJWJWSHKfzrACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXQfQfeqeqeqeqeqhGeqSeGiSeXfsokBVeVeHKVeVeQWxRcVpGpGpGpGpGlkpGpGpGpGZXcVWllpWlWlACuRLysiKfKfKfKfKfKfACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXvFIwFUGcSnAceYeqeqhGeqeqeqrFrFWNwIsosososocVcVYtYIljpGlkpGYtYIljcVcVFNodyrYDWlhcNmoiccpxkXsQACACYSSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXeqeqeqPGPTxIxIxIeqiutCVElZeqXflYXfXfykhtyksosocVBLbECppGlkpGCpbEBLcVJTeKodeKlAWlACACFdFdFdFdACACAgAgAgAgAgAgAgAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXKxKxKxKxKxKxKxKxKxoRoRKxKxKxeqpSDsPTqgxIxIxIxIJtObFbxIxIxIxIxIeqeqeqeqeqsocVcVcVUEpGpMNPUEcVcVcVxfJwodeKlAXlnjaSaBBMeXBMnvWPATATATxUpepeAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXexXNXNXNyfXNXNXNXNXNXNThwVmOQFPTxIthththxIxIxIxIxIxIxIxIxIxIxIxIxIxIzkeqWlWlWlcVcVcVUrcVcVcVTMpWQspXTxnfnfkZijihxLuqpepeTWzXfzfzuIpepeAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXKxKxKxKxKxSLSLSLSLMKjReMvyEdeqfVxInSxInSxIxIqsqsqstOqsqsqsxIxIxIxIxIxINlNIMpHeatRSVRCQZRFuXcFuFuFuFuazeKeKXlVPVPVPEtGDBMGDNOAgAgAgAgAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXKxKxKxKxKxKxKxKxKxKxeqxIxIxIxIxItOxIUvUvUveqUvUvUvxItOxIxIxIzkeqwkwoWlDYeKvSeKdkeKWlaUiRzJiYpRabYDWlryFlRkRdmVKRmVmVAgSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
-SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXeqeqththththeqdvdvdvdveqdvdvdveqeqeqeqeqeqeqkPkcWlWlWlWlXlXlXlWlWlWlXlXlWlWlWlWlAgAgAgAgAgAgAgAgAgSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXeqeqeqPGPTxIxIxIeqiutCVElZeqXflYXfXfykhtyksosocVBLbECppGlkpGCpbEBLcVJTeKodeKoRWlACACFdFdFdFdACACAgAgAgAgAgAgAgAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXKxKxKxKxKxKxKxKxKxexexKxKxKxeqpSDsPTqgxIxIxIAHJtObFbxIxIAHxIxIeqeqeqeqeqsocVcVcVUEBspMNPpzcVcVcVxfJwodeKlAXlnjaSaBBMeXBMnvWPATATATxUpeAgAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXexXNXNXNyfXNXNXNXNXNXNThwVmOQFPTxIthththxIxIxIxIxIxIxIxIxIxIxIxIxIxIXsWlWlWlWlcVcVcVUrcVcVcVTMpWQspXTxnfnfkZijihxLuqpepeTWzXfzfzuIKRAgAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXKxKxKxKxKxSLSLSLSLMKjReMvyEdeqfVxInSxInSxIxIqsqsqstOqsqsqsxIxIxIxIXuXuNlNIMpHeatRSVRCQZRFuXcFuFuFuFuazeKeKXlVPVPVPEtGDBMGDNOAgAgAgAgAgCsSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXKxKxKxKxKxKxKxKxKxKxeqxIxIxIxIxItOxIUvUvUveqUvUvUvxItOxIxIxIzkWlwkwoWlDYeKvSeKdkeKWlaUeKzJiYpRabYDWlryFlRkRdmVKRmVmVAgSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
+SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXeqeqththththeqdvdvdvdveqdvdvdveqeqeqeqeqeqWlkPkcWlWlWlWlXlXlXlWlWlWlXlXlWlWlWlWlAgAgAgAgAgAgAgAgAgSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXeqdvdvdvdveqSXSXxzgngnxzxzxzgngngnxzxzxzxzlmxSxzxzxzxzgngngnxzxzxzgngnxzSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXxzxzxzxzuGxzxzxzxzxzYBuOJaJHcwxzjehMxzxzxzxzxzEuxzxzxzxzSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXxzpEpEakpEpEcApEOtxzqjuQkvaHCwxzNFOOxzEqbfPLpEpEakpEyhxzSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX
diff --git a/mods/_maps/farfleet/code/farfleet_shuttle.dm b/mods/_maps/farfleet/code/farfleet_shuttle.dm
index d91f64bd1350e..faa710686bd40 100644
--- a/mods/_maps/farfleet/code/farfleet_shuttle.dm
+++ b/mods/_maps/farfleet/code/farfleet_shuttle.dm
@@ -39,7 +39,6 @@
landmark_tag = "nav_hangar_snz"
base_area = /area/ship/farfleet/command/snz_hangar
base_turf = /turf/simulated/floor/plating
- movable_flags = MOVABLE_FLAG_EFFECTMOVE
/obj/shuttle_landmark/snz/altdock
name = "Docking Port"
diff --git a/mods/_maps/farfleet/maps/farfleet-2.dmm b/mods/_maps/farfleet/maps/farfleet-2.dmm
index 079e77ae67e16..d006e55e5dec5 100644
--- a/mods/_maps/farfleet/maps/farfleet-2.dmm
+++ b/mods/_maps/farfleet/maps/farfleet-2.dmm
@@ -49,6 +49,7 @@
/area/ship/farfleet/barracks/armory)
"aO" = (
/obj/machinery/photocopier,
+/obj/floor_decal/industrial/outline/grey,
/turf/simulated/floor/tiled/dark/monotile,
/area/ship/farfleet/crew/brig/css)
"aP" = (
@@ -107,6 +108,9 @@
pixel_y = 32
},
/obj/item/stack/package_wrap/cargo_wrap,
+/obj/item/storage/lunchbox/gcc,
+/obj/item/storage/lunchbox/gcc,
+/obj/item/storage/lunchbox/gcc,
/turf/simulated/floor/tiled/white,
/area/ship/farfleet/crew/kitchen)
"bg" = (
@@ -122,6 +126,7 @@
/obj/machinery/atmospherics/unary/tank/hydrogen{
dir = 1
},
+/obj/floor_decal/industrial/outline/red,
/turf/simulated/floor/tiled/techfloor/grid,
/area/ship/farfleet/command/hangar_canisters)
"br" = (
@@ -388,6 +393,7 @@
/obj/machinery/atmospherics/unary/tank/carbon_dioxide{
dir = 4
},
+/obj/floor_decal/industrial/outline/yellow,
/turf/simulated/floor/tiled/techfloor/grid,
/area/ship/farfleet/command/hangar_canisters)
"dY" = (
@@ -441,6 +447,7 @@
/area/ship/farfleet/crew/freezer)
"eg" = (
/obj/machinery/artifact_analyser,
+/obj/floor_decal/industrial/outline/grey,
/turf/simulated/floor/tiled/techmaint,
/area/ship/farfleet/maintenance/anomaly)
"en" = (
@@ -454,6 +461,7 @@
/area/ship/farfleet/crew/brig)
"eo" = (
/obj/structure/reagent_dispensers/coolanttank,
+/obj/floor_decal/industrial/outline/blue,
/turf/simulated/floor/tiled/techmaint,
/area/ship/farfleet/maintenance/anomaly)
"er" = (
@@ -567,6 +575,7 @@
/area/ship/farfleet/barracks/armory)
"fN" = (
/obj/machinery/photocopier,
+/obj/floor_decal/industrial/outline/grey,
/turf/simulated/floor/tiled/techmaint,
/area/ship/farfleet/maintenance/anomaly)
"fS" = (
@@ -666,6 +675,7 @@
icon_state = "map_connector"
},
/obj/machinery/portable_atmospherics/canister/carbon_dioxide,
+/obj/floor_decal/industrial/outline/yellow,
/turf/simulated/floor/tiled/techfloor/grid,
/area/ship/farfleet/command/hangar_canisters)
"gL" = (
@@ -729,6 +739,7 @@
/area/ship/farfleet/crew/kitchen)
"hj" = (
/obj/structure/closet/radiation,
+/obj/floor_decal/industrial/outline/grey,
/turf/simulated/floor/tiled/techmaint,
/area/ship/farfleet/maintenance/anomaly)
"hn" = (
@@ -883,6 +894,7 @@
/area/ship/farfleet/maintenance/anomaly)
"iv" = (
/obj/structure/closet/secure_closet/farfleet/css,
+/obj/floor_decal/industrial/outline/grey,
/turf/simulated/floor/tiled/dark/monotile,
/area/ship/farfleet/crew/brig/css)
"iG" = (
@@ -1093,8 +1105,8 @@
/obj/structure/closet/secure_closet/hydroponics{
req_access = list()
},
-/obj/floor_decal/corner_steel_grid/diagonal,
-/turf/simulated/floor/tiled,
+/obj/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled/monotile,
/area/ship/farfleet/crew/hydroponics)
"kS" = (
/obj/machinery/light,
@@ -2380,6 +2392,7 @@
/area/ship/snz)
"xk" = (
/obj/machinery/artifact_harvester,
+/obj/floor_decal/industrial/outline/grey,
/turf/simulated/floor/tiled/techmaint,
/area/ship/farfleet/maintenance/anomaly)
"xl" = (
@@ -2589,6 +2602,9 @@
pixel_y = 2
},
/obj/item/device/scanner/health,
+/obj/item/reagent_containers/glass/bucket,
+/obj/item/reagent_containers/glass/bucket,
+/obj/item/reagent_containers/glass/bucket,
/turf/simulated/floor/tiled/techmaint,
/area/ship/farfleet/maintenance/anomaly)
"yK" = (
@@ -3249,6 +3265,14 @@
/obj/item/rig_module/grenade_launcher/light,
/turf/simulated/floor/tiled/dark/monotile,
/area/ship/farfleet/barracks/armory)
+"Em" = (
+/obj/structure/table/reinforced,
+/obj/item/gun/projectile/shotgun/pump/exploration,
+/obj/item/gun/projectile/shotgun/pump/exploration{
+ pixel_y = 6
+ },
+/turf/simulated/floor/tiled/dark,
+/area/ship/farfleet/barracks)
"En" = (
/obj/structure/cable/green{
d1 = 4;
@@ -3760,8 +3784,11 @@
pixel_x = -22;
req_access = list("ACCESS_ICCGN")
},
-/obj/structure/table/steel_reinforced,
-/obj/item/reagent_containers/glass/bucket,
+/obj/structure/table/rack,
+/obj/item/clothing/gloves/anomaly_detector/gurza,
+/obj/item/storage/bolt_bag/full_of_bolts,
+/obj/item/storage/bolt_bag/full_of_bolts,
+/obj/item/storage/bolt_bag/full_of_bolts,
/turf/simulated/floor/tiled/techmaint,
/area/ship/farfleet/maintenance/anomaly)
"KF" = (
@@ -3838,6 +3865,7 @@
/area/ship/farfleet/crew/hydroponics)
"Lf" = (
/obj/machinery/papershredder,
+/obj/floor_decal/industrial/outline/grey,
/turf/simulated/floor/tiled/dark/monotile,
/area/ship/farfleet/crew/brig/css)
"Ll" = (
@@ -3922,10 +3950,6 @@
},
/turf/simulated/floor/tiled/monotile,
/area/ship/farfleet/crew/hydroponics)
-"Ms" = (
-/obj/shuttle_landmark/snz/start,
-/turf/simulated/floor/tiled/monotile,
-/area/ship/farfleet/command/snz_hangar)
"Mt" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled/white,
@@ -4324,6 +4348,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
+/obj/shuttle_landmark/snz/start,
/turf/simulated/floor/tiled/steel_grid,
/area/ship/snz)
"Rs" = (
@@ -4594,6 +4619,13 @@
/obj/item/clothing/accessory/storage/holster/armpit,
/turf/simulated/floor/tiled/dark/monotile,
/area/ship/farfleet/barracks/armory)
+"Tc" = (
+/obj/structure/table/reinforced,
+/obj/item/ammo_magazine/shotholder/net,
+/obj/item/ammo_magazine/shotholder/net,
+/obj/item/ammo_magazine/shotholder/net,
+/turf/simulated/floor/tiled/dark,
+/area/ship/farfleet/barracks)
"Tg" = (
/obj/floor_decal/corner/b_green/diagonal{
dir = 8
@@ -4646,7 +4678,7 @@
dir = 8
},
/obj/structure/table/marble,
-/obj/item/material/kitchen/rollingpin,
+/obj/item/material/rollingpin,
/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/tiled/white,
/area/ship/farfleet/crew/kitchen)
@@ -4742,6 +4774,14 @@
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
/turf/simulated/floor/plating,
/area/ship/farfleet/command/snz_hangar)
+"Uq" = (
+/obj/floor_decal/corner/b_green/diagonal{
+ dir = 8
+ },
+/obj/structure/table/standard,
+/obj/item/storage/lunchbox/gcc,
+/turf/simulated/floor/tiled/white,
+/area/ship/farfleet/crew/canteen)
"Uu" = (
/turf/simulated/floor/tiled/dark,
/area/ship/farfleet/barracks)
@@ -5250,6 +5290,7 @@
"Yn" = (
/obj/machinery/atmospherics/portables_connector,
/obj/machinery/portable_atmospherics/canister/hydrogen,
+/obj/floor_decal/industrial/outline/red,
/turf/simulated/floor/tiled/techfloor/grid,
/area/ship/farfleet/command/hangar_canisters)
"Ys" = (
@@ -11575,7 +11616,7 @@ Je
MT
VA
Ac
-Ac
+Uq
Wd
Ye
cO
@@ -14616,7 +14657,7 @@ Uu
Uu
wJ
ME
-Ms
+ns
aW
Iu
eB
@@ -14979,7 +15020,7 @@ wt
PD
Gb
kU
-uA
+Tc
eS
sh
rq
@@ -15101,7 +15142,7 @@ wD
Uu
ju
Uu
-uA
+Em
eS
sh
rq
diff --git a/mods/_maps/hand/code/hand_shuttles.dm b/mods/_maps/hand/code/hand_shuttles.dm
index 9116fd75d42b7..2aa54bb7ecbdc 100644
--- a/mods/_maps/hand/code/hand_shuttles.dm
+++ b/mods/_maps/hand/code/hand_shuttles.dm
@@ -102,7 +102,7 @@
warmup_time = 5
current_location = "nav_handpodtwo_start"
range = 2
- shuttle_area = list(/area/ship/hand/shuttle/pod_hand_one)
+ shuttle_area = list(/area/ship/hand/shuttle/pod_hand_two)
defer_initialisation = TRUE
flags = SHUTTLE_FLAGS_PROCESS
skill_needed = SKILL_BASIC
diff --git a/mods/_maps/hand/maps/hand-1.dmm b/mods/_maps/hand/maps/hand-1.dmm
index 5f7c095cb1958..d0f8bfe6f754b 100644
--- a/mods/_maps/hand/maps/hand-1.dmm
+++ b/mods/_maps/hand/maps/hand-1.dmm
@@ -446,6 +446,10 @@
"cN" = (
/obj/wallframe_spawn/reinforced,
/obj/paint/sun,
+/obj/machinery/door/blast/regular/open{
+ name = "Reactor Blast Doors";
+ id_tag = "hand_nuke"
+ },
/turf/simulated/floor/plating,
/area/ship/hand/maintenance/engine)
"cQ" = (
@@ -2938,6 +2942,10 @@
icon_state = "0-8"
},
/obj/floor_decal/industrial/warning/full,
+/obj/structure/sign/warning/vent_port{
+ dir = 1;
+ pixel_y = -36
+ },
/turf/simulated/floor/tiled/techfloor/grid,
/area/ship/hand/maintenance/engine)
"pu" = (
@@ -4338,6 +4346,18 @@
pixel_y = 24;
req_access = list("ACCESS_HAND")
},
+/obj/machinery/button/blast_door{
+ pixel_x = -23;
+ name = "Reactor Emergensy Vent";
+ id_tag = "Hnreactor";
+ dir = 4;
+ pixel_y = -7;
+ desc = "Nuclear reactor emergency vent. Use in emergency only!"
+ },
+/obj/structure/sign/warning/vacuum{
+ dir = 4;
+ pixel_x = -43
+ },
/turf/simulated/floor/tiled/steel_ridged,
/area/ship/hand/maintenance/engine)
"vY" = (
@@ -6148,6 +6168,10 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/door/blast/regular/open{
+ name = "Reactor Blast Doors";
+ id_tag = "hand_nuke"
+ },
/turf/simulated/floor/tiled/techfloor/grid,
/area/ship/hand/maintenance/engine)
"Fy" = (
@@ -7043,6 +7067,10 @@
icon_state = "0-4"
},
/obj/floor_decal/industrial/warning/full,
+/obj/structure/sign/warning/vent_port{
+ dir = 1;
+ pixel_y = -36
+ },
/turf/simulated/floor/tiled/techfloor/grid,
/area/ship/hand/maintenance/engine)
"JI" = (
@@ -7318,6 +7346,13 @@
dir = 1;
pixel_y = -32
},
+/obj/machinery/button/blast_door{
+ pixel_x = -23;
+ name = "Reactor Blast Doors";
+ id_tag = "hand_nuke";
+ dir = 4;
+ pixel_y = -7
+ },
/turf/simulated/floor/tiled/steel_grid,
/area/ship/hand/engineering/hallway)
"Lc" = (
diff --git a/mods/_maps/hand/maps/hand-2.dmm b/mods/_maps/hand/maps/hand-2.dmm
index 068d9affb1eda..aecad0e901d7d 100644
--- a/mods/_maps/hand/maps/hand-2.dmm
+++ b/mods/_maps/hand/maps/hand-2.dmm
@@ -1280,7 +1280,7 @@
/area/ship/hand/crew/kitchen)
"mK" = (
/obj/structure/table/marble,
-/obj/item/material/kitchen/rollingpin{
+/obj/item/material/rollingpin{
pixel_x = -4;
pixel_y = 7
},
diff --git a/mods/_maps/liberia/code/liberia_areas.dm b/mods/_maps/liberia/code/liberia_areas.dm
index 008fe11448129..ef79a43d44aeb 100644
--- a/mods/_maps/liberia/code/liberia_areas.dm
+++ b/mods/_maps/liberia/code/liberia_areas.dm
@@ -73,10 +73,6 @@
name = "FTV Liberia - Shower"
icon_state = "showroom"
-/area/liberia/toiletroom2
- name = "FTV Liberia - Toilet"
- icon_state = "toilet"
-
/area/liberia/bar
name = "FTV Liberia - Bar"
icon_state = "bar"
diff --git a/mods/_maps/liberia/maps/liberia.dmm b/mods/_maps/liberia/maps/liberia.dmm
index 14412afa6cbe3..b4b8c50d1375b 100644
--- a/mods/_maps/liberia/maps/liberia.dmm
+++ b/mods/_maps/liberia/maps/liberia.dmm
@@ -2074,6 +2074,7 @@
dir = 4
},
/obj/machinery/door/firedoor,
+/obj/floor_decal/industrial/warning/fulltile,
/turf/simulated/floor/tiled/steel_grid,
/area/liberia/engineeringlobby)
"dA" = (
@@ -3762,8 +3763,8 @@
/turf/simulated/floor/tiled,
/area/liberia/hallway)
"gn" = (
-/obj/machinery/door/airlock{
- name = "Toilet"
+/obj/machinery/door/airlock/civilian{
+ name = "Restroom"
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/door/firedoor,
@@ -3988,11 +3989,6 @@
d2 = 8;
icon_state = "1-8"
},
-/obj/structure/cable/blue{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
/turf/simulated/floor/tiled/freezer,
/area/liberia/toiletroom1)
"gG" = (
@@ -4249,11 +4245,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 6
},
-/obj/structure/cable/blue{
- d1 = 2;
- d2 = 4;
- icon_state = "2-4"
- },
/turf/simulated/floor/tiled/freezer,
/area/liberia/toiletroom1)
"hc" = (
@@ -4261,11 +4252,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 9
},
-/obj/structure/cable/blue{
- d1 = 1;
- d2 = 8;
- icon_state = "1-8"
- },
/turf/simulated/floor/tiled/freezer,
/area/liberia/toiletroom1)
"hd" = (
@@ -4335,20 +4321,12 @@
/turf/simulated/floor/wood/walnut,
/area/liberia/bar)
"hm" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 9
},
-/obj/structure/cable/blue{
- d1 = 1;
- d2 = 8;
- icon_state = "1-8"
- },
/turf/simulated/floor/tiled/freezer,
/area/liberia/toiletroom1)
"hn" = (
@@ -4417,7 +4395,7 @@
},
/obj/structure/table/reinforced,
/obj/item/clothing/suit/chef/classic,
-/obj/item/material/kitchen/rollingpin,
+/obj/item/material/rollingpin,
/obj/item/material/knife/kitchen,
/turf/simulated/floor/tiled/freezer,
/area/liberia/bar)
@@ -6511,6 +6489,7 @@
d2 = 2;
icon_state = "1-2"
},
+/obj/floor_decal/industrial/warning/fulltile,
/turf/simulated/floor/tiled/white,
/area/liberia/medbay)
"lx" = (
@@ -7712,9 +7691,6 @@
/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/steel_grid,
/area/liberia/atmos)
-"BC" = (
-/turf/simulated/wall/r_wall/prepainted,
-/area/liberia/toiletroom2)
"BE" = (
/obj/floor_decal/borderfloor{
dir = 8
@@ -7840,17 +7816,8 @@
/obj/machinery/atmospherics/unary/vent_pump/on{
dir = 4
},
-/obj/machinery/power/apc/liberia{
- dir = 8;
- name = "west bump";
- pixel_x = -24
- },
-/obj/structure/cable/blue{
- d2 = 4;
- icon_state = "0-4"
- },
/turf/simulated/floor/tiled/freezer,
-/area/liberia/toiletroom2)
+/area/liberia/toiletroom1)
"ED" = (
/obj/floor_decal/techfloor{
dir = 8
@@ -7864,22 +7831,14 @@
/turf/simulated/wall/r_wall/prepainted,
/area/liberia/dockinghall)
"EQ" = (
-/obj/machinery/alarm/merchant{
- pixel_y = 24
- },
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 4
},
-/obj/structure/cable/blue{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
/turf/simulated/floor/tiled/freezer,
-/area/liberia/toiletroom2)
+/area/liberia/toiletroom1)
"EZ" = (
/obj/wallframe_spawn/no_grille,
/turf/simulated/floor/plating,
@@ -8288,9 +8247,6 @@
"Lm" = (
/turf/simulated/wall/prepainted,
/area/liberia/bridge)
-"Lz" = (
-/turf/simulated/wall/prepainted,
-/area/liberia/toiletroom2)
"LJ" = (
/obj/floor_decal/borderfloor{
dir = 6
@@ -8727,6 +8683,7 @@
icon_state = "1-2"
},
/obj/machinery/door/firedoor,
+/obj/floor_decal/industrial/warning/fulltile,
/turf/simulated/floor/tiled,
/area/liberia/personellroom1)
"TB" = (
@@ -8892,9 +8849,9 @@
},
/area/liberia/solar2)
"VZ" = (
-/obj/machinery/door/airlock{
- name = "Toilet";
- dir = 8
+/obj/machinery/door/airlock/civilian{
+ dir = 4;
+ name = "Restroom"
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -8902,14 +8859,9 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/structure/cable/blue{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
/obj/machinery/door/firedoor,
/turf/simulated/floor/tiled/freezer,
-/area/liberia/toiletroom2)
+/area/liberia/toiletroom1)
"Wb" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
@@ -30059,9 +30011,9 @@ fI
qx
ip
ro
-Lz
-Lz
-BC
+OA
+OA
+Se
aa
aa
aa
@@ -30261,9 +30213,9 @@ kO
fY
kO
se
-Lz
+OA
Ez
-BC
+Se
aa
aa
aa
@@ -30463,9 +30415,9 @@ XE
ff
yh
gD
-Lz
+OA
EQ
-BC
+Se
aa
aa
aa
@@ -30665,9 +30617,9 @@ ip
LW
pD
OA
-Lz
+OA
VZ
-BC
+Se
aa
aa
aa
diff --git a/mods/_maps/sentinel/code/sentinel_shuttle.dm b/mods/_maps/sentinel/code/sentinel_shuttle.dm
index e3274c43d2026..1927e84cde8b4 100644
--- a/mods/_maps/sentinel/code/sentinel_shuttle.dm
+++ b/mods/_maps/sentinel/code/sentinel_shuttle.dm
@@ -37,7 +37,6 @@
landmark_tag = "nav_hangar_reaper"
base_area = /area/ship/patrol/command/hangar
base_turf = /turf/simulated/floor/plating
- movable_flags = MOVABLE_FLAG_EFFECTMOVE
/obj/shuttle_landmark/reaper/altdock
name = "Docking Port"
diff --git a/mods/_maps/sentinel/maps/sentinel-1.dmm b/mods/_maps/sentinel/maps/sentinel-1.dmm
index de76cf42a128b..14f495dc04812 100644
--- a/mods/_maps/sentinel/maps/sentinel-1.dmm
+++ b/mods/_maps/sentinel/maps/sentinel-1.dmm
@@ -4767,6 +4767,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/red{
dir = 4
},
+/obj/shuttle_landmark/reaper/start,
/turf/simulated/floor/plating,
/area/ship/reaper)
"jc" = (
@@ -4886,7 +4887,6 @@
icon_state = "1-2"
},
/obj/structure/catwalk,
-/obj/shuttle_landmark/reaper/start,
/turf/simulated/floor/plating,
/area/ship/patrol/command/hangar)
"jj" = (
diff --git a/mods/_maps/sentinel/maps/sentinel-2.dmm b/mods/_maps/sentinel/maps/sentinel-2.dmm
index de7ff35f4f916..a61a31cdb4266 100644
--- a/mods/_maps/sentinel/maps/sentinel-2.dmm
+++ b/mods/_maps/sentinel/maps/sentinel-2.dmm
@@ -3209,7 +3209,7 @@
/obj/floor_decal/corner/grey/diagonal{
dir = 4
},
-/obj/item/material/kitchen/rollingpin,
+/obj/item/material/rollingpin,
/obj/item/material/knife/folding/swiss,
/turf/simulated/floor/tiled/white,
/area/ship/patrol/crew/kitchen)
diff --git a/mods/_master_files/code/modules/culture_descriptor/culture/cultures_human.dm b/mods/_master_files/code/modules/culture_descriptor/culture/cultures_human.dm
index 7bad9135207aa..6f671936823cb 100644
--- a/mods/_master_files/code/modules/culture_descriptor/culture/cultures_human.dm
+++ b/mods/_master_files/code/modules/culture_descriptor/culture/cultures_human.dm
@@ -183,16 +183,6 @@
наиболее знакомы со старыми, надежными, но просроченными технологиями. Независимые люди на фронтире более \
склонны к изоляционизму и самостоятельности."
-/singleton/cultural_info/culture/human/confederate
- nickname = "Терранец"
- description = "Вы с Терры (не с Земли), что находится в системе Гильгамеш. Это столичный мир Гильгамешской \
- Колониальной Конфедерации. Её жители воплощают в себе все то, что значит быть частью ГКК. К сожалению, годы, \
- прошедшие после Гайского Конфликта, оказались нелегкими для Терры, и длительный период восстановления \
- экономики не облегчил жизнь. Люди Терры, как правило, заняты в военном, промышленном, правительственном или \
- сервисном секторах, при этом особое внимание уделяется военной службе. Терранцы сегодня, как правило, бедные, \
- озлобленные и несколько разбитые люди, злые и обиженные из-за своих потерь в Гайском Конфликте. Воспитание на \
- Терре подчеркивает странное сочетание служения государству, либерализма и милитаризма."
-
/singleton/cultural_info/culture/human/confederate_colony
nickname = "Конфедерат, житель колоний"
description = "Вы с окраин Гильгамешской Колониальной Конфедерации. Терранские колонисты имеют разные взгляды на их государство, верные сильному национальному духу, соединяющему ГКК, но \
diff --git a/mods/_master_files/code/modules/mob/living/carbon/human/human_helpers.dm b/mods/_master_files/code/modules/mob/living/carbon/human/human_helpers.dm
new file mode 100644
index 0000000000000..41fa05e35af51
--- /dev/null
+++ b/mods/_master_files/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -0,0 +1,5 @@
+/mob/living/carbon/human/has_meson_effect()
+ . = FALSE
+ for(var/obj/screen/equipment_screen in equipment_overlays) // check through our overlays to see if we have any source of the meson overlay
+ if (equipment_screen.color == GLOB.global_hud.meson.color)
+ return TRUE
diff --git a/mods/_master_files/code/modules/psionics/events/mini_spasm.dm b/mods/_master_files/code/modules/psionics/events/mini_spasm.dm
index 5660aa2fb37f2..3ba16a65658a4 100644
--- a/mods/_master_files/code/modules/psionics/events/mini_spasm.dm
+++ b/mods/_master_files/code/modules/psionics/events/mini_spasm.dm
@@ -11,6 +11,18 @@
)
sound_to(world, sound(alarm_sound))
+/datum/event/minispasm/start()
+ var/list/victims = list()
+ for(var/obj/item/device/radio/radio in GLOB.listening_objects)
+ if(radio.on)
+ for(var/mob/living/victim in view(radio.canhear_range, radio.loc))
+ if(isnull(victims[victim]) && victim.stat == CONSCIOUS && !victim.ear_deaf)
+ victims[victim] = radio
+ for(var/thing in victims)
+ var/mob/living/victim = thing
+ var/obj/item/device/radio/source = victims[victim]
+ do_spasm(victim, source)
+
/datum/event/minispasm/end()
priority_announcement.Announce( \
"PRIORITY ALERT: SIGNAL BROADCAST HAS CEASED. Personnel are cleared to resume use of non-hardened radio transmission equipment. Have a nice day.", \
diff --git a/mods/adherent_discharge/code/adherent.dm b/mods/adherent_discharge/code/adherent.dm
index 681dec209ae83..cdeea81675e41 100644
--- a/mods/adherent_discharge/code/adherent.dm
+++ b/mods/adherent_discharge/code/adherent.dm
@@ -1,3 +1,6 @@
+/datum/species/adherent
+ additional_languages = 1
+
/obj/item/organ/internal/cell/adherent
var/ready_to_charge
@@ -19,3 +22,17 @@
adherent_core.ready_to_charge = FALSE
to_chat(src, SPAN_WARNING("You have relieved the tension of your tentacles."))
+
+/singleton/cultural_info/culture/adherent
+ secondary_langs = list(
+ LANGUAGE_HUMAN_EURO,
+ LANGUAGE_HUMAN_CHINESE,
+ LANGUAGE_HUMAN_ARABIC,
+ LANGUAGE_HUMAN_INDIAN,
+ LANGUAGE_HUMAN_IBERIAN,
+ LANGUAGE_HUMAN_RUSSIAN,
+ LANGUAGE_SPACER,
+ LANGUAGE_VOX,
+ LANGUAGE_CULT,
+ LANGUAGE_PRIMITIVE
+ )
diff --git a/mods/ai/code/borgs_equipments.dm b/mods/ai/code/borgs_equipments.dm
index e3d3f464f5b57..07d3bb727fae0 100644
--- a/mods/ai/code/borgs_equipments.dm
+++ b/mods/ai/code/borgs_equipments.dm
@@ -127,7 +127,7 @@
/obj/item/device/scanner/plant,
/obj/item/storage/plants,
/obj/item/robot_harvester,
- /obj/item/material/kitchen/rollingpin,
+ /obj/item/material/rollingpin,
/obj/item/material/knife/kitchen,
/obj/item/crowbar,
/obj/item/rsf,
diff --git a/mods/anomaly/_anomaly.dme b/mods/anomaly/_anomaly.dme
index 72169675cabb6..ad56133c75f4a 100644
--- a/mods/anomaly/_anomaly.dme
+++ b/mods/anomaly/_anomaly.dme
@@ -5,58 +5,76 @@
// Далее просто включай свой код
// #include "code/something.dm"
#include "code\anomaly_admin.dm" //Админские кнопочки
-#include "code\anomaly_core.dm" //Ядро и основа аномалий
-#include "code\anomaly_graphic.dm" //Графика и внешний вид
-#include "code\anomaly_light.dm" //Освещение, вспышки и тому подобное
-#include "code\anomaly_parts.dm" //Код, отвечающий за многотайтловость аномалий
-#include "code\interact_with_items.dm" //Взаимодействие аномалий с предметами и обьектами
-#include "code\anomaly_loop.dm" //Код, отвечающий за длительную обработку аномалии
-#include "code\anomaly_deleting.dm" //Удаление аномалий, артефактов и вспомогательных частей
-#include "code\anomaly_preload.dm" //Предзарядка аномалии
-#include "code\anomaly_sound.dm" //Звуки у аномалий
-#include "code\anomaly_randomize.dm" //Рандомизация параметров аномалии
#include "code\anomaly_controller.dm" //Контроллер аномалий
-#include "code\anomaly_walking.dm" //Бродячие аномалии
-#include "code\anomaly_electrostatic.dm" //Электростатический расчёт
+#include "code\anomaly_defines.dm"
+
+
+//Аномалии
+//Типы аномалий
+#include "code\anomalies\single\cooler.dm"
+#include "code\anomalies\single\electra.dm"
+#include "code\anomalies\single\heater.dm"
+#include "code\anomalies\single\rvach.dm"
+#include "code\anomalies\single\tramplin.dm"
+#include "code\anomalies\single\ventilyator.dm"
+#include "code\anomalies\single\vspishka.dm"
+#include "code\anomalies\single\zharka.dm"
+//аномалии 3 на 3
+#include "code\anomalies\threeandthree\cooler_3x3.dm"
+#include "code\anomalies\threeandthree\electra_3x3.dm"
+#include "code\anomalies\threeandthree\heater_3x3.dm"
+#include "code\anomalies\threeandthree\rvach_3x3.dm"
+//аномалии 2 на 2
+#include "code\anomalies\twoandtwo\cooler2x2.dm"
+#include "code\anomalies\twoandtwo\heater2x2.dm"
+//Сам код аномалий
+#include "code\anomalies\anomalies_premades.dm" //Премейды аномалий
+#include "code\anomalies\anomaly_core.dm"//Ядро аномок
+#include "code\anomalies\anomaly_deleting.dm" //Код отвечающий за удаление аномалий
+#include "code\anomalies\anomaly_electrostatic.dm" //Код отвечающий за просчёт подверженности турфа аномалией.
+#include "code\anomalies\anomaly_graphic.dm" //Графика, спрайты - всё тут
+#include "code\anomalies\anomaly_loop.dm" //Аномалии с длительной работой/воздействием
+#include "code\anomalies\anomaly_parts.dm" //Мультитайтловость аномалий
+#include "code\anomalies\anomaly_preload.dm" //Код, отвечающий за предзарядку аномалий перед ударом
+#include "code\anomalies\anomaly_randomize.dm" //Рандомизация параметров и типа аномалий
+#include "code\anomalies\anomaly_sound.dm" // Звуки, опять звуки - всё тут
+#include "code\anomalies\anomaly_walking.dm" // [Work In Progress] - Блуждающие аномалии
+#include "code\anomalies\interact_with_items.dm" // Влияние артефактов на предметы. TODO - варка артефактов и прочее
+
+
+
+//Код артефактов и всё с ними связанное
+#include "code\artefacts\_anomaly_artefacts.dm" //Ядро артефактов
+#include "code\artefacts\_artefact_external_interact.dm" //реакции на внешние события на артефакт/носителя
+#include "code\artefacts\_artefact_processing.dm" //Процессинг/постоянная обработка артефакта
+#include "code\artefacts\_interact_with_artefacts.dm" //Интеракции с артефактом (Персонаж/URM)
+#include "code\artefacts\_artefact_spawn.dm"
+#include "code\artefacts\artefact_gravi.dm"
+#include "code\artefacts\artefact_pruzhina.dm"
+#include "code\artefacts\artefact_svetlyak.dm"
+#include "code\artefacts\artefact_zjar.dm"
+#include "code\artefacts\artefact_flyer.dm"
+//#include "code\artefacts\artefact_zjemchug.dm"
+
+
//Детекторы и прочее оборудование
#include "code\detectors_and_etc\bolt.dm"
#include "code\detectors_and_etc\detector.dm"
+#include "code\detectors_and_etc\gurza_detector.dm"
#include "code\detectors_and_etc\collector.dm"
+#include "code\detectors_and_etc\deployer.dm"
#include "code\detectors_and_etc\beacon.dm"
#include "code\detectors_and_etc\research_machine.dm"
-//Код артефактов и всё с ними связанное
-#include "code\artifacts\anomaly_artifact_spawn.dm"
-#include "code\artifacts\anomaly_artifacts.dm"
-#include "code\artifacts\interact_with_artefacts.dm"
-#include "code\artifacts\artefact_pruzhina.dm"
-#include "code\artifacts\artefact_zjar.dm"
-#include "code\artifacts\artefact_svetlyak.dm"
-#include "code\artifacts\artefact_gravi.dm"
-
-
-//Все типы аномалий
-#include "code\anomalies\electra.dm"
-#include "code\anomalies\rvach.dm"
-#include "code\anomalies\vspishka.dm"
-#include "code\anomalies\single\tramplin.dm"
-#include "code\anomalies\single\zjarka.dm"
-#include "code\anomalies\heater.dm"
-#include "code\anomalies\cooler.dm"
-// #include "code\anomalies\ventilyator.dm"
-//Аномалия 2 на 2
-#include "code\anomalies\twoandtwo\heater2x2.dm"
-#include "code\anomalies\twoandtwo\cooler2x2.dm"
-
-
-//Аномалия 3 на 3
-#include "code\anomalies\threeandthree\electra_3x3.dm"
-#include "code\anomalies\threeandthree\rvach_3x3.dm"
-#include "code\anomalies\threeandthree\heater_3x3.dm"
-#include "code\anomalies\threeandthree\cooler_3x3.dm"
+//Погода и эффекты на мониторе
+#include "code\monitor_effects\monitor_core.dm"
+#include "code\monitor_effects\monitor_vars.dm"
+#include "code\monitor_effects\snow_monitor_effect.dm"
+#include "code\monitor_effects\swamp_monitor_effect.dm"
+#include "code\monitor_effects\vulcan_monitor_effect.dm"
//Размещение аномалий в игре
@@ -64,15 +82,31 @@
#include "code\spawn_anomalies_protocol\spawn_anomaly_with_big_artefact.dm" //Код, отвечающий за спавн аномалий вокруг больших артефактов
#include "code\spawn_anomalies_protocol\spawn_with_ruins.dm"
#include "code\spawn_anomalies_protocol\bsd_event_protocol.dm"
-#include "code\spawn_anomalies_protocol\planet_spawn_types\vulcanic.dm" //Вулканическая планета
-#include "code\spawn_anomalies_protocol\planet_spawn_types\ice.dm" //Ледяная планета
-// #include "code\spawn_anomalies_protocol\planet_spawn_types\flying.dm" //Летающие острова
+//Планетарный спавн
+#include "code\spawn_anomalies_protocol\planet_spawn_protocol\_planet_spawn_core.dm"
+//Летающие острова[WIP]
+#include "code\spawn_anomalies_protocol\planet_spawn_protocol\flying_planet\clouds.dm"
+#include "code\spawn_anomalies_protocol\planet_spawn_protocol\flying_planet\flying.dm"
+//Ледяная планета[WIP]
+#include "code\spawn_anomalies_protocol\planet_spawn_protocol\ice.dm"
+//Вулкан
+#include "code\spawn_anomalies_protocol\planet_spawn_protocol\vulcanic.dm"
+//Саргасово болото [WIP-WIP]
+// #include "code\spawn_anomalies_protocol\planet_spawn_protocol\sargas.dm"
#include "code\spawn_anomalies_protocol\spawn_on_planet.dm" //Спавн на планетах
-#include "code\anomalies\threeandthree\anomalies_premades.dm" //"Заготовки" аномалий
+
//Карты, диреликты и прочее
#include "maps\electra_ruins\electra_ruins.dm"
-#include "maps\zjarka_ruins\zjarka_ruins.dm"
+#include "maps\zharka_ruins\zharka_ruins.dm"
+//Код островов
+#include "maps\flying_islands\flying_island.dm"
+#include "maps\flying_islands\flying_island_ball.dm"
+#include "maps\flying_islands\flying_island_2.dm"
+#include "maps\flying_islands\flying_island_3.dm"
+#include "maps\flying_islands\flying_island_4.dm"
+#include "maps\flying_islands\flying_island_5.dm"
+
#endif
diff --git a/mods/anomaly/code/README.md b/mods/anomaly/code/README.md
deleted file mode 100644
index cb166076e874f..0000000000000
--- a/mods/anomaly/code/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-Привет
-Прежде чем вы полезете смотреть код у меня будет к вам просьба
-НЕ лезьте в код с целью подсмотреть как работает тот или определённый механ, это разрушает всю идею исследования
-НЕ распростроняйте информацию о работе аномалий и прочего в общих чатах, это тоже очень плохо влияет на восприятие!
-
-mods\anomaly\code\anomalies <-- Все аномалии мода и их функционирование
-mods\anomaly\code\artifacts <-- Все артефакты, их появление, свойства и интеракции с ними
-mods\anomaly\code\detectors_and_etc <-- Различное оборудование для борьбы с аномалиями, их обнаружение и прочее
-mods\anomaly\code\spawn_anomalies_protocol <-- Вся логика отвечающая за то как в игре размещаются и появляются аномалии. Более подробно рассписано в начале файлов: mods\anomaly\code\spawn_anomalies_protocol\core_spawn_protocol.dm
-mods\anomaly\code\spawn_anomalies_protocol\spawn_with_ruins.dm
diff --git a/mods/anomaly/code/anomalies/threeandthree/anomalies_premades.dm b/mods/anomaly/code/anomalies/anomalies_premades.dm
similarity index 88%
rename from mods/anomaly/code/anomalies/threeandthree/anomalies_premades.dm
rename to mods/anomaly/code/anomalies/anomalies_premades.dm
index eb0cc2d695d80..1a95ef758a421 100644
--- a/mods/anomaly/code/anomalies/threeandthree/anomalies_premades.dm
+++ b/mods/anomaly/code/anomalies/anomalies_premades.dm
@@ -20,7 +20,7 @@
.=..()
-/obj/anomaly/thamplin/random
+/obj/anomaly/tramplin/random
random_throw_dir = TRUE
/obj/anomaly/thamplin/random/always_powerfull_walking
@@ -29,13 +29,13 @@
walk_time = 2 SECONDS
chance_spawn_walking = 100
-/obj/anomaly/zjarka/walking
+/obj/anomaly/zharka/walking
chance_spawn_walking = 100
-/obj/anomaly/zjarka/short_effect
+/obj/anomaly/zharka/short_effect
effect_range = 0
-/obj/anomaly/zjarka/long_effect
+/obj/anomaly/zharka/long_effect
effect_range = 2
/obj/anomaly/electra/three_and_three/preload
diff --git a/mods/anomaly/code/anomaly_core.dm b/mods/anomaly/code/anomalies/anomaly_core.dm
similarity index 87%
rename from mods/anomaly/code/anomaly_core.dm
rename to mods/anomaly/code/anomalies/anomaly_core.dm
index 105a0e08846bb..d62bcad26c767 100644
--- a/mods/anomaly/code/anomaly_core.dm
+++ b/mods/anomaly/code/anomalies/anomaly_core.dm
@@ -5,14 +5,12 @@
-Обработка перезарядки, КД аномалии
-Инициализация аномалии в мире
*/
-#define LONG_ANOMALY_EFFECT 1
-#define MOMENTUM_ANOMALY_EFFECT 2
-#define DEFAULT_ANOMALY_EFFECT 0
-#define isanomaly(A) istype(A, /obj/anomaly)
/obj/anomaly
name = "Аномалия. Вы не должны это видеть."
- anchored = TRUE //Чтоб аномалию не двигало в случае чего
+ anchored = TRUE //Чтоб аномалию не двигало в случае чего.
+ //Позволяет быстро определять для кода какая именно аномалия (electra, Zharka, и прочее)
+ var/anomaly_tag
//COULDOWN AND SMTH
///Аномалия уходит на КД после срабатывания?
var/can_be_discharged = FALSE
@@ -34,6 +32,8 @@
var/list/special_iniciators = list()
///Список этих самых специальных условий для аномалии
var/list/special_iniciators_flags = list()
+ ///Вес на который реагирует аномалия. Если FALSE - не смотрит на вес. Если вес обьекта выше переменной - на него реагируют. Ниже - нет.
+ var/weight_sensity = FALSE
/// Радиус, в котором бьёт аномалия. Ваша аномалия может "Чуять" на одном расстоянии, а бить на более большом!
var/effect_range = 0
@@ -50,6 +50,10 @@
///Аномалия по причине пересечения или ещё какой причине проверяет, может ли она "Взвестить от этого инициатора"
/obj/anomaly/proc/can_be_activated(atom/movable/target)
+ if(weight_sensity && isitem(target))
+ var/obj/item/detected_item = target
+ if(weight_sensity != detected_item.w_class || weight_sensity > detected_item.w_class) //Вес предмета ниже чем чувствительность аномалии.
+ return "too small weight"
for(var/i in iniciators)
if(istype(target, i))
return TRUE
@@ -67,12 +71,13 @@
return FALSE
///Сама активация аномалии
-/obj/anomaly/proc/activate_anomaly()
+/obj/anomaly/proc/activate_anomaly(activate_friends = FALSE)
return
//Обязательно вызываем обработку результатов активации
/obj/anomaly/activate_anomaly()
.=..()
+ SSanom.anomalies_activated_times++
handle_after_activation()
@@ -165,7 +170,10 @@
//Спавн аномалии, её размещение и т.д
/obj/anomaly/Initialize()
. = ..()
- SSanom.add_anomaly_in_list(src)
+ if(is_helper)
+ SSanom.add_anomaly_in_helpers(src)
+ else
+ SSanom.add_anomaly_in_cores(src)
preload_time = cooldown_time
if(ranzomize_with_initialize)
ranzomize_parameters()
diff --git a/mods/anomaly/code/anomaly_deleting.dm b/mods/anomaly/code/anomalies/anomaly_deleting.dm
similarity index 87%
rename from mods/anomaly/code/anomaly_deleting.dm
rename to mods/anomaly/code/anomalies/anomaly_deleting.dm
index 2435c24094a05..fffcc73409271 100644
--- a/mods/anomaly/code/anomaly_deleting.dm
+++ b/mods/anomaly/code/anomalies/anomaly_deleting.dm
@@ -5,7 +5,7 @@
delete_anomaly()
/obj/anomaly/proc/delete_anomaly()
- SSanom.remove_anomaly_from_list(src)
+ SSanom.remove_anomaly_from_cores(src)
calculate_effected_turfs_from_deleting_anomaly(src)
if(multitile)
for(var/obj/anomaly/part in list_of_parts)
@@ -13,6 +13,7 @@
qdel(src)
/obj/anomaly/part/delete_anomaly()
+ SSanom.remove_anomaly_from_helpers(src)
qdel(src)
diff --git a/mods/anomaly/code/anomaly_electrostatic.dm b/mods/anomaly/code/anomalies/anomaly_electrostatic.dm
similarity index 100%
rename from mods/anomaly/code/anomaly_electrostatic.dm
rename to mods/anomaly/code/anomalies/anomaly_electrostatic.dm
diff --git a/mods/anomaly/code/anomaly_graphic.dm b/mods/anomaly/code/anomalies/anomaly_graphic.dm
similarity index 68%
rename from mods/anomaly/code/anomaly_graphic.dm
rename to mods/anomaly/code/anomalies/anomaly_graphic.dm
index 9268417608b07..32e4a1e5d0c99 100644
--- a/mods/anomaly/code/anomaly_graphic.dm
+++ b/mods/anomaly/code/anomalies/anomaly_graphic.dm
@@ -7,11 +7,22 @@
var/activation_effect_type
///Эффект в идле
var/idle_effect_type = "none"
+ ///Как видят аномалию при обнаружении
plane = OBSERVER_PLANE
///Здесь вам потребуется вручную указать длинну анимации, для того чтоб игра вновь сделала её невидимой и некликабельной для игрока
//Костыль, но лучше решения ещё не придумал
var/momentum_animation_long = 0.6 SECONDS
+
+ ///Сделать вспышку после активации?
+ var/light_after_activation = FALSE
+ ///Время, которое будет держаться свет от активации
+ var/time_of_light = 1 SECOND
+ ///Цвет вспышки
+ var/color_of_light = COLOR_WHITE
+ var/range_of_light = 3
+ var/power_of_light = 2
+
/obj/anomaly/proc/do_momentum_animation()
if(activation_effect_type)
invisibility = 0
@@ -37,3 +48,18 @@
plane = WARP_EFFECT_PLANE
appearance_flags = DEFAULT_APPEARANCE_FLAGS | TILE_BOUND
z_flags = ZMM_IGNORE
+
+
+
+
+///Запускаем свет/вспышку
+/obj/anomaly/proc/start_light()
+ set_light(3, 2, color_of_light)
+ addtimer(new Callback(src, PROC_REF(stop_light)), time_of_light)
+
+///Убираем свет/вспышку
+/obj/anomaly/proc/stop_light()
+ set_light(0)
+
+/obj/anomaly/proc/get_detection_icon()
+ return detection_icon_state
diff --git a/mods/anomaly/code/anomaly_loop.dm b/mods/anomaly/code/anomalies/anomaly_loop.dm
similarity index 100%
rename from mods/anomaly/code/anomaly_loop.dm
rename to mods/anomaly/code/anomalies/anomaly_loop.dm
diff --git a/mods/anomaly/code/anomaly_parts.dm b/mods/anomaly/code/anomalies/anomaly_parts.dm
similarity index 89%
rename from mods/anomaly/code/anomaly_parts.dm
rename to mods/anomaly/code/anomalies/anomaly_parts.dm
index 5f96b749ff8d0..9636b7acb5479 100644
--- a/mods/anomaly/code/anomaly_parts.dm
+++ b/mods/anomaly/code/anomalies/anomaly_parts.dm
@@ -5,6 +5,8 @@
/obj/anomaly
///Аномалия состоит из множества частей?
var/multitile = FALSE
+ ///Означает, что обьект является вспомогательной частью. Применяется для контроллера.
+ var/is_helper = FALSE
///Радиус в котором спавнятся остальные части от ядра
var/multititle_parts_range = 1
var/list/list_of_parts
@@ -39,10 +41,15 @@
part.core = src
///Этот обьект в случае детектирования подходящих условий, передаст информацию ядру.
+/obj/anomaly/part/Initialize()
+ . = ..()
+ SSanom.add_anomaly_in_helpers(src)
+
/obj/anomaly/part
///ЯДРО, которму и передатся информация
var/obj/anomaly/core
name = "Вспомогательная часть аномалии."
+ is_helper = TRUE
///Если какой-либо атом пересекает вспомогательную часть - передаём сигнал ядру
@@ -66,3 +73,7 @@
return TRUE
return FALSE
+
+/obj/anomaly/part/get_detection_icon()
+ if(core)
+ return core.get_detection_icon()
diff --git a/mods/anomaly/code/anomaly_preload.dm b/mods/anomaly/code/anomalies/anomaly_preload.dm
similarity index 100%
rename from mods/anomaly/code/anomaly_preload.dm
rename to mods/anomaly/code/anomalies/anomaly_preload.dm
diff --git a/mods/anomaly/code/anomaly_randomize.dm b/mods/anomaly/code/anomalies/anomaly_randomize.dm
similarity index 100%
rename from mods/anomaly/code/anomaly_randomize.dm
rename to mods/anomaly/code/anomalies/anomaly_randomize.dm
diff --git a/mods/anomaly/code/anomaly_sound.dm b/mods/anomaly/code/anomalies/anomaly_sound.dm
similarity index 91%
rename from mods/anomaly/code/anomaly_sound.dm
rename to mods/anomaly/code/anomalies/anomaly_sound.dm
index 0a53359ac5cae..e877262ed2649 100644
--- a/mods/anomaly/code/anomaly_sound.dm
+++ b/mods/anomaly/code/anomalies/anomaly_sound.dm
@@ -5,7 +5,7 @@
///Путь до звука
var/sound_type
///Мощность аномалии
- var/effect_power = DEFAULT_ANOMALY_EFFECT
+ var/effect_power = MOMENTUM_ANOMALY_EFFECT
//У аномалии есть статичный звук
var/have_static_sound = FALSE
//Путь до звука статики
diff --git a/mods/anomaly/code/anomaly_walking.dm b/mods/anomaly/code/anomalies/anomaly_walking.dm
similarity index 100%
rename from mods/anomaly/code/anomaly_walking.dm
rename to mods/anomaly/code/anomalies/anomaly_walking.dm
diff --git a/mods/anomaly/code/interact_with_items.dm b/mods/anomaly/code/anomalies/interact_with_items.dm
similarity index 58%
rename from mods/anomaly/code/interact_with_items.dm
rename to mods/anomaly/code/anomalies/interact_with_items.dm
index 5f7d86b7a6008..7f1927cbb80f8 100644
--- a/mods/anomaly/code/interact_with_items.dm
+++ b/mods/anomaly/code/anomalies/interact_with_items.dm
@@ -1,10 +1,12 @@
-//Здесь расположен код отвечающие за взаимодействие с предметами.
+//Здесь расположен код отвечающие за взаимодействие аномалий с предметами.
/proc/anything_in_ashes(atom/input_item)
var/turf/to_place = get_turf(input_item)
+ input_item.visible_message(SPAN_BAD("[input_item] плавится!"))
new /obj/decal/cleanable/ash (to_place)
qdel(input_item)
/proc/anything_in_remains(atom/input_item)
var/turf/to_place = get_turf(input_item)
+ input_item.visible_message(SPAN_BAD("Тело [input_item] испепелило до костей!"))
new /obj/item/remains (to_place)
qdel(input_item)
diff --git a/mods/anomaly/code/anomalies/cooler.dm b/mods/anomaly/code/anomalies/single/cooler.dm
similarity index 95%
rename from mods/anomaly/code/anomalies/cooler.dm
rename to mods/anomaly/code/anomalies/single/cooler.dm
index 0ab7a0be8c6eb..cf1d353b26913 100644
--- a/mods/anomaly/code/anomalies/cooler.dm
+++ b/mods/anomaly/code/anomalies/single/cooler.dm
@@ -1,7 +1,8 @@
/obj/anomaly/cooler
name = "Refractions of light"
+ anomaly_tag = "Cooler"
with_sound = FALSE
- can_born_artifacts = TRUE
+ can_born_artefacts = TRUE
//Длинна эффекта подогрева
effect_time = 30 SECONDS
effect_type = LONG_ANOMALY_EFFECT
diff --git a/mods/anomaly/code/anomalies/electra.dm b/mods/anomaly/code/anomalies/single/electra.dm
similarity index 57%
rename from mods/anomaly/code/anomalies/electra.dm
rename to mods/anomaly/code/anomalies/single/electra.dm
index 689bac90980fc..e082792d8a38b 100644
--- a/mods/anomaly/code/anomalies/electra.dm
+++ b/mods/anomaly/code/anomalies/single/electra.dm
@@ -1,14 +1,16 @@
/obj/anomaly/electra
name = "Lightning strikes"
+ anomaly_tag = "Electra"
with_sound = TRUE
sound_type = 'mods/anomaly/sounds/electra_blast.ogg'
activation_effect_type = "electra_activation"
idle_effect_type = "electra_idle"
+ detection_icon_state = "electra_anomaly"
layer = ABOVE_HUMAN_LAYER
light_after_activation = TRUE
color_of_light = COLOR_WHITE
time_of_light = 1.5 SECONDS
- can_born_artifacts = TRUE
+ can_born_artefacts = TRUE
special_iniciators = list(
/obj/item
)
@@ -38,8 +40,9 @@
can_be_preloaded = TRUE
being_preload_chance = 30
detectable_effect_range = TRUE
+ detection_skill_req = SKILL_EXPERIENCED
-/obj/anomaly/electra/activate_anomaly()
+/obj/anomaly/electra/activate_anomaly(activate_friends = TRUE)
last_activation_time = world.time//Без этой строчки некоторые электры входят в вечный цикл зарядки и удара, костыль? Возможно
if(need_preload)
start_preload()
@@ -55,10 +58,10 @@
for(var/atom/movable/atoms in objs)
get_effect_by_anomaly(atoms)
//Если электра является подтипом теслы, она должна взвести все другие теслы рядом
- if(subtype_tesla)
+ if(subtype_tesla && activate_friends)
var/list/victims_not_used = list()
var/list/objs_second = list()
- get_mobs_and_objs_in_view_fast(T, effect_range * 6, victims_not_used, objs_second)
+ get_mobs_and_objs_in_view_fast(T, 3, victims_not_used, objs_second)
for(var/obj/anomaly/electra/electra_anomalies in objs_second)
if(electra_anomalies.isready() && electra_anomalies.subtype_tesla)
unwait_activate_anomaly(electra_anomalies)
@@ -66,13 +69,14 @@
if(istype(anomaly_parts.core, /obj/anomaly/electra))
var/obj/anomaly/electra/electra_anomalies = anomaly_parts.core
if(electra_anomalies.isready() && electra_anomalies.subtype_tesla)
- unwait_activate_anomaly(electra_anomalies)
+ unwait_activate_anomaly(electra_anomalies, activate_friends)
.=..()
/obj/anomaly/electra/proc/unwait_activate_anomaly(obj/anomaly/electra/anomaly)
+ //Тесла должна взводить лишь соседние теслы за раз.
set waitfor = FALSE
last_activation_time = world.time
- anomaly.activate_anomaly()
+ anomaly.activate_anomaly(FALSE)
/obj/anomaly/electra/get_effect_by_anomaly(atom/movable/target)
//Понадобится нам, если обьект по какой-либо причине будет удалён из-за удара, дабы "лучу" было куда идти
@@ -83,56 +87,85 @@
return
//Если цель подходит под критерии удара, мы рисуем молнию
var/create_line = FALSE
- //Если целью является адхерант, мы лишь заряжаем его батарею
- if(istype(target, /mob/living/carbon/human/adherent))
+
+
+
+
+ //Жертвой удара является моб или его наследник(ребёнок)
+ if(istype(target, /mob/living))
+ var/mob/living/victim_target = target
+ SSanom.add_last_attack(target, "Электра")
create_line = TRUE
- var/mob/living/carbon/human/adherent/adherent = target
- var/obj/item/cell/power_cell
- var/obj/item/organ/internal/cell/cell = locate() in adherent.internal_organs
- if(cell && cell.cell)
- power_cell = cell.cell
- if(power_cell)
- power_cell.charge = power_cell.maxcharge
- to_chat(target, SPAN_NOTICE("Your [power_cell] has been charged to capacity."))
-
- //Цель удара - человек
- else if(istype(target, /mob/living/carbon/human))
- for(var/obj/item/artefact/zjar/defense_artefact in target)
- if(defense_artefact.current_integrity > 1)
- defense_artefact.current_integrity--
- to_chat(target, SPAN_GOOD("[defense_artefact] вспыхивает красной вспышкой"))
+ var/list/result_effects = calculate_artefact_reaction(target, "Электра")
+ if(result_effects)
+ if(result_effects.Find("Впитывает электроудар"))
+ return
+ if(result_effects.Find("Уворачивается от молнии, молния идёт дальше"))
+ var/anomaly_to_victim_dir = get_dir(src, victim_target)
+ var/new_turf = get_ranged_target_turf(victim_target, anomaly_to_victim_dir, 1)
+ target_turf = new_turf
+ for(var/atom/movable/atom in new_turf)
+ get_effect_by_anomaly(atom)
+ beam = src.Beam(BeamTarget = target_turf, icon_state = "electra_long",icon='mods/anomaly/icons/effects.dmi',time = 0.3 SECONDS)
+ victim_target.dodge_animation()
+ to_chat(victim_target, SPAN_GOOD("Видя удар молнии словно в замедлении, вы умудряетесь увернуться от него")
+ )
+ return
+ victim_target.inform_about_electroanomaly_act("thunderbolt")
+ //Если целью является адхерант, мы лишь заряжаем его батарею
+ if(istype(target, /mob/living/carbon/human/adherent))
+ var/mob/living/carbon/human/adherent/adherent = target
+ var/obj/item/cell/power_cell
+ var/obj/item/organ/internal/cell/cell = locate() in adherent.internal_organs
+ if(cell && cell.cell)
+ power_cell = cell.cell
+ if(power_cell)
+ power_cell.charge = power_cell.maxcharge
+ to_chat(target, SPAN_NOTICE("Your [power_cell] has been charged to capacity."))
+
+ //Цель удара - человек
+ else if(ishuman(target))
+ var/mob/living/carbon/human/victim = target
+ if(victim.health == 0)
+ SSanom.add_last_gibbed(target, "Электра")
+ anything_in_remains(victim)
+ return
+
+ if(victim.lying) //Если цель лежит нам не нужно просчитывать путь до земли. Просто делаем удар в любую конечность
+ victim.electoanomaly_act(50, src)
else
- qdel(defense_artefact)
- to_chat(target, SPAN_BAD("[defense_artefact] вспыхивает ярчайшей красной вспышкой и пропадает."))
- to_chat(target, SPAN_GOOD("Вы чувствуете сильный, но приятный ЖАР в месте удара. Но не боль."))
- return
- var/mob/living/carbon/human/victim = target
- var/list/organs = victim.list_organs_to_earth()
- for(var/picked_organ in organs)
- victim.electoanomaly_act(50, src, picked_organ)
- //Если целью является борг, мы так же наносим ему электроудар
- else if(istype(target, /mob/living/silicon/robot ))
- create_line = TRUE
- var/mob/living/silicon/robot/borg = target
- borg.apply_damage(50, DAMAGE_BURN, def_zone = BP_CHEST)
- to_chat(borg, SPAN_DANGER("Powerful electric shock detected!"))
+ var/list/organs = victim.list_organs_to_earth()
+ var/damage = 50/LAZYLEN(organs)
+ for(var/picked_organ in organs)
+ victim.electoanomaly_act(damage, src, picked_organ)
+
+ //Если целью является борг, мы так же наносим ему электроудар
+ else if(istype(target, /mob/living/silicon/robot ))
+ create_line = TRUE
+ var/mob/living/silicon/robot/borg = target
+ borg.apply_damage(50, DAMAGE_BURN, def_zone = BP_CHEST)
+ to_chat(borg, SPAN_DANGER("Powerful electric shock detected!"))
+
+ //Если целью является мех, мы наносим электроудар и эми удар
+ else if(istype(target, /mob/living/exosuit))
+ create_line = TRUE
+ var/mob/living/exosuit/mech = target
+ mech.apply_damage(100, DAMAGE_BURN)
+ mech.emp_act(1)
+
+ //Если целью является симплмоб, мы наносим электроудар
+ else if(istype(target, /mob/living))
+ create_line = TRUE
+ var/mob/living/victim = target
+ if(victim.health == 0)
+ anything_in_remains(victim)
+ return
+ victim.electoanomaly_act(100, src)
+
+ stun_and_jittery_by_electra(target)
- //Если целью является мех, мы наносим электроудар и эми удар
- else if(istype(target, /mob/living/exosuit))
- create_line = TRUE
- var/mob/living/exosuit/mech = target
- mech.apply_damage(100, DAMAGE_BURN)
- mech.emp_act(1)
else if(istype(target, /obj/structure/mech_wreckage ))
qdel(target)
- //Если целью является моб, мы наносим электроудар
- else if(istype(target, /mob/living))
- create_line = TRUE
- var/mob/living/victim = target
- if(victim.health == 0)
- anything_in_remains(victim)
- return
- victim.electoanomaly_act(100, src)
//Если целью является пепел - мы его удаляем, чтоб не засорять аномалию
else if(istype(target, /obj/decal/cleanable/ash))
@@ -150,13 +183,25 @@
create_line = TRUE
anything_in_ashes(target)
+
+
//Этот код и создаст саму молнию от центра аномалии до жертвы
if(create_line)
beam = src.Beam(BeamTarget = target_turf, icon_state = "electra_long",icon='mods/anomaly/icons/effects.dmi',time = 0.3 SECONDS)
-
+/obj/anomaly/electra/proc/stun_and_jittery_by_electra(mob/living/user)
+ if(ishuman(user) && !user.incapacitated()) //Человек в сознании
+ var/mob/living/carbon/human/victim = user
+ if(prob(14 * victim.get_skill_value(SKILL_HAULING))) //Максимально 70
+ to_chat(user, SPAN_GOOD("Вы стойко переносите удар тока."))
+ return
+ else
+ to_chat(user, SPAN_BAD("Сильный удар тока сбивает вас с ног!"))
+ user.Weaken(1)
+ user.make_jittery(min(50, 200))
+ user.stun_effect_act(1,1)
///Отдельная функция для просчёта влияния электры
@@ -165,19 +210,17 @@
return 0
apply_damage(shock_damage, DAMAGE_BURN, def_zone, used_weapon="Electrocution")
+ return shock_damage
- stun_effect_act(1,1, def_zone)
+///Выводит в чат о электроударе
+/mob/living/proc/inform_about_electroanomaly_act(source)
src.visible_message(
SPAN_WARNING("[src] was electrocuted[source ? " by the [source]" : ""]!"), \
SPAN_DANGER("You feel a powerful shock course through your body!"), \
SPAN_WARNING("You hear a heavy electrical crack.") \
)
- Weaken(1)
- make_jittery(min(shock_damage*5, 200))
- return shock_damage
-
//Выдаёт список конечностей от введёной конечности до земли
/mob/living/carbon/human/proc/list_organs_to_earth(input_organ)
var/list/result_damaged_zones = list()
@@ -222,3 +265,12 @@
else if(attack_zone == BP_R_LEG)
LAZYADD(result_damaged_zones, BP_R_FOOT)
return result_damaged_zones
+
+
+/obj/anomaly/electra/get_detection_icon()
+ if(effect_range == 1)
+ return "electra_detection"
+ else if(effect_range == 2)
+ return "tesla_first_detection"
+ else if(effect_range > 2)
+ return "tesla_second_detection"
diff --git a/mods/anomaly/code/anomalies/heater.dm b/mods/anomaly/code/anomalies/single/heater.dm
similarity index 92%
rename from mods/anomaly/code/anomalies/heater.dm
rename to mods/anomaly/code/anomalies/single/heater.dm
index f216582d914ed..ca5eed10880b1 100644
--- a/mods/anomaly/code/anomalies/heater.dm
+++ b/mods/anomaly/code/anomalies/single/heater.dm
@@ -1,11 +1,13 @@
/obj/anomaly/heater
name = "Refractions of light"
+ anomaly_tag = "Heater"
with_sound = FALSE
- can_born_artifacts = TRUE
+ can_born_artefacts = TRUE
//Длинна эффекта подогрева
effect_time = 30 SECONDS
effect_type = LONG_ANOMALY_EFFECT
cooldown_time = 30 SECONDS
+ detection_icon_state = "hot_anomaly"
iniciators = list(
/mob/living
)
diff --git a/mods/anomaly/code/anomalies/rvach.dm b/mods/anomaly/code/anomalies/single/rvach.dm
similarity index 50%
rename from mods/anomaly/code/anomalies/rvach.dm
rename to mods/anomaly/code/anomalies/single/rvach.dm
index a8930b15852b2..d640e4019d2ea 100644
--- a/mods/anomaly/code/anomalies/rvach.dm
+++ b/mods/anomaly/code/anomalies/single/rvach.dm
@@ -5,24 +5,29 @@
/obj/anomaly/rvach
name = "Refractions of light"
+ anomaly_tag = "Rvach"
with_sound = TRUE
sound_type = 'mods/anomaly/sounds/rvach_activation.ogg'
idle_effect_type = "rvach_idle"
- activation_effect_type = "rvach_activation"
- can_born_artifacts = TRUE
+ activation_effect_type = "gravy_anomaly_down"
+ detection_icon_state = "hot_anomaly"
+ can_born_artefacts = TRUE
+ weight_sensity = ITEM_SIZE_LARGE
///Сколько длится первая фаза рвача(всасывание)
- effect_time = 4 SECONDS
+ effect_time = 3.5 SECONDS
effect_type = LONG_ANOMALY_EFFECT
effect_power = RVACH_DAMAGE_EFFECT
- cooldown_time = 15 SECONDS
+ cooldown_time = 25 SECONDS
iniciators = list(
/mob/living,
/obj/item
)
artefacts = list(
- /obj/item/artefact/gravi = 1
+ /obj/item/artefact/gravi = 1,
+ /obj/item/artefact/flyer = 2
)
artefact_spawn_chance = 20
+ detection_skill_req = SKILL_EXPERIENCED
//Аномалия выполняет своё финальное воздействие на все обьекты что оказались в её центре
/obj/anomaly/rvach/proc/get_end_effect_by_anomaly(target)
@@ -31,11 +36,21 @@
if(effect_power == RVACH_DESTROY_EFFECT)
if(istype(target, /mob/living))
var/mob/living/victim = target
+ SSanom.add_last_gibbed(target, "Рвач")
+ var/list/result_effects = calculate_artefact_reaction(target, "Гиб Рвача")
+ if(result_effects)
+ if(result_effects.Find("Защищает от гиба рвачом"))
+ return
victim.gib()
playsound(src, 'mods/anomaly/sounds/rvach_gibbed.ogg', 100, FALSE )
//Если рвач обычный
else if(effect_power == RVACH_DAMAGE_EFFECT)
+ SSanom.add_last_attack(target, "Рвач")
+ var/list/result_effects = calculate_artefact_reaction(target, "Гиб Рвача")
+ if(result_effects)
+ if(result_effects.Find("Защищает от гиба рвачом"))
+ return
if(istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/victim = target
if(!victim.incapacitated(INCAPACITATION_UNRESISTING) == TRUE) //Убедимся что наш чувак в сознании
@@ -43,7 +58,6 @@
if(victim.skill_check(SKILL_HAULING, SKILL_MASTER))
if(prob(7 * victim.get_skill_value(SKILL_HAULING)))
victim.Weaken(10)
- to_chat(victim, SPAN_WARNING("То-ли от страха, то-ли от огромной физической подготовки, вы выныриваете из аномалии."))
return
//Создаём список органов, которые мы МОЖЕМ оторвать
@@ -60,6 +74,7 @@
playsound(src, 'mods/anomaly/sounds/rvach_gibbed.ogg', 100, FALSE )
else if(istype(target, /mob/living))
var/mob/living/victim = target
+ SSanom.add_last_gibbed(target, "Рвач")
victim.gib()
playsound(src, 'mods/anomaly/sounds/rvach_gibbed.ogg', 100, FALSE )
else if(istype(target, /obj/item))
@@ -81,7 +96,7 @@
for(var/atom/movable/target in src.loc)
get_end_effect_by_anomaly(target)
//Рвач раскидает всех из себя
- throw_everyone_from_rvach()
+ throw_everyone_from_rvach(throw_range)
//Выполняем стандартные действия функции stop_processing_long_effect()
stop_long_visual_effect()
currently_active = FALSE
@@ -89,21 +104,33 @@
//Рвач раскидывает всё что попадает в зону рвача из себя
/obj/anomaly/rvach/proc/throw_everyone_from_rvach()
- //Если рвач мультитайтловый
- for(var/atom/movable/victim in src.loc)
- if(!ismob(victim) && !isitem(victim) )
+ var/list/victims = list()
+ var/list/objs = list()
+ var/turf/T = get_turf(src)
+ //Собираем все обьекты радиусом на 1 больше, чем расположены вспомогательные части рвачика
+ get_mobs_and_objs_in_view_fast(T, multititle_parts_range, victims, objs)
+ LAZYMERGELIST(victims, objs)
+ for(var/atom/movable/detected_atom in victims)
+ if((!ismob(detected_atom) && !isitem(detected_atom)) || detected_atom.anchored)
continue
- if(!victim.anchored)
- victim.throw_at_random(get_turf(src), effect_range+1, 5)
- if(multitile)
- for(var/obj/anomaly/part/parts in list_of_parts)
- var/throw_dir = get_dir(src, parts)
- var/target_turf = get_edge_target_turf(parts, throw_dir)
- for(var/atom/movable/victim in parts.loc)
- if(!ismob(victim) && !isitem(victim) )
- continue
- if(!victim.anchored)
- victim.throw_at(target_turf, effect_range, 5)
+ var/local_range_of_throw = 1
+ if(ismob(detected_atom))
+ var/mob/detected_mob = detected_atom
+ var/list/result_effects = calculate_artefact_reaction(detected_mob, "Гиб Рвача")
+ if(result_effects)
+ //Цель не сможет вышвырнуть из рвача, артефакт не даёт
+ if(result_effects.Find("Защищает от гиба рвачом"))
+ return
+ if(result_effects.Find("Усиливает дальность полёта"))
+ local_range_of_throw = 5
+
+ var/dis = get_dist(src, detected_atom)
+ if(dis < 1)
+ detected_atom.throw_at_random(get_turf(src), local_range_of_throw, 5)
+ else
+ var/throw_dir = get_dir(src, detected_atom)
+ var/target_turf = get_ranged_target_turf(detected_atom, throw_dir, local_range_of_throw)
+ detected_atom.throw_at(target_turf, local_range_of_throw, 5)
/proc/rvach_pull_around(atom/target, pull_range = 255, pull_power = STAGE_FIVE)
@@ -124,20 +151,41 @@
Weaken(5)
/mob/living/carbon/human/rvach_anomaly_pull(turf/target, current_size)
- if(target != src.loc)
- adjust_stamina(-30)
- to_chat(src, SPAN_BAD("Не могу, рано, меня с силой тащит обратно, тяжёло!"))
- if(stamina < 30)
- Paralyse(1)
- to_chat(src, SPAN_BAD("Нет сил!"))
- step_towards(src, target)
- Weaken(1)
+ if(get_turf(target) != get_turf(src))
+ step_towards(src, target)
+ Weaken(5)
/obj/anomaly/rvach/Crossed(atom/movable/O)
if(currently_active)
return
if(currently_charging_after_activation)
return
- if(can_be_activated(O))
+ if(can_be_activated(O) == "too small weight")
+ O.forceMove(get_turf(src))
+ else if(can_be_activated(O))
activate_anomaly()
- return
+
+//Человек пытается выбраться из рвача FALSE - не даём вылезти, TRUE - даём
+/obj/anomaly/rvach/Uncross(O)
+ if(currently_charging_after_activation || !currently_active)
+ return TRUE
+ if(!ishuman(O))
+ return TRUE
+ if(do_after(O, 2 SECONDS, src, DO_PUBLIC_UNIQUE | DO_BAR_OVER_USER, INCAPACITATION_NONE))
+ var/mob/living/jumper = O
+ jumper.forceMove(get_ranged_target_turf(jumper, jumper.dir, 1))
+ //После того как игрок выпрыгнул из рвача, тот может опять его всосать если он вылез слишком рано.
+ //Но Игрок смотрящий на вылезшего игрока может выхватить его, если будет достаточно близко когда наша
+ //Жертва выпрыгнет
+ var/turf/helper_turf = get_ranged_target_turf(jumper, jumper.dir, 1)
+ for(var/mob/living/carbon/human/helper in helper_turf)
+ if(helper.a_intent == I_HELP && turn(jumper.dir, 180) == helper.dir && helper.incapacitated(INCAPACITATION_UNRESISTING) != TRUE) //Лезущий и помощник должны смотреть друг другу в лицо
+ to_chat(jumper, SPAN_GOOD("[helper] выхватывает вас за протянутую руку!"))
+ to_chat(helper, SPAN_GOOD("Вы дёргаете [jumper] на себя за протянутую руку!"))
+ jumper.forceMove(get_ranged_target_turf(jumper, jumper.dir, 1))
+ jumper.Weaken(5)
+ helper.Weaken(5)
+ return TRUE
+
+/obj/anomaly/rvach/get_detection_icon()
+ return "rvach_detection"
diff --git a/mods/anomaly/code/anomalies/single/tramplin.dm b/mods/anomaly/code/anomalies/single/tramplin.dm
index 17b93835393c0..8cd46868255cc 100644
--- a/mods/anomaly/code/anomalies/single/tramplin.dm
+++ b/mods/anomaly/code/anomalies/single/tramplin.dm
@@ -1,5 +1,6 @@
-/obj/anomaly/thamplin
+/obj/anomaly/tramplin
name = "Refractions of light"
+ anomaly_tag = "Tramp"
with_sound = TRUE
sound_type = 'mods/anomaly/sounds/tramplin.ogg'
idle_effect_type = "trampline_idle"
@@ -13,29 +14,41 @@
/mob/living,
/obj/item
)
+ artefacts = list(
+ /obj/item/artefact/flyer = 1
+ )
//Рандомизация
ranzomize_with_initialize = TRUE
- can_born_artifacts = FALSE
+ can_born_artefacts = FALSE
min_coldown_time = 3 SECONDS
max_coldown_time = 8 SECONDS
- can_be_preloaded = TRUE
being_preload_chance = 10
chance_to_be_detected = 75
- can_walking = TRUE
- chance_spawn_walking = 5
- walking_activity = 5
+ detection_skill_req = SKILL_BASIC
+/obj/anomaly/tramplin/Initialize()
+ . = ..()
+ range_of_throw = rand(2,5)
-/obj/anomaly/thamplin/activate_anomaly()
+/obj/anomaly/tramplin/activate_anomaly()
for(var/obj/item/target in src.loc)
get_effect_by_anomaly(target)
for(var/mob/living/targetbam in src.loc)
get_effect_by_anomaly(targetbam)
.=..()
-/obj/anomaly/thamplin/get_effect_by_anomaly(target)
+/obj/anomaly/tramplin/get_effect_by_anomaly(target)
if(ismech(target))
return
+ var/local_range_of_throw = range_of_throw
+ if(istype(target, /mob/living))
+ SSanom.add_last_attack(target, "Трамплин")
+ var/list/result_effects = calculate_artefact_reaction(target, "Трамплин")
+ if(result_effects)
+ if(result_effects.Find("Не даёт кинуть"))
+ return
+ if(result_effects.Find("Усиливает дальность полёта"))
+ local_range_of_throw = local_range_of_throw * 3
if(ishuman(target))
var/mob/living/carbon/human/victim = target
@@ -43,17 +56,21 @@
if(victim.skill_check(SKILL_HAULING, SKILL_EXPERIENCED))
if(prob(10 * victim.get_skill_value(SKILL_HAULING)))
victim.Weaken(1)
- to_chat(victim, SPAN_WARNING("Земля пропадает под ногами, но вы успеваете вцепиться в землю словно зубами."))
+ to_chat(victim, SPAN_GOOD("Земля пропадает под ногами, но вы успеваете вцепиться в землю словно зубами."))
return
var/turf/own_turf = get_turf(src)
var/turf/target_turf = own_turf
if(!random_throw_dir)
- //В силу того что в билде нет нормальной функции по киданию по направлению, сперва расчитаем цель, куда будем метать обьект
- for(var/i = 1, i < range_of_throw, i++)
- target_turf = get_edge_target_turf(target, throw_dir)
+ target_turf = get_ranged_target_turf(target, throw_dir, local_range_of_throw)
var/atom/movable/victim = target
+ if(isliving(victim))
+ var/mob/victim_mob = victim
+ victim_mob.Weaken(1)
if(random_throw_dir)
- victim.throw_at_random(own_turf, range_of_throw, speed_of_throw )
+ victim.throw_at_random(own_turf, local_range_of_throw, speed_of_throw )
else
- victim.throw_at(target_turf, range_of_throw, speed_of_throw)
+ victim.throw_at(target_turf, local_range_of_throw, speed_of_throw)
+
+/obj/anomaly/tramplin/get_detection_icon()
+ return "trampline_detection"
diff --git a/mods/anomaly/code/anomalies/ventilyator.dm b/mods/anomaly/code/anomalies/single/ventilyator.dm
similarity index 93%
rename from mods/anomaly/code/anomalies/ventilyator.dm
rename to mods/anomaly/code/anomalies/single/ventilyator.dm
index 02e3f01d2c736..ff27d598694b0 100644
--- a/mods/anomaly/code/anomalies/ventilyator.dm
+++ b/mods/anomaly/code/anomalies/single/ventilyator.dm
@@ -1,8 +1,10 @@
+/* Не доделано
/proc/random_dir()
return pick(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)
/obj/anomaly/ventilyator
name = "air flows"
+ anomaly_tag = "Vent"
with_sound = TRUE
sound_type = 'mods/anomaly/sounds/tramplin.ogg'
idle_effect_type = "trampline_idle"
@@ -20,12 +22,13 @@
)
//Рандомизация
ranzomize_with_initialize = TRUE
- can_born_artifacts = FALSE
+ can_born_artefacts = FALSE
min_coldown_time = 15 SECONDS
max_coldown_time = 30 SECONDS
time_between_effects = 0.25 SECONDS
being_preload_chance = 10
chance_to_be_detected = 75
+ detection_skill_req = SKILL_EXPERIENCED
/obj/anomaly/ventilyator/Initialize()
. = ..()
@@ -57,3 +60,4 @@
for(var/atom/atoms in list_of_effected_turfs)
get_effect_by_anomaly(atoms)
start_processing_long_effect()
+*/
diff --git a/mods/anomaly/code/anomalies/vspishka.dm b/mods/anomaly/code/anomalies/single/vspishka.dm
similarity index 78%
rename from mods/anomaly/code/anomalies/vspishka.dm
rename to mods/anomaly/code/anomalies/single/vspishka.dm
index 3a60cfd47d373..f536e3fc02c38 100644
--- a/mods/anomaly/code/anomalies/vspishka.dm
+++ b/mods/anomaly/code/anomalies/single/vspishka.dm
@@ -1,5 +1,6 @@
/obj/anomaly/vspishka
name = "Brightest flash"
+ anomaly_tag = "Vspishka"
with_sound = TRUE
sound_type = 'mods/anomaly/sounds/vspishka_activated.ogg'
idle_effect_type = "vspishka_idle"
@@ -10,19 +11,20 @@
range_of_light = 6
power_of_light = 10
effect_range = 5
- can_born_artifacts = FALSE
+ can_born_artefacts = FALSE
var/datum/beam = null
var/create_line = FALSE
preload_sound_type = 'mods/anomaly/sounds/vspishka_preload.ogg'
//Рандомизация
ranzomize_with_initialize = TRUE
- min_coldown_time = 15 SECONDS
- max_coldown_time = 30 SECONDS
+ min_coldown_time = 30 SECONDS
+ max_coldown_time = 75 SECONDS
min_preload_time = 6
max_preload_time = 12
can_be_preloaded = TRUE
being_preload_chance = 80
- chance_to_be_detected = 50
+ chance_to_be_detected = 75
+ detection_skill_req = SKILL_MASTER
/obj/anomaly/vspishka/activate_anomaly()
last_activation_time = world.time
@@ -42,6 +44,11 @@
create_line = FALSE
//Ослепим моба
if(istype(target, /mob/living))
+ SSanom.add_last_attack(target, "Вспышка")
+ var/list/result_effects = calculate_artefact_reaction(target, "Вспышка")
+ if(result_effects)
+ if(result_effects.Find("Защищает от ослепления"))
+ return
var/mob/living/victim = target
victim.flash_eyes(FLASH_PROTECTION_MAJOR)
victim.Stun(5)
diff --git a/mods/anomaly/code/anomalies/single/zjarka.dm b/mods/anomaly/code/anomalies/single/zharka.dm
similarity index 73%
rename from mods/anomaly/code/anomalies/single/zjarka.dm
rename to mods/anomaly/code/anomalies/single/zharka.dm
index cd065ac7ad454..22b068f8aeb9d 100644
--- a/mods/anomaly/code/anomalies/single/zjarka.dm
+++ b/mods/anomaly/code/anomalies/single/zharka.dm
@@ -1,8 +1,10 @@
-/obj/anomaly/zjarka
+/obj/anomaly/zharka
name = "Jet of flame"
+ anomaly_tag = "Zharka"
with_sound = TRUE
- sound_type = 'mods/anomaly/sounds/zjarka.ogg'
- idle_effect_type = "zjarka_idle"
+ sound_type = 'mods/anomaly/sounds/zharka.ogg'
+ idle_effect_type = "zharka_idle"
+ detection_icon_state = "hot_anomaly"
layer = ABOVE_HUMAN_LAYER
light_after_activation = TRUE
effect_type = LONG_ANOMALY_EFFECT
@@ -10,10 +12,10 @@
color_of_light = COLOR_WHITE
effect_time = 5 SECONDS
time_of_light = 5 SECONDS
- can_born_artifacts = TRUE
+ can_born_artefacts = TRUE
//Урон который наносит открытое пламя телу в
var/burn_damage = 10
- activation_effect_type = "zjarka_active"
+ activation_effect_type = "zharka_active"
special_iniciators = list(
/obj/item
@@ -33,12 +35,10 @@
artefact_spawn_chance = 10
can_be_preloaded = FALSE
being_preload_chance = 20
- can_walking = TRUE
- chance_spawn_walking = 1
- walking_activity = 2
+ detection_skill_req = SKILL_BASIC
-/obj/anomaly/zjarka/activate_anomaly()
+/obj/anomaly/zharka/activate_anomaly()
last_activation_time = world.time
var/list/victims = list()
var/list/objs = list()
@@ -52,17 +52,19 @@
anything_in_ashes(I)
.=..()
-/obj/anomaly/zjarka/get_effect_by_anomaly(atom/movable/target)
+/obj/anomaly/zharka/get_effect_by_anomaly(atom/movable/target)
if(!isturf(target.loc))
return
if(isanomaly(target))
return
//Поджечь человека
if(istype(target, /mob/living))
+ SSanom.add_last_attack(target, "Жарка")
var/mob/living/victim = target
if(inmech_sec(victim))
return
if(victim.health == 0)
+ SSanom.add_last_gibbed(target, "Жарка")
anything_in_remains(victim)
return
victim.fire_stacks = max(2, victim.fire_stacks)
@@ -74,7 +76,7 @@
anything_in_ashes(target)
///Жарим всех вокруг в течении действия аномалии
-/obj/anomaly/zjarka/process_long_effect()
+/obj/anomaly/zharka/process_long_effect()
var/list/victims = list()
var/list/objs = list()
var/turf/T = get_turf(src)
@@ -87,7 +89,7 @@
get_effect_by_anomaly(atoms)
start_processing_long_effect()
-/obj/anomaly/zjarka/Crossed(atom/movable/O)
+/obj/anomaly/zharka/Crossed(atom/movable/O)
if(currently_active)
get_effect_by_anomaly(O)
if(currently_charging_after_activation)
@@ -95,3 +97,12 @@
if(can_be_activated(O))
activate_anomaly()
return
+
+
+/obj/anomaly/zharka/get_detection_icon()
+ if(effect_range == 1 || effect_range == 0)
+ return "zharka_detection"
+ else if(effect_range == 2)
+ return "zharka_first_detection"
+ else if(effect_range > 2)
+ return "zharka_second_detection"
diff --git a/mods/anomaly/code/anomaly_admin.dm b/mods/anomaly/code/anomaly_admin.dm
index 3a88dce05f372..2ff8becd2fc58 100644
--- a/mods/anomaly/code/anomaly_admin.dm
+++ b/mods/anomaly/code/anomaly_admin.dm
@@ -12,9 +12,9 @@
var/list/possible_anomalies = list(
- /obj/anomaly/zjarka = "Жарка - аномалия накладывающая BURN урон и поджигающая всех в зоне поражения. Взводится от болта и мобов.",
- /obj/anomaly/zjarka/short_effect = "Жарка - аномалия накладывающая BURN урон и поджигающая всех в зоне поражения. Взводится от болта и мобов.",
- /obj/anomaly/zjarka/long_effect = "Жарка - аномалия накладывающая BURN урон и поджигающая всех в зоне поражения. Взводится от болта и мобов.",
+ /obj/anomaly/zharka = "Жарка - аномалия накладывающая BURN урон и поджигающая всех в зоне поражения. Взводится от болта и мобов.",
+ /obj/anomaly/zharka/short_effect = "Жарка - аномалия накладывающая BURN урон и поджигающая всех в зоне поражения. Взводится от болта и мобов.",
+ /obj/anomaly/zharka/long_effect = "Жарка - аномалия накладывающая BURN урон и поджигающая всех в зоне поражения. Взводится от болта и мобов.",
/obj/anomaly/electra/three_and_three = "Электра - аномалия наносящая электроудар (50 урона + стан) всех в зоне поражения. Реагирует на мобов, металлические предметы. Подтип ТЕСЛА бьёт дальше чем чувствует, параметр предзарядка заставит её сперва зарядить, и лишь потом ударить. НЕ СОВЕТУЮ СОВМЕЩАТЬ ТЕСЛУ И ПРЕДЗАРЯДКУ.",
/obj/anomaly/electra/three_and_three/tesla = "Электра - аномалия наносящая электроудар (50 урона + стан) всех в зоне поражения. Реагирует на мобов, металлические предметы. Подтип ТЕСЛА бьёт дальше чем чувствует, параметр предзарядка заставит её сперва зарядить, и лишь потом ударить. НЕ СОВЕТУЮ СОВМЕЩАТЬ ТЕСЛУ И ПРЕДЗАРЯДКУ.",
/obj/anomaly/electra/three_and_three/tesla_second = "Электра - аномалия наносящая электроудар (50 урона + стан) всех в зоне поражения. Реагирует на мобов, металлические предметы. Подтип ТЕСЛА бьёт дальше чем чувствует, параметр предзарядка заставит её сперва зарядить, и лишь потом ударить. НЕ СОВЕТУЮ СОВМЕЩАТЬ ТЕСЛУ И ПРЕДЗАРЯДКУ.",
@@ -23,8 +23,8 @@
/obj/anomaly/heater/three_and_three = "Грелка - аномалия греющая все существа находящиеся на турфе ядра и вспомогательных частей. Обнаруживается лишь детектором, никакие скафандры не защищают от её влияния.Взводятся лишь мобом.",
/obj/anomaly/heater/two_and_two = "Грелка - аномалия греющая все существа находящиеся на турфе ядра и вспомогательных частей. Обнаруживается лишь детектором, никакие скафандры не защищают от её влияния.Взводятся лишь мобом.",
/obj/anomaly/cooler/two_and_two = "Холодильник - аномалия охлаждающая все существа находящиеся на турфе ядра и вспомогательных частей. Обнаруживается лишь детектором, никакие скафандры не защищают от её влияния. Взводятся лишь мобом.",
- /obj/anomaly/cooler/three_and_three = "Холодильник - аномалия охлаждающая все существа находящиеся на турфе ядра и вспомогательных частей. Обнаруживается лишь детектором, никакие скафандры не защищают от её влияния. Взводятся лишь мобом."
-
+ /obj/anomaly/cooler/three_and_three = "Холодильник - аномалия охлаждающая все существа находящиеся на турфе ядра и вспомогательных частей. Обнаруживается лишь детектором, никакие скафандры не защищают от её влияния. Взводятся лишь мобом.",
+ /obj/anomaly/tramplin = "Трамплин - аномалия швыряющая вещи и мобов находящиеся на её турфе. Не может сдвинуть меха."
)
var/help_text = {"\
********* Build Mode: Areas ********
diff --git a/mods/anomaly/code/anomaly_controller.dm b/mods/anomaly/code/anomaly_controller.dm
index 20afaf90548a5..14a9c1991d2db 100644
--- a/mods/anomaly/code/anomaly_controller.dm
+++ b/mods/anomaly/code/anomaly_controller.dm
@@ -4,21 +4,67 @@ PROCESSING_SUBSYSTEM_DEF(anom)
priority = SS_PRIORITY_DEFAULT
init_order = SS_INIT_DEFAULT
flags = SS_BACKGROUND
+ wait = 3 //Каждые три тика
- var/list/all_anomalies = list()
- var/anomalies_ammount_in_world = 0
- var/added_ammount = 0
+ //[ВЫВОДИМАЯ СТАТИСТИКА]
+ ///Список всех ЯДЕР аномалий
+ var/list/all_anomalies_cores = list()
+ ///Список всех ВСПОМОГАТЕЛЬНЫХ ЧАСТЕЙ
+ var/list/all_anomalies_helpers = list()
+ ///Количество ядер
+ var/anomalies_cores_in_world_amount = 0
+ ///Количество вспомогательных частей
+ var/anomalies_helpers_in_world_amount = 0
+ ///Количество спавнов аномалий
+ var/spawn_ammount = 0
+ ///Количество удалений. Помогает определить эффективность генератора аномалий
var/removed_ammount = 0
+ ///Количество процессингов
+ var/processing_ammount = 0
+
+
+
+ //ПОСЛЕДНИЕ ФРАЗЫ
+ var/last_attacked_message
+ var/gibbed_last_message
+
+
+
+ //[ИНФА ПО АРТЕФАКТАМ]
+ ///Количество артефактов, успешно собранные игроками
+ var/collected_artefacts_by_player = 0
+ var/earned_cargo_points = 0
+ var/earned_rnd_points = 0
+ var/list/artefacts_list_in_world = list()
+ var/artefacts_deleted_by_game = 0
+ var/artefacts_spawned_by_game = 0
+ var/interactions_with_artefacts_by_players_ammount = 0
+ var/bad_interactions_with_artefacts_by_players_ammount = 0
+ var/good_interactions_with_artefacts_by_players_ammount = 0
+
+
+
+ //[ИНФА ПО АНОМАЛИЯМ]
+ ///Количество ударов электры по гуманоидам и подобным
+ var/anomalies_activated_times = 0
+ var/humanoids_effected_by_anomaly = 0
+ var/humanoids_gibbed_by_anomaly = 0
+ var/simplemobs_effected_by_anomaly = 0
+ var/simplemobs_gibbed_by_anomaly = 0
+
+ var/list/important_logs = list()
/datum/controller/subsystem/processing/anom/UpdateStat(time)
if (PreventUpdateStat(time))
return ..()
..({"\
- anomalies in world: [anomalies_ammount_in_world] \
- added times: [added_ammount] \
- removed timest: [removed_ammount] \
+ anomalies in world: [anomalies_cores_in_world_amount] \
+ anomaly helpers in world: [anomalies_helpers_in_world_amount] \
+ spawned times: [spawn_ammount] \
+ removed times: [removed_ammount] \
+ objects in processing: [processing_ammount]
"})
/datum/controller/subsystem/processing/anom/Initialize(start_uptime)
@@ -27,12 +73,109 @@ PROCESSING_SUBSYSTEM_DEF(anom)
/datum/controller/subsystem/processing/anom/proc/anomalies_init()
-/datum/controller/subsystem/processing/anom/proc/add_anomaly_in_list(obj/anomaly/input)
- LAZYADD(all_anomalies, input)
- added_ammount++
- anomalies_ammount_in_world++
+/datum/controller/subsystem/processing/anom/proc/add_anomaly_in_cores(obj/anomaly/input)
+ LAZYADD(all_anomalies_cores, input)
+ spawn_ammount++
+ anomalies_cores_in_world_amount++
+
+/datum/controller/subsystem/processing/anom/proc/remove_anomaly_from_cores(obj/anomaly/input)
+ LAZYREMOVE(all_anomalies_cores, input)
+ removed_ammount++
+ anomalies_cores_in_world_amount--
+
-/datum/controller/subsystem/processing/anom/proc/remove_anomaly_from_list(obj/anomaly/input)
- LAZYREMOVE(all_anomalies, input)
+/datum/controller/subsystem/processing/anom/proc/add_anomaly_in_helpers(obj/anomaly/input)
+ LAZYADD(all_anomalies_helpers, input)
+ spawn_ammount++
+ anomalies_helpers_in_world_amount++
+
+/datum/controller/subsystem/processing/anom/proc/remove_anomaly_from_helpers(obj/anomaly/input)
+ LAZYREMOVE(all_anomalies_helpers, input)
removed_ammount++
- anomalies_ammount_in_world--
+ anomalies_helpers_in_world_amount--
+
+
+
+/datum/controller/subsystem/processing/anom/proc/give_gameover_text()
+ if(SSanom.spawn_ammount > 0)
+ var/anomaly_text
+ anomaly_text += "
ANOMALY MOD STATISTIC."
+ anomaly_text += " Количество аномалий на момент окончания раунда: [anomalies_cores_in_world_amount]. Мод размещал аномалии [spawn_ammount] раз, а удалял [removed_ammount] раз."
+ //Арты
+ anomaly_text += " Игра заспавнила [artefacts_spawned_by_game] артефактов, из них [artefacts_deleted_by_game] удалено. Собрано игроками артефактов: [collected_artefacts_by_player]. Всего артефактов на конец раунда: [LAZYLEN(artefacts_list_in_world)]"
+ anomaly_text += " Заработано каргопоинтов за продажу артефактов: [earned_cargo_points], заработано РНД поинтов за изучение артефактов: [earned_rnd_points]"
+ anomaly_text += " Всего попыток взаимодействия с артефактами: [interactions_with_artefacts_by_players_ammount], из них [good_interactions_with_artefacts_by_players_ammount] принесли пользу, а [bad_interactions_with_artefacts_by_players_ammount] принесли вред."
+ //Сработало аномок
+ //Электра
+ anomaly_text += " Аномалии были взведены [anomalies_activated_times] раз. В целом, игроки подверглись влиянию аномалий [humanoids_effected_by_anomaly] раз, а [humanoids_gibbed_by_anomaly] игроков были гибнуты. [simplemobs_effected_by_anomaly] симплмобов подверглись влиянию аномалий и [simplemobs_gibbed_by_anomaly] было гибнуто."
+ //Раненные, умершие, гибнутые
+ if(last_attacked_message)
+ anomaly_text += " [last_attacked_message]."
+ else
+ anomaly_text += " Никто не пострадал от аномалий."
+
+ if(gibbed_last_message)
+ anomaly_text += " [gibbed_last_message]."
+ else
+ anomaly_text += " Никого не порвало от аномалии."
+ return anomaly_text
+
+/datum/controller/subsystem/processing/anom/proc/add_last_attack(mob/living/user, attack_name)
+ if(!ishuman(user) && !isrobot(user))
+ SSanom.simplemobs_effected_by_anomaly++
+ return FALSE
+ SSanom.humanoids_effected_by_anomaly++
+ if(last_attacked_message)
+ return FALSE //У нас уже всё записано
+
+ var/result_text = "Первым от аномалии пострадал [user.ckey],"
+ //генерируем текст причины атаки
+ if(attack_name == "Электра")
+ result_text += "он получил мощный электроудар."
+ else if(attack_name == "Жарка")
+ result_text += "его сильно обожгло."
+ else if(attack_name == "Вспышка")
+ result_text += "его сильно ослепило и дезеориентировало."
+ else if(attack_name == "Рвач")
+ result_text += "ему оторвало конечность."
+ else if(attack_name == "Трамплин")
+ result_text += "его с силой швырнуло."
+ //а теперь генерируем последние сказанные им слова
+ if(user.mind.last_words)
+ result_text += "Перед этим он сказал: [user.mind.last_words]"
+ else
+ result_text += "Он пострадал молча."
+
+ last_attacked_message = result_text
+
+/datum/controller/subsystem/processing/anom/proc/add_last_gibbed(mob/living/user, attack_name)
+ if(!ishuman(user) && !isrobot(user))
+ SSanom.simplemobs_gibbed_by_anomaly++
+ return FALSE
+ SSanom.humanoids_gibbed_by_anomaly++
+ if(gibbed_last_message)
+ return FALSE //У нас уже всё записано
+ if(!user.ckey && !user.last_ckey)
+ return FALSE
+
+ var/victim_ckey
+ if(!user.ckey)
+ victim_ckey = user.last_ckey
+ else
+ victim_ckey = user.ckey
+
+ var/result_text = "Первым гибнуло [victim_ckey]."
+ //генерируем текст причины атаки
+ if(attack_name == "Электра")
+ result_text += "его испепелило до костей электроударом."
+ else if(attack_name == "Жарка")
+ result_text += "его сожгло до костей огнём."
+ else if(attack_name == "Рвач")
+ result_text += "его разорвало на куски гравианомалией."
+
+ if(user.mind.last_words)
+ result_text += "его последние слова: [user.mind.last_words]"
+ else
+ result_text += "Он покинул этот мир молча."
+
+ gibbed_last_message = result_text
diff --git a/mods/anomaly/code/anomaly_defines.dm b/mods/anomaly/code/anomaly_defines.dm
new file mode 100644
index 0000000000000..a568fb7394237
--- /dev/null
+++ b/mods/anomaly/code/anomaly_defines.dm
@@ -0,0 +1,4 @@
+#define LONG_ANOMALY_EFFECT 2
+#define MOMENTUM_ANOMALY_EFFECT 1
+#define isanomaly(A) istype(A, /obj/anomaly)
+#define isanomalyhere(A) locate(/obj/anomaly) in A
diff --git a/mods/anomaly/code/anomaly_light.dm b/mods/anomaly/code/anomaly_light.dm
deleted file mode 100644
index f14abb69c8643..0000000000000
--- a/mods/anomaly/code/anomaly_light.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-//Отвечает за вспышки и свет от аномалии
-/obj/anomaly
- ///Сделать вспышку после активации?
- var/light_after_activation = FALSE
- ///Время, которое будет держаться свет от активации
- var/time_of_light = 1 SECOND
- ///Цвет вспышки
- var/color_of_light = COLOR_WHITE
- var/range_of_light = 3
- var/power_of_light = 2
-
-///Запускаем свет/вспышку
-/obj/anomaly/proc/start_light()
- set_light(3, 2, color_of_light)
- addtimer(new Callback(src, PROC_REF(stop_light)), time_of_light)
-
-/obj/anomaly/proc/stop_light()
- set_light(0)
diff --git a/mods/anomaly/code/artifacts/anomaly_artifacts.dm b/mods/anomaly/code/artefacts/_anomaly_artefacts.dm
similarity index 52%
rename from mods/anomaly/code/artifacts/anomaly_artifacts.dm
rename to mods/anomaly/code/artefacts/_anomaly_artefacts.dm
index 8281a2f3e4ba3..e80db411c8967 100644
--- a/mods/anomaly/code/artifacts/anomaly_artifacts.dm
+++ b/mods/anomaly/code/artefacts/_anomaly_artefacts.dm
@@ -2,20 +2,23 @@
name = "Что-то."
desc = "Какой-то камень."
icon = 'mods/anomaly/icons/artifacts.dmi'
- ///Текущее количество энергии, которое хранит артефакт
+ ///Текущее количество энергии, которое хранит артефакт.
var/stored_energy = 1000
- ///Максимальное количество ЭНЕРГИИ, которое хранит артефакт
- var/max_stored_energy = 1000
+ ///Максимальное количество ЭНЕРГИИ, которое хранит артефакт.
+ var/max_energy = 1000
var/cargo_price = 100
var/rnd_points = 2000
- var/can_be_throwed = FALSE
var/obj/machinery/urm/stored_in_urm
+ var/mob/living/carbon/human/current_user
/obj/item/artefact/use_tool(obj/item/item, mob/living/user, list/click_params)
. = ..()
if(istype(item, /obj/item/collector))
collector_interaction(item, user)
+/obj/item/artefact/is_damage_immune()
+ return TRUE
+
/obj/item/artefact/proc/collector_interaction(obj/item/collector, mob/living/user)
if(inmech_sec(user))
to_chat(user, SPAN_WARNING("Вы недотягиваетесь."))
@@ -47,61 +50,40 @@
else if(!connected_to_anomaly)
input_collector.try_insert_artefact(user, src)
+//Все артефакты нельзя уничтожить взрывом.
/obj/item/artefact/ex_act(severity)
return
-/obj/item/artefact/throw_at(atom/target, range, speed, mob/thrower, spin, datum/callback/callback)
- if(!can_be_throwed)
- react_at_throw()
- . = ..()
-
-///Вызывается для реагирования артефакта на тот факт, что им швыряются
-/obj/item/artefact/proc/react_at_throw(atom/target, range, speed, mob/thrower, spin, datum/callback/callback)
+///Добавляет указанное количество энергии к артефакту
+/obj/item/artefact/proc/add_energy(amount)
+ stored_energy += amount
+ if(stored_energy >= max_energy)
+ react_at_max_energy()
+ stored_energy = clamp(stored_energy, 0, max_energy)
+ energy_changed()
+
+///Отнимает указанное количество энергии от артефакта
+/obj/item/artefact/proc/sub_energy(amount)
+ stored_energy -= amount
+ if(stored_energy <= max_energy)
+ react_at_min_energy()
+ stored_energy = clamp(stored_energy, 0, max_energy)
+
+///Вызывается, когда энергия артефакта достигает своих минимальных значений
+/obj/item/artefact/proc/react_at_min_energy()
return
-/obj/item/artefact/proc/react_to_touched(mob/living/user)
+///Вызывается, когда энергия артефакта достигает своих максимальных значений
+/obj/item/artefact/proc/react_at_max_energy()
return
-/obj/item/artefact/emp_act(severity)
- . = ..()
- react_to_emp()
-
-/obj/item/artefact/proc/react_to_emp()
+///Энергия артефакта как-то изменилась
+/obj/item/artefact/proc/energy_changed()
return
-/obj/item/artefact/pickup(mob/user)
- . = ..()
- if(!is_processing)
- START_PROCESSING(SSanom, src)
-
-/obj/item/artefact/proc/react_to_remove_from_collector()
- if(!is_processing)
- START_PROCESSING(SSanom, src)
-
-/obj/item/artefact/proc/react_to_insert_in_collector()
- if(is_processing)
- STOP_PROCESSING(SSanom, src)
-
/obj/item/artefact/proc/delete_artefact()
if(is_processing)
- STOP_PROCESSING(SSanom, src)
+ stop_process_by_ssanom()
+ SSanom.artefacts_deleted_by_game++
+ LAZYREMOVE(SSanom.artefacts_list_in_world , src)
qdel(src)
-
-
-//Жар
-/obj/item/artefact/zjar
- name = "Something"
- desc = "При поднятии вы чувствуете, словно по вашему телу распростаняется приятное тепло."
- icon_state = "fire_ball"
-
-//Грави
-/obj/item/artefact/gravi
- name = "Something"
- desc = "При поднятии вы чувствуете, словно сам воздух вокруг вас становится плотнее."
- icon_state = "gravi"
-
-//Светлячок
-/obj/item/artefact/svetlyak
- name = "Something"
- desc = "Невероятно яркий, вы с трудом смотрите на него даже с зажмуренными глазами."
- icon_state = "svetlyak"
diff --git a/mods/anomaly/code/artefacts/_artefact_external_interact.dm b/mods/anomaly/code/artefacts/_artefact_external_interact.dm
new file mode 100644
index 0000000000000..26a3ccbb4bf1d
--- /dev/null
+++ b/mods/anomaly/code/artefacts/_artefact_external_interact.dm
@@ -0,0 +1,122 @@
+/*
+Просчитывание реакций артефактов
+
+Пример применения в коде:
+
+ var/list/result_effects = calculate_artefact_reaction(src, "ЭМИ") <- здесь, мы получаем весь список реакций артефактов в инвентаре персонажа на событие (ЭМИ/Взрыв/Падение и прочие, вы всегда можете добавить своё!)
+ if(result_effects) <- Всегда проверяйте, что вам не выдало null
+ if(result_effects.Find("Защищает от ЭМИ")) <- Теперь, ищем нужную нам реакцию на событие.
+ return <-
+
+
+
+*/
+///В случае применения выдаёт список реакций артефактов внутри моба
+/proc/calculate_artefact_reaction(mob/living/user, anomaly_type)
+//Используем общий для всех участок кода по реакции артефакта на событие
+ var/list/detected_artefacts_in_victim = generate_artefacts_in_mob_list(user)
+ if(!LAZYLEN(detected_artefacts_in_victim))
+ return FALSE
+ var/list/result_effects = list() //Весь список эффектов возникший при ударе
+ //Электровоздействие(Электра)
+ if(anomaly_type == "Электра")
+ for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim)
+ LAZYADD(result_effects, choosed_artefact.react_at_electra(user))
+ return result_effects
+ //Воздействие трамплина(Кидание)
+ else if(anomaly_type == "Трамплин")
+ for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim)
+ LAZYADD(result_effects, choosed_artefact.react_at_tramplin(user))
+ return result_effects
+ //Воздействие вспышки(Ослепление)
+ else if(anomaly_type == "Вспышка")
+ for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim)
+ LAZYADD(result_effects, choosed_artefact.react_at_vspishka(user))
+ return result_effects
+ else if(anomaly_type == "Гиб Рвача")
+ for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim)
+ LAZYADD(result_effects, choosed_artefact.react_at_rvach_gib(user))
+ return result_effects
+ else if(anomaly_type == "ЭМИ")
+ for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim)
+ LAZYADD(result_effects, choosed_artefact.react_at_emp_on_user(user))
+ return result_effects
+ else if(anomaly_type == "Падение с высоты")
+ for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim)
+ LAZYADD(result_effects, choosed_artefact.react_at_failing(user))
+ return result_effects
+ else if(anomaly_type == "Возможность упасть")
+ for(var/obj/item/artefact/choosed_artefact in detected_artefacts_in_victim)
+ LAZYADD(result_effects, choosed_artefact.react_at_can_fall(user))
+ return result_effects
+
+/proc/generate_artefacts_in_mob_list(mob/living/user)
+ if(!istype(user, /mob/living))
+ return
+ var/list/output_artefacts = list()
+ for(var/obj/item/artefact/picked_artefact in user.get_contents())
+ if(!picked_artefact.artefact_in_collector())
+ LAZYADD(output_artefacts, picked_artefact)
+ return output_artefacts
+
+/obj/item/artefact/proc/artefact_in_collector()
+ if(istype(loc, /obj/item/collector))
+ return TRUE
+ else
+ return FALSE
+
+
+/obj/item/artefact/proc/react_at_electra(mob/living/user)
+ return
+
+/obj/item/artefact/proc/react_at_tramplin(mob/living/user)
+ return
+
+/obj/item/artefact/proc/react_at_vspishka(mob/living/user)
+ return
+
+/obj/item/artefact/proc/react_at_rvach_gib(mob/living/user)
+ return
+
+/obj/item/artefact/proc/react_at_emp_on_user(mob/living/user)
+ return
+
+/obj/item/artefact/proc/react_at_failing(mob/living/user)
+ return
+
+/obj/item/artefact/proc/react_at_can_fall(mob/living/user)
+ return
+
+/mob/living/emp_act(severity)
+ var/list/result_effects = calculate_artefact_reaction(src, "ЭМИ")
+ if(result_effects)
+ if(result_effects.Find("Защищает от ЭМИ"))
+ return
+ . = ..()
+
+/obj/item/artefact/throw_at(atom/target, range, speed, mob/thrower, spin, datum/callback/callback)
+ react_at_throw()
+ . = ..()
+ update_current_user()
+
+///Вызывается для реагирования артефакта на тот факт, что им швыряются
+/obj/item/artefact/proc/react_at_throw(atom/target, range, speed, mob/thrower, spin, datum/callback/callback)
+ return
+
+/obj/item/artefact/proc/react_to_touched(mob/living/user)
+ return
+
+/obj/item/artefact/emp_act(severity)
+ . = ..()
+ react_at_emp()
+
+/obj/item/artefact/proc/react_at_emp()
+ return
+
+/obj/item/artefact/proc/react_to_remove_from_collector()
+ if(!is_processing)
+ start_process_by_ssanom()
+
+/obj/item/artefact/proc/react_to_insert_in_collector()
+ if(is_processing)
+ stop_process_by_ssanom()
diff --git a/mods/anomaly/code/artefacts/_artefact_processing.dm b/mods/anomaly/code/artefacts/_artefact_processing.dm
new file mode 100644
index 0000000000000..e7afb603aa825
--- /dev/null
+++ b/mods/anomaly/code/artefacts/_artefact_processing.dm
@@ -0,0 +1,88 @@
+/obj/item/artefact
+ ///КД на проверку валидности носителя в случае если носителя нет
+ var/user_long_check_cooldown = 3 SECONDS
+ var/last_long_user_check = 0
+ ///КД на проверку валидности носителя в случае если носитель есть
+ var/user_check_cooldown = 2 SECONDS
+ var/last_user_check = 0
+ ///Артефакт нуждается в постоянной обработке?
+ var/need_to_process = FALSE
+ ///КД на влияние артефакта на носителя
+ var/process_effect_cooldown = 0.5 SECONDS
+ var/last_process_effect = 0
+
+ var/additional_process_cooldown = 20 SECONDS
+ var/last_additional_process = 0
+
+/obj/item/artefact/Initialize()
+ . = ..()
+ user_long_check_cooldown = rand(3 SECONDS, 6 SECONDS)
+ user_check_cooldown = rand(2 SECONDS, 4 SECONDS)
+ additional_process_cooldown = rand(20 SECONDS, 50 SECONDS)
+ start_process_by_ssanom()
+
+//Артефакт процессится абсолютно всегда в силу того что невозможно без изменения кор кода предотвратить ситуации, когда артефакт
+//Не влият на носителя, например при скидывании на пол и поднятии рюкзака обратно (Как сообщить артефакту о этм событии? Срать в код.)
+/obj/item/artefact/Process()
+ if(world.time - last_long_user_check >= user_long_check_cooldown)
+ last_long_user_check = world.time
+ additional_process()
+ if(connected_to_anomaly)
+ return
+ //Если носителя нет, то через большой промежуток времени проверим - вдруг нас кто-то всё таки взял?
+ if(!current_user)
+ if(world.time - last_long_user_check >= user_long_check_cooldown)
+ last_long_user_check = world.time
+ for(var/mob/living/user in get_turf(src))
+ if(src in user.get_contents())
+ update_current_user(user)
+ //Если носитель есть, то через более мелкий промежуток времени проверим, что носитель нас ещё носит
+ else if(current_user)
+ if(world.time - last_user_check >= user_check_cooldown)
+ last_user_check = world.time
+ update_current_user()
+ if(world.time - last_process_effect <= process_effect_cooldown)
+ return
+ process_artefact_effect_to_user()
+
+/*
+Дополнительный процессинг для доп фич. Обычно не используется.
+Позволяет легко добавлять новые свойства процессингу не изменяя ядро
+*/
+/obj/item/artefact/proc/additional_process()
+ return
+
+/obj/item/artefact/proc/process_artefact_effect_to_user()
+ return
+
+
+//Добавляем и убираем ВЛАДЕЛЬЦЕВ(кто имеем в рюкзаке арт)
+/obj/item/artefact/pickup(mob/living/user)
+ .=..()
+ update_current_user(user)
+
+/obj/item/artefact/dropped(mob/user)
+ .=..()
+ update_current_user(user)
+
+
+/obj/item/artefact/proc/update_current_user(mob/living/user)
+ // В случае перемещения предмета между contents или подбора, обновляет своего ПОЛЬЗОВАТЕЛЯ
+ if(current_user) //Юзер уже есть,
+ if(get_turf(current_user) != get_turf(src)) //проверяем,
+ current_user = null
+ else if(!current_user)
+ current_user = user
+
+
+/obj/item/artefact/proc/start_process_by_ssanom()
+ if(!is_processing)
+ START_PROCESSING(SSanom, src)
+ SSanom.processing_ammount++
+
+
+/obj/item/artefact/proc/stop_process_by_ssanom()
+ if(is_processing)
+ STOP_PROCESSING(SSanom, src)
+ if(SSanom.processing_ammount > 0)
+ SSanom.processing_ammount--
diff --git a/mods/anomaly/code/artifacts/anomaly_artifact_spawn.dm b/mods/anomaly/code/artefacts/_artefact_spawn.dm
similarity index 82%
rename from mods/anomaly/code/artifacts/anomaly_artifact_spawn.dm
rename to mods/anomaly/code/artefacts/_artefact_spawn.dm
index 230665c73eb07..52f5de4f5146b 100644
--- a/mods/anomaly/code/artifacts/anomaly_artifact_spawn.dm
+++ b/mods/anomaly/code/artefacts/_artefact_spawn.dm
@@ -1,6 +1,6 @@
/obj/anomaly
///Аномалия может "Рожать" артефакты?
- var/can_born_artifacts = FALSE
+ var/can_born_artefacts = FALSE
//ANOTHER
///Какие артефакты порождает аномалия. Справа пишем шанс выбора этого артефакта.
var/list/artefacts = list()
@@ -9,20 +9,20 @@
var/artefact_spawn_chance = 25
-/obj/anomaly/proc/try_born_artifact()
+/obj/anomaly/proc/try_born_artefact()
//Может ли аномалия спавнить артефакты
- if(can_born_artifacts && !check_artifacts_in_anomaly())
- born_artifact()
+ if(can_born_artefacts && !check_artifacts_in_anomaly())
+ born_artefact()
return TRUE
else
return FALSE
///Функция спавнит артефакт на территории аномалии
-/obj/anomaly/proc/born_artifact()
+/obj/anomaly/proc/born_artefact()
var/obj/artefact = pickweight(artefacts)
if(artefact)
- born_artifact_in_random_title(artefact)
+ born_artefact_in_random_title(artefact)
///Функция проверяет, есть ли на территории аномалии артефакты
/obj/anomaly/proc/check_artifacts_in_anomaly()
@@ -52,7 +52,7 @@
///Создаёт артефакт в случайном тайтле аномалии, включая вспомогательные
-/obj/anomaly/proc/born_artifact_in_random_title()
+/obj/anomaly/proc/born_artefact_in_random_title()
var/list/possible_places = list()
LAZYADD(possible_places, src.loc)
if(multitile)
@@ -62,4 +62,7 @@
var/result = pick(possible_places)
if(LAZYLEN(artefacts))
var/artifact = pick(artefacts)
- new artifact(result)
+ var/obj/item/artefact/spawned_artefact = new artifact(result)
+ spawned_artefact.connected_to_anomaly = TRUE
+ LAZYADD(SSanom.artefacts_list_in_world ,spawned_artefact)
+ SSanom.artefacts_spawned_by_game++
diff --git a/mods/anomaly/code/artifacts/interact_with_artefacts.dm b/mods/anomaly/code/artefacts/_interact_with_artefacts.dm
similarity index 75%
rename from mods/anomaly/code/artifacts/interact_with_artefacts.dm
rename to mods/anomaly/code/artefacts/_interact_with_artefacts.dm
index d4b71c5e90e82..a22ad22c1c595 100644
--- a/mods/anomaly/code/artifacts/interact_with_artefacts.dm
+++ b/mods/anomaly/code/artefacts/_interact_with_artefacts.dm
@@ -1,5 +1,5 @@
/obj/item/artefact
- var/connected_to_anomaly = TRUE
+ var/connected_to_anomaly = FALSE
///Здесь будет лист взаимодействий, но который артефакт всё таки реагирует
var/list/rect_to_interactions = list()
var/turf/prev_loc
@@ -17,11 +17,13 @@
else if(connected_to_anomaly)
if(AnomaliesAmmountInTurf(get_turf(src)) == 0)
connected_to_anomaly = FALSE
+ SSanom.collected_artefacts_by_player++
else
for(var/obj/anomaly/anomka in src.loc.contents)
if(prob(25 * user.get_skill_value(SKILL_SCIENCE)))
to_chat(user, SPAN_GOOD("[desc]"))
connected_to_anomaly = FALSE
+ SSanom.collected_artefacts_by_player++
else
to_chat(user, SPAN_WARNING("Обьект уплывает из ваших рук"))
if(istype(anomka, /obj/anomaly/part))
@@ -57,7 +59,8 @@
var/choosed_interaction = input(usr, "What to do","It's time to chose") as null|anything in interaction_variations
if(!user.Adjacent(src))
return FALSE
- if(choosed_interaction == "Lick" && rect_to_interactions.Find(choosed_interaction))
+ SSanom.interactions_with_artefacts_by_players_ammount++
+ if(choosed_interaction == "Lick")
if(!ishuman(user))
to_chat(user, SPAN_NOTICE("У меня нет рта, но я должен кричать."))
return
@@ -66,12 +69,16 @@
if(blocked)
to_chat(user, SPAN_NOTICE("Мой рот закрыт, я не могу лизнуть его."))
return
+ user.visible_message(SPAN_NOTICE("[user] лизнул [src]."))
+ to_chat(user, SPAN_NOTICE("Вы лизнули [src]."))
lick_interaction(user)
return
- else if(choosed_interaction == "Shake" && rect_to_interactions.Find(choosed_interaction))
+ else if(choosed_interaction == "Shake")
+ user.visible_message(SPAN_NOTICE("[user] потряс [src]."))
+ to_chat(user, SPAN_NOTICE("Вы потрясли [src]."))
shake_interaction(user)
return
- else if(choosed_interaction == "Bite" && rect_to_interactions.Find(choosed_interaction))
+ else if(choosed_interaction == "Bite")
if(!ishuman(user))
to_chat(user, SPAN_NOTICE("У меня нет рта, но я должен кричать."))
return
@@ -80,18 +87,25 @@
if(blocked)
to_chat(user, SPAN_NOTICE("Мой рот закрыт, я не могу укусить его."))
return
+ user.visible_message(SPAN_NOTICE("[user] укусил [src]."))
+ to_chat(user, SPAN_NOTICE("Вы укусили [src]."))
bite_interaction(user)
return
- else if(choosed_interaction == "Knock" && rect_to_interactions.Find(choosed_interaction))
+ else if(choosed_interaction == "Knock")
+ user.visible_message(SPAN_NOTICE("[user] постучал по [src]."))
+ to_chat(user, SPAN_NOTICE("Вы стучите по [src]."))
knock_interaction(user)
return
- else if(choosed_interaction == "Compress" && rect_to_interactions.Find(choosed_interaction))
+ else if(choosed_interaction == "Compress")
+ user.visible_message(SPAN_NOTICE("[user] сжал [src]."))
+ to_chat(user, SPAN_NOTICE("Вы сжимаете [src]."))
compress_interaction(user)
return
- else if(choosed_interaction == "Rub" && rect_to_interactions.Find(choosed_interaction))
+ else if(choosed_interaction == "Rub")
+ user.visible_message(SPAN_NOTICE("[user] потёр [src]."))
+ to_chat(user, SPAN_NOTICE("Вы терёте [src]."))
rub_interaction(user)
return
-
to_chat(user, SPAN_NOTICE("Ничего не произошло."))
///ВЗАИМОДЕЙСТВИЯ ОТ ЛЮДЕЙ НАПРЯМУЮ
diff --git a/mods/anomaly/code/artefacts/artefact_flyer.dm b/mods/anomaly/code/artefacts/artefact_flyer.dm
new file mode 100644
index 0000000000000..bb5e9ea192568
--- /dev/null
+++ b/mods/anomaly/code/artefacts/artefact_flyer.dm
@@ -0,0 +1,89 @@
+/obj/item/artefact/flyer
+ name = "Something"
+ desc = "Обьект абсолютно невесом, выглядит как какой-то плотный кусок воздуха."
+ icon_state = "flyer"
+ need_to_process = TRUE
+ //В артефакте нет энергии/она неограничена
+ rect_to_interactions = list(
+ "Lick",
+ "Shake",
+ "Bite",
+ "Knock",
+ "Compress",
+ "Rub"
+ )
+ stored_energy = 0
+ max_energy = 0
+ cargo_price = 1500
+ rnd_points = 7000
+ need_to_process = TRUE
+
+/obj/item/artefact/flyer/lick_interaction(mob/living/carbon/human/user)
+ to_chat(user,SPAN_NOTICE("На вкус как воздух."))
+
+/obj/item/artefact/flyer/shake_interaction(mob/living/carbon/human/user)
+ if(isrobot(user))
+ to_chat(user,SPAN_NOTICE("При тряске вы на мгновение отпускаете обьект, и тот зависает в воздухе."))
+ else
+ to_chat(user,SPAN_GOOD("При тряске вы на мгновение отпускаете обьект, и тот зависает в воздухе, словно застряв в нём."))
+
+
+
+
+/obj/item/artefact/flyer/bite_interaction(mob/living/carbon/human/user)
+ to_chat(user,SPAN_NOTICE("Материя словно раступается перед вашими зубами."))
+
+/obj/item/artefact/flyer/knock_interaction(mob/living/carbon/human/user)
+ to_chat(user,SPAN_NOTICE("Стукнув по нему рукой, тот упрыгивает из ваших рук."))
+ //jump_away() TODO
+
+/obj/item/artefact/flyer/compress_interaction(mob/living/carbon/human/user)
+ if(isrobot(user))
+ to_chat(user,SPAN_NOTICE("Обьект легко сдавливается, превращаясь в мини шарик, но после моментально возвращает свою форму."))
+ else
+ to_chat(user,SPAN_NOTICE("Обьект легко сдавливается, превращаясь в мини шарик, но после моментально возвращает свою форму. Очень мягкий по ощущениям."))
+
+/obj/item/artefact/flyer/rub_interaction(mob/living/carbon/human/user)
+ if(isrobot(user))
+ to_chat(user,SPAN_NOTICE("Обьект не реагирует."))
+ else
+ to_chat(user,SPAN_NOTICE("Ощущения словно водишь рукой по воздуху."))
+
+/obj/item/artefact/flyer/urm_radiation(mob/living/user)
+ return "Обьект не реагирует"
+
+/obj/item/artefact/flyer/urm_laser(mob/living/user)
+ return "Обьект не реагирует"
+
+/obj/item/artefact/flyer/urm_electro(mob/living/user)
+ return "Обьект не реагирует"
+
+/obj/item/artefact/flyer/urm_plasma(mob/living/user)
+ return "Обьект не реагирует"
+
+/obj/item/artefact/flyer/urm_phoron(mob/living/user)
+ return "Обьект не реагирует"
+
+
+
+/obj/item/artefact/flyer/process_artefact_effect_to_user()
+ if(current_user.stamina < 85)
+ current_user.adjust_stamina(5)
+
+/mob/living/carbon/human/can_fall(anchor_bypass, turf/location_override)
+ var/list/result_effects = calculate_artefact_reaction(src, "Возможность упасть")
+ if(result_effects)
+ if(result_effects.Find("Держит в воздухе"))
+ return
+ .=..()
+
+
+/obj/item/artefact/flyer/react_at_tramplin(mob/living/user)
+ . = ..()
+ return "Усиливает дальность полёта"
+
+/obj/item/artefact/flyer/react_at_rvach_gib(mob/living/user)
+ return "Усиливает дальность полёта"
+
+/obj/item/artefact/flyer/react_at_can_fall(mob/living/user)
+ return "Держит в воздухе"
diff --git a/mods/anomaly/code/artifacts/artefact_gravi.dm b/mods/anomaly/code/artefacts/artefact_gravi.dm
similarity index 50%
rename from mods/anomaly/code/artifacts/artefact_gravi.dm
rename to mods/anomaly/code/artefacts/artefact_gravi.dm
index 3874634bd20fa..f8131b7b613f2 100644
--- a/mods/anomaly/code/artifacts/artefact_gravi.dm
+++ b/mods/anomaly/code/artefacts/artefact_gravi.dm
@@ -1,7 +1,9 @@
/obj/item/artefact/gravi
name = "Something"
- desc = "Вы чувствуете лёгкость."
+ desc = "При подборе вы чувствуете, как тот сопротивляется вашей руке."
icon_state = "gravi"
+ need_to_process = TRUE
+ //В артефакте нет энергии/она неограничена
rect_to_interactions = list(
"Lick",
"Shake",
@@ -10,12 +12,16 @@
"Compress",
"Rub"
)
- cargo_price = 75
+ stored_energy = 0
+ max_energy = 0
+ cargo_price = 800
+ rnd_points = 5000
+ need_to_process = TRUE
-/obj/item/artefact/gravi/lick_interaction(mob/living/user)
+/obj/item/artefact/gravi/lick_interaction(mob/living/carbon/human/user)
to_chat(user,SPAN_NOTICE("На вкус как камень."))
-/obj/item/artefact/gravi/shake_interaction(mob/living/user)
+/obj/item/artefact/gravi/shake_interaction(mob/living/carbon/human/user)
if(isrobot(user))
to_chat(user,SPAN_NOTICE("Вы не регистрируете чего-либо необычного."))
else
@@ -24,19 +30,19 @@
-/obj/item/artefact/gravi/bite_interaction(mob/living/user)
+/obj/item/artefact/gravi/bite_interaction(mob/living/carbon/human/user)
to_chat(user,SPAN_NOTICE("Ощущается зубами как камень. Ничего необычного."))
-/obj/item/artefact/gravi/knock_interaction(mob/living/user)
+/obj/item/artefact/gravi/knock_interaction(mob/living/carbon/human/user)
to_chat(user,SPAN_NOTICE("При попытке постучать или ударить, рука словно отпружинивает."))
-/obj/item/artefact/gravi/compress_interaction(mob/living/user)
+/obj/item/artefact/gravi/compress_interaction(mob/living/carbon/human/user)
if(isrobot(user))
to_chat(user,SPAN_NOTICE("Обьект не поддаётся сдавливанию."))
else
to_chat(user,SPAN_NOTICE("Обьект словно камень, вообще не поддаётся сдавливанию."))
-/obj/item/artefact/gravi/rub_interaction(mob/living/user)
+/obj/item/artefact/gravi/rub_interaction(mob/living/carbon/human/user)
if(isrobot(user))
to_chat(user,SPAN_NOTICE("Обьект не реагирует."))
else
@@ -49,7 +55,9 @@
return "Обьект не реагирует"
/obj/item/artefact/gravi/urm_electro(mob/living/user)
- return "Обьект не реагирует"
+ stored_in_urm.last_interaction_id = "gravi_jumped_electro"
+ stored_in_urm.last_interaction_reward = 1000
+ return "Обьект отскакивает от места контакта в противоположную сторону."
/obj/item/artefact/gravi/urm_plasma(mob/living/user)
return "Обьект не реагирует"
@@ -65,9 +73,6 @@
-
-
-
/obj/item/artefact/gravi/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(istype(mover, /obj/item/projectile/bullet))
new /obj/item/material/shard/shrapnel/steel(get_turf(src))
@@ -76,7 +81,31 @@
/mob/living/carbon/human/handle_fall_effect(turf/landing)
- var/obj/item/artefact/gravi/artefact = locate(/obj/item/artefact/gravi) in src
- if (istype(artefact))
- return
+ var/list/result_effects = calculate_artefact_reaction(src, "Падение с высоты")
+ if(result_effects)
+ if(result_effects.Find("Защищает от падения"))
+ return
.=..()
+
+/obj/item/artefact/gravi/process_artefact_effect_to_user()
+ if(current_user.stamina < 85)
+ current_user.adjust_stamina(5)
+
+//Грави заставляет отлететь в направление, противположное текущее. Так смешнее.
+/obj/item/artefact/gravi/react_at_electra(mob/living/user)
+ . = ..()
+ var/turf/target_turf = get_turf(user)
+ var/throw_dir = turn(user.dir, 180) //Противоположное направление моба
+ for(var/i = 1, i < 2, i++)
+ target_turf = get_edge_target_turf(user, throw_dir)
+ user.throw_at(target_turf, 2, 1)
+
+/obj/item/artefact/gravi/react_at_tramplin(mob/living/user)
+ . = ..()
+ return "Не даёт кинуть"
+
+/obj/item/artefact/gravi/react_at_rvach_gib(mob/living/user)
+ return "Защищает от гиба рвачом"
+
+/obj/item/artefact/gravi/react_at_failing(mob/living/user)
+ return "Защищает от падения"
diff --git a/mods/anomaly/code/artifacts/artefact_pruzhina.dm b/mods/anomaly/code/artefacts/artefact_pruzhina.dm
similarity index 84%
rename from mods/anomaly/code/artifacts/artefact_pruzhina.dm
rename to mods/anomaly/code/artefacts/artefact_pruzhina.dm
index e34598c029b57..dd64248e2d6db 100644
--- a/mods/anomaly/code/artifacts/artefact_pruzhina.dm
+++ b/mods/anomaly/code/artefacts/artefact_pruzhina.dm
@@ -11,42 +11,44 @@
"Compress",
"Rub"
)
- //артефакт обладает зарядами
- var/charges = 0
- var/max_charges = 3
stored_energy = 10000
- max_stored_energy = 10000
+ max_energy = 10000
+ cargo_price = 750
+ rnd_points = 3000
var/datum/beam = null
//Артефакт скопирован с помощью URM
var/copy = FALSE
-/obj/item/artefact/pruzhina/lick_interaction(mob/living/user)
+/obj/item/artefact/pruzhina/lick_interaction(mob/living/carbon/human/user)
+ SSanom.bad_interactions_with_artefacts_by_players_ammount++
to_chat(user,SPAN_NOTICE("Как только вы подносите язык чуть ближе, вы чувствуете острую боль в нём, словно от проводов."))
user.electoanomaly_act(25, src, BP_HEAD)
+ sub_energy(50)
-/obj/item/artefact/pruzhina/shake_interaction(mob/living/user)
+/obj/item/artefact/pruzhina/shake_interaction(mob/living/carbon/human/user)
if(isrobot(user))
to_chat(user,SPAN_NOTICE("Ваши внешние сенсоры регистристрируют усиление электромагнитного поля."))
else
to_chat(user,SPAN_GOOD("Потреся обьект, вы чувствуете, как тот начинает щёлкать и словно оживать. Чувствуете нечто, подобное мурчанию"))
- add_charge(user)
-/obj/item/artefact/pruzhina/bite_interaction(mob/living/user)
+/obj/item/artefact/pruzhina/bite_interaction(mob/living/carbon/human/user)
to_chat(user,SPAN_NOTICE("Как только вы ухватываете обьект зубами, вы чувствуете сильнейшую боль.Глупо."))
+ sub_energy(100)
user.electoanomaly_act(75, src, BP_HEAD)
-/obj/item/artefact/pruzhina/knock_interaction(mob/living/user)
+/obj/item/artefact/pruzhina/knock_interaction(mob/living/carbon/human/user)
angry_activity()
-/obj/item/artefact/pruzhina/compress_interaction(mob/living/user)
+/obj/item/artefact/pruzhina/compress_interaction(mob/living/carbon/human/user)
if(isrobot(user))
to_chat(user,SPAN_NOTICE("При повышении напряжения в сервоприводах вашей конечности регистрируется обратная сила, возвращающая обьект в исходное состояние."))
else
to_chat(user,SPAN_NOTICE("Вы чувствуете как артефакт сопротивляется вашей попытке его сжать, словно какое-то поле отталкивает его обратно."))
-/obj/item/artefact/pruzhina/rub_interaction(mob/living/user)
- if(charges > 0)
- sub_charge(user)
+/obj/item/artefact/pruzhina/rub_interaction(mob/living/carbon/human/user)
+ if(stored_energy > 500)
+ sub_energy(500)
+ SSanom.good_interactions_with_artefacts_by_players_ammount++
if(isrobot(user))
to_chat(user,SPAN_NOTICE("Фиксируется электростатическое поле."))
else
@@ -62,12 +64,14 @@
return "Обьект не реагирует"
/obj/item/artefact/pruzhina/urm_electro(mob/living/user)
+ add_energy(150)
stored_in_urm.last_interaction_id = "pruzhina_eated_electro"
stored_in_urm.last_interaction_reward = 1000
return "Зафиксировано как обьект поглотил в себя весь переданный электрический потенциал."
/obj/item/artefact/pruzhina/urm_plasma(mob/living/user)
if(!copy)
+ SSanom.good_interactions_with_artefacts_by_players_ammount++
copy = TRUE
var/obj/item/artefact/pruzhina/borned_pruzhina = new /obj/item/artefact/pruzhina(get_turf(src))
borned_pruzhina.copy = TRUE
@@ -75,6 +79,7 @@
stored_in_urm.last_interaction_reward = 2000
return "При определённой концентрации потока плазмы Обьект начинает бурно реагировать. Он расширяется в обьёмах, пульсирует, и из одного выходит второй, точно такой же."
else
+ SSanom.bad_interactions_with_artefacts_by_players_ammount++
var/obj/anomaly/electra/three_and_three/spawned = new /obj/anomaly/electra/three_and_three/tesla(get_turf(src))
spawned.kill_later(120 SECONDS)
delete_artefact()
@@ -98,26 +103,9 @@
/obj/item/artefact/pruzhina/react_at_throw(atom/target, range, speed, mob/thrower, spin, datum/callback/callback)
create_anomaly_pruzhina(30 SECONDS)
-/obj/item/artefact/react_to_emp()
- angry_activity()
-
-/obj/item/artefact/pruzhina/proc/add_charge(mob/living/user)
- if(charges >= max_charges)
- ubercharge_pruzhina(user)
- return FALSE
- else
- charges++
- return TRUE
-
-/obj/item/artefact/pruzhina/proc/sub_charge(user)
- if(charges <= max_charges)
- charges = 0
- return FALSE
- else
- charges--
- return TRUE
/obj/item/artefact/pruzhina/proc/ubercharge_pruzhina(mob/living/user)
+ SSanom.bad_interactions_with_artefacts_by_players_ammount++
to_chat(user,SPAN_WARNING("Обьект вырывается из ваших рук уже с грозным грохотом и гудением."))
user.drop_item(src)
anchored = TRUE
@@ -147,6 +135,7 @@
/obj/item/artefact/pruzhina/angry_activity(mob/living/user)
to_chat(user,SPAN_WARNING("Вас озарила вспышка."))
+ sub_energy(200)
var/list/victims = list()
var/list/objs_not_used = list()
var/turf/T = get_turf(src)
@@ -179,3 +168,18 @@
/obj/item/cell/pruzhina/emp_act(severity)
SHOULD_CALL_PARENT(FALSE)
return
+
+//Пружина раздаст всем вокруг электроудары, если её носитель получит удар
+/obj/item/artefact/pruzhina/react_at_electra(mob/living/user)
+ if(stored_energy > 8500)
+ angry_activity()
+ add_energy(1500)
+
+/obj/item/artefact/pruzhina/react_at_emp_on_user(mob/living/user)
+ if(stored_energy > 8500)
+ angry_activity()
+ add_energy(1500)
+ return "Защищает от ЭМИ"
+
+/obj/item/artefact/pruzhina/react_at_emp()
+ angry_activity()
diff --git a/mods/anomaly/code/artifacts/artefact_svetlyak.dm b/mods/anomaly/code/artefacts/artefact_svetlyak.dm
similarity index 73%
rename from mods/anomaly/code/artifacts/artefact_svetlyak.dm
rename to mods/anomaly/code/artefacts/artefact_svetlyak.dm
index 8690e4ef1c727..f046710ad4952 100644
--- a/mods/anomaly/code/artifacts/artefact_svetlyak.dm
+++ b/mods/anomaly/code/artefacts/artefact_svetlyak.dm
@@ -11,18 +11,20 @@
"Rub"
)
var/activated_fleshka = FALSE
- var/current_heat = 0
- cargo_price = 250
+ stored_energy = 1000
+ max_energy = 1000
+ cargo_price = 800
+ rnd_points = 5000
/obj/item/artefact/svetlyak/Initialize()
. = ..()
set_light(5, 5, light_color)
-/obj/item/artefact/svetlyak/lick_interaction(mob/living/user)
+/obj/item/artefact/svetlyak/lick_interaction(mob/living/carbon/human/user)
to_chat(user,SPAN_NOTICE("Ваш язык ничего не ощущает, словно проходит насквозь.."))
-/obj/item/artefact/svetlyak/shake_interaction(mob/living/user)
+/obj/item/artefact/svetlyak/shake_interaction(mob/living/carbon/human/user)
if(activated_fleshka)
return
if(isrobot(user))
@@ -30,32 +32,27 @@
else
to_chat(user,SPAN_GOOD("Потреся обьект, вы видите, как тот начинает то усиливать свечение, то немного ослаблять его."))
activated_fleshka = TRUE
- addtimer(new Callback(src, PROC_REF(svetlyak_fleshka)), 5 SECONDS)
+ addtimer(new Callback(src, PROC_REF(svetlyak_fleshka)), 2 SECONDS)
-/obj/item/artefact/svetlyak/bite_interaction(mob/living/user)
+/obj/item/artefact/svetlyak/bite_interaction(mob/living/carbon/human/user)
to_chat(user,SPAN_NOTICE("Вы не можете ухватиться за обьект зубами, они словно проходят насквозь."))
-/obj/item/artefact/svetlyak/knock_interaction(mob/living/user)
+/obj/item/artefact/svetlyak/knock_interaction(mob/living/carbon/human/user)
to_chat(user,SPAN_NOTICE("Рука проходит сквозь обьект..."))
-/obj/item/artefact/svetlyak/compress_interaction(mob/living/user)
+/obj/item/artefact/svetlyak/compress_interaction(mob/living/carbon/human/user)
if(isrobot(user))
to_chat(user,SPAN_NOTICE("При попытке сжать конечность обратный отклик не регистрируется, конечность проходит сквозь обьект, но обьект всё ещё остаётся на вашей руке."))
else
to_chat(user,SPAN_NOTICE("Вы чувствуете словно ваша рука при попытке сжать обьект проходит сквозь него, но он всё ещё остаётся на руке."))
-/obj/item/artefact/svetlyak/rub_interaction(mob/living/user)
+/obj/item/artefact/svetlyak/rub_interaction(mob/living/carbon/human/user)
if(isrobot(user))
- to_chat(user,SPAN_NOTICE("Зрительные сенсоры регистрируют ослабление свечения [src]."))
+ to_chat(user,SPAN_NOTICE("Интенсивность свечения не меняется."))
else
- to_chat(user,SPAN_NOTICE("[src] начинает светиться не так ярко, словно успокаиваясь."))
- if(current_heat > 0)
- current_heat--
- else if(current_heat == 0)
- visible_message(SPAN_BAD("...[src] растворяется на ваших глазах, испустив последнюю, приятную для глаз вспышку."), null, 5)
- qdel(src)
+ to_chat(user,SPAN_NOTICE("Он всё так же светится."))
/obj/item/artefact/svetlyak/urm_radiation(mob/living/user)
stored_in_urm.last_interaction_id = "svetlyak_radiation"
@@ -64,7 +61,7 @@
/obj/item/artefact/svetlyak/urm_laser(mob/living/user)
stored_in_urm.last_interaction_id = "svetlyak_laser"
- stored_in_urm.last_interaction_reward = 1000
+ stored_in_urm.last_interaction_reward = 2000
return "Зафиксировано как луч продит сквозь обьект с усиленной мощностью."
/obj/item/artefact/svetlyak/urm_electro(mob/living/user)
@@ -96,12 +93,17 @@
target.flash_eyes(FLASH_PROTECTION_MAJOR)
target.Stun(5)
target.mod_confused(10)
- add_heat()
+ sub_energy(50)
activated_fleshka = FALSE
-/obj/item/artefact/svetlyak/proc/add_heat()
- current_heat++
- if(current_heat >= 2)
- var/obj/anomaly/vspishka/spawned = new /obj/anomaly/vspishka(get_turf(src))
- spawned.kill_later(300 SECONDS)
- qdel(src)
+
+//Он должен передавать удар другому, по цепочке
+/obj/item/artefact/svetlyak/react_at_electra(mob/living/user)
+ if(stored_energy > 250)
+ sub_energy(250)
+ return "Уворачивается от молнии, молния идёт дальше"
+ else
+ return "Ничего"
+
+/obj/item/artefact/svetlyak/react_at_vspishka(mob/living/user)
+ return "Защищает от ослепления"
diff --git a/mods/anomaly/code/artifacts/artefact_zjar.dm b/mods/anomaly/code/artefacts/artefact_zjar.dm
similarity index 51%
rename from mods/anomaly/code/artifacts/artefact_zjar.dm
rename to mods/anomaly/code/artefacts/artefact_zjar.dm
index 0f1393d15d1ee..4ec786f2f5af3 100644
--- a/mods/anomaly/code/artifacts/artefact_zjar.dm
+++ b/mods/anomaly/code/artefacts/artefact_zjar.dm
@@ -1,6 +1,8 @@
/obj/item/artefact/zjar
name = "Something"
+ icon_state = "fire_ball"
desc = "Тепло растекается по вашим рукам, от одного лишь вида вам становится теплее."
+ need_to_process = TRUE
rect_to_interactions = list(
"Lick",
"Shake",
@@ -9,58 +11,72 @@
"Compress",
"Rub"
)
- //у артефакта 5 "кусков"
- var/current_integrity = 5
- //Уже ремонтировался с помощью URM?
+ stored_energy = 1000
+ max_energy = 1500
+ cargo_price = 600
+ rnd_points = 5000
var/repaired = FALSE
- cargo_price = 350
- var/datum/beam = null
-/obj/item/artefact/zjar/lick_interaction(mob/living/user)
+/obj/item/artefact/zjar/lick_interaction(mob/living/carbon/human/user)
if(istype(user, /mob/living/carbon/human ))
to_chat(user,SPAN_GOOD("...он...вкусный...по вашему телу растекается тепло."))
user.bodytemperature += 50
-/obj/item/artefact/zjar/shake_interaction(mob/living/user)
+/obj/item/artefact/zjar/shake_interaction(mob/living/carbon/human/user)
to_chat(user,SPAN_NOTICE("...По ощущениям внутри словно что-то есть, но в тоже время он монолитный...шар...или овал..."))
-/obj/item/artefact/zjar/bite_interaction(mob/living/user)
+/obj/item/artefact/zjar/bite_interaction(mob/living/carbon/human/user)
to_chat(user,SPAN_GOOD("...становится жарко, но голове становится куда легче, думается свободнее и проще."))
- var/mob/living/carbon/victim = user
- victim.bodytemperature += 100
- victim.add_chemical_effect(CE_BRAIN_REGEN, 50)
-
-
-/obj/item/artefact/zjar/knock_interaction(mob/living/user)
+ user.bodytemperature += 100
+ sub_energy(100)
+ //Выдаёт реген мозга, обезбол, стимулятор
+ user.add_chemical_effect(CE_BRAIN_REGEN, 100)
+ user.add_chemical_effect(CE_PAINKILLER, 300)
+ user.add_chemical_effect(CE_STIMULANT, 50)
+ //Чинит все переломы
+ var/list/parts = list(BP_HEAD, BP_CHEST, BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT, BP_L_ARM, BP_L_HAND, BP_R_ARM,BP_R_HAND)
+ for(var/part in parts)
+ var/obj/item/organ/external/affecting = user.get_organ(part)
+ if(affecting.status &= ORGAN_BROKEN)
+ if(affecting.mend_fracture())
+ sub_energy(25)
+ to_chat(user,SPAN_NOTICE("...острая боль в [affecting] проходит..."))
+
+/obj/item/artefact/zjar/knock_interaction(mob/living/carbon/human/user)
if(istype(user, /mob/living/carbon/human ))
+ sub_energy(50)
+ SSanom.bad_interactions_with_artefacts_by_players_ammount++
to_chat(user,SPAN_BAD("Похоже, ему это не понравилось, вас неприятно ошпарило."))
user.bodytemperature += 150
user.apply_damage(15, DAMAGE_BURN, user.hand ? BP_L_HAND : BP_R_HAND)
-/obj/item/artefact/zjar/compress_interaction(mob/living/user)
+/obj/item/artefact/zjar/compress_interaction(mob/living/carbon/human/user)
to_chat(user,SPAN_NOTICE("..Как желе, но не желе, очень странные ощущения!"))
-/obj/item/artefact/zjar/rub_interaction(mob/living/user)
+/obj/item/artefact/zjar/rub_interaction(mob/living/carbon/human/user)
to_chat(user,SPAN_GOOD("Тепло, и приятно. Не хочется убирать руки от него."))
/obj/item/artefact/zjar/urm_radiation(mob/living/user)
return "Обьект не реагирует"
/obj/item/artefact/zjar/urm_laser(mob/living/user)
- if(current_integrity > 1)
- current_integrity--
+ if(stored_energy != 0)
+ sub_energy(200)
+ SSanom.bad_interactions_with_artefacts_by_players_ammount++
stored_in_urm.last_interaction_id = "zjar_damaged_by_laser"
stored_in_urm.last_interaction_reward = 1500
return "Луч лазера прожигает обьект, явно его повреждая"
else
delete_artefact()
+ SSanom.bad_interactions_with_artefacts_by_players_ammount++
stored_in_urm.artefact_inside = null
stored_in_urm.last_interaction_id = "zjar_destroyed_by_laser"
stored_in_urm.last_interaction_reward = 2500
return "Обьект прожигается на сквозь, после сдувается словно воздушный шар и пропадает."
/obj/item/artefact/zjar/urm_electro(mob/living/user)
+ sub_energy(50)
stored_in_urm.last_interaction_id = "zjar_electra"
stored_in_urm.last_interaction_reward = 500
return "Электрический удар был полностью поглощён обьектом."
@@ -69,14 +85,15 @@
return "Обьект не реагирует"
/obj/item/artefact/zjar/urm_phoron(mob/living/user)
- if(current_integrity < 5 && !repaired)
- current_integrity = 5
+ if(stored_energy != max_energy && !repaired)
+ add_energy(1000)
repaired = TRUE
stored_in_urm.last_interaction_id = "zjar_repaired"
stored_in_urm.last_interaction_reward = 2500
return "Вы наблюдаете, как недостающие часть обьекта, словно отрастают обратно"
else if(repaired)
delete_artefact()
+ SSanom.bad_interactions_with_artefacts_by_players_ammount++
stored_in_urm.artefact_inside = null
stored_in_urm.last_interaction_id = "zjar_destroyed"
stored_in_urm.last_interaction_reward = 3500
@@ -85,12 +102,38 @@
+/obj/item/artefact/zjar/process_artefact_effect_to_user()
+ if(current_user.bodytemperature < 350)
+ current_user.bodytemperature = 350
+ for(var/thing in current_user.internal_organs)
+ var/obj/item/organ/internal/I = thing
+ if(I.damage > 0)
+ sub_energy(20)
+ I.heal_damage(rand(1,5))
+
-/obj/item/artefact/zjar/Process() //чуть подогреем
- for(var/mob/living/carbon/human/victim in get_turf(src))
- victim.heal_organ_damage(0, 6)
- if(victim.bodytemperature < 360)
- victim.bodytemperature = 360
- for(var/thing in victim.internal_organs)
- var/obj/item/organ/internal/I = thing
- I.heal_damage(rand(0,1))
+/obj/item/artefact/zjar/react_at_electra(mob/living/user)
+ if(stored_energy != 0)
+ sub_energy(100)
+ visible_message(SPAN_GOOD("[src] вспыхивает красной вспышкой"),,7)
+ else
+ delete_artefact()
+ visible_message(SPAN_BAD("[src] вспыхивает ярчайшей красной вспышкой и пропадает."),,7)
+ to_chat(current_user, SPAN_GOOD("Вы чувствуете сильный, но приятный ЖАР в месте удара. Но не боль."))
+ return "Впитывает электроудар"
+
+/obj/item/artefact/zjar/react_at_rvach_gib(mob/living/user)
+ delete_artefact()
+ visible_message(SPAN_BAD("[src] вспыхивает ярчайшей красной вспышкой и пропадает."),,7)
+ return "Защищает от гиба"
+
+/obj/item/artefact/zjar/energy_changed()
+ if(stored_energy > 1000)
+ icon_state = icon_state = "fire_ball_active"
+ else if(stored_energy <= 1000)
+ icon_state = icon_state = "fire_ball"
+
+/obj/item/artefact/zjar/additional_process()
+ var/turf/my_turf = get_turf(src)
+ if(my_turf.temperature >= 500)
+ add_energy(100)
diff --git a/mods/anomaly/code/artefacts/artefact_zjemchug.dm b/mods/anomaly/code/artefacts/artefact_zjemchug.dm
new file mode 100644
index 0000000000000..7fda67470fce1
--- /dev/null
+++ b/mods/anomaly/code/artefacts/artefact_zjemchug.dm
@@ -0,0 +1,52 @@
+// [WIP]
+/obj/item/artefact/zjemchug
+ name = "Something"
+ icon_state = "zjemchug"
+ desc = "Абсолютно гладкий шар с максимально правильной формой. Чем дольше смотришь на него, тем больше сознание затмевает туман. Что-то не так."
+ need_to_process = TRUE
+ rect_to_interactions = list(
+ "Lick",
+ "Shake",
+ "Bite",
+ "Knock",
+ "Compress",
+ "Rub"
+ )
+ ///Моб, к которому привязался артефакт
+ var/mob/living/carbon/human/owner
+ stored_energy = 10000
+ max_energy = 10000
+ cargo_price = 1500 //Это крайне ценный и редкий артефакт
+ rnd_points = 10000
+
+/obj/item/artefact/zjemchug/react_to_touched(mob/living/user)
+ . = ..()
+ if(!owner)
+ deal_make_new_owner(user)
+ else
+ to_chat(user, SPAN_BAD("...Вы чувствуете, как внутри вас что-то противится..."))
+
+/obj/item/artefact/zjemchug/Process()
+ if(!(owner in get_turf(src))) //На нашем турфе нет хозяина
+ for(var/mob/living/carbon/human/target in get_turf(src))
+ to_chat(target, SPAN_BAD("Что-то пугает вас, заставляет отойти от [src]"))
+
+/obj/item/artefact/zjemchug/proc/deal_make_new_owner(mob/living/user)
+ //Предлагает человеку обьединить умы
+ var/list/choices = list("Да","Нет")
+ var/choice = input(usr, "Расслабить свой ум и прекратить сопротивление?") as null|anything in choices
+ if(choice == "Нет")
+ to_chat(user, SPAN_BAD("Вы решаете продолжить сопротивляться ему. Вы не поддадитесь."))
+ return
+ if(choice == "Да")
+ make_new_owner(user)
+
+/obj/item/artefact/zjemchug/proc/make_new_owner(mob/living/user)
+ owner = user
+ icon_state = "zjemchug_active"
+ SSanom.good_interactions_with_artefacts_by_players_ammount++
+ to_chat(user, SPAN_GOOD("Вы поддаётесь его влиянию...что-то в вас изменилось..."))
+ var/list/faculties = list("[PSI_COERCION]", "[PSI_REDACTION]", "[PSI_ENERGISTICS]", "[PSI_PSYCHOKINESIS]")
+ for(var/i = 1 to rand(2,3))
+ var/mob/living/carbon/human/human_user = user
+ human_user.set_psi_rank(pick_n_take(faculties), 5)
diff --git a/mods/anomaly/code/detectors_and_etc/beacon.dm b/mods/anomaly/code/detectors_and_etc/beacon.dm
index 572072d30be9d..0459f26c8d839 100644
--- a/mods/anomaly/code/detectors_and_etc/beacon.dm
+++ b/mods/anomaly/code/detectors_and_etc/beacon.dm
@@ -6,6 +6,12 @@
w_class = ITEM_SIZE_TINY
matter = list(MATERIAL_STEEL = 200)
+/obj/item/advanced_bolt/Crossed(O)
+ . = ..()
+ if(ishuman(usr))
+ for(var/obj/item/storage/bolt_bag/bag in usr)
+ if(bag.autocollect)
+ bag.can_be_inserted(src, usr, 0)
/obj/item/advanced_bolt/Move()
. = ..()
@@ -27,6 +33,8 @@
/obj/item/advanced_bolt/on_update_icon()
. = ..()
var/turf/current_turf = get_turf(src)
+ if(!current_turf)
+ return
if(LAZYLEN(current_turf.list_of_in_range_anomalies))
icon_state = "beacon_red"
else
@@ -46,9 +54,5 @@
/obj/item/advanced_bolt,
/obj/item/advanced_bolt,
/obj/item/advanced_bolt,
- /obj/item/advanced_bolt,
- /obj/item/advanced_bolt,
- /obj/item/advanced_bolt,
- /obj/item/advanced_bolt,
/obj/item/advanced_bolt
)
diff --git a/mods/anomaly/code/detectors_and_etc/bolt.dm b/mods/anomaly/code/detectors_and_etc/bolt.dm
index 85419334dafb9..088585a89d7da 100644
--- a/mods/anomaly/code/detectors_and_etc/bolt.dm
+++ b/mods/anomaly/code/detectors_and_etc/bolt.dm
@@ -6,6 +6,13 @@
w_class = ITEM_SIZE_TINY
matter = list(MATERIAL_STEEL = 200)
+/obj/item/bolt/Crossed(O)
+ . = ..()
+ if(ishuman(usr))
+ for(var/obj/item/storage/bolt_bag/bag in usr)
+ if(bag.autocollect)
+ bag.can_be_inserted(src, usr, 0)
+
/obj/item/storage/bolt_bag
name = "Bag with bolts"
@@ -14,10 +21,25 @@
icon_state = "bolt_bag"
allow_quick_gather = TRUE
allow_quick_empty = TRUE
- w_class = ITEM_SIZE_TINY
- max_w_class = ITEM_SIZE_LARGE
- max_storage_space = DEFAULT_BOX_STORAGE
+ w_class = ITEM_SIZE_SMALL
+ max_w_class = ITEM_SIZE_TINY
+ max_storage_space = 10
+ var/autocollect = FALSE
+
+/obj/item/storage/bolt_bag/examine(mob/user, distance, is_adjacent)
+ . = ..()
+ to_chat(user, SPAN_GOOD("Use RBM and use Toggle autocollect to toggle autocollect."))
+
+/obj/item/storage/bolt_bag/verb/toggle_autocollect()
+ set category = "Object"
+ set name = "toggle autocollect"
+ set src in usr
+ autocollect = !autocollect
+ if(autocollect)
+ to_chat(usr, SPAN_NOTICE("Now you will automaticly collect bolts and beacons in this bag."))
+ else
+ to_chat(usr, SPAN_NOTICE("Now you will NOT automaticly collect bolts and beacons in this bag."))
/obj/item/storage/bolt_bag/full_of_bolts
startswith = list(
@@ -30,10 +52,6 @@
/obj/item/bolt,
/obj/item/bolt,
/obj/item/bolt,
- /obj/item/bolt,
- /obj/item/bolt,
- /obj/item/bolt,
- /obj/item/bolt,
/obj/item/bolt
)
diff --git a/mods/anomaly/code/detectors_and_etc/deployer.dm b/mods/anomaly/code/detectors_and_etc/deployer.dm
new file mode 100644
index 0000000000000..18fbc318c4544
--- /dev/null
+++ b/mods/anomaly/code/detectors_and_etc/deployer.dm
@@ -0,0 +1,112 @@
+//Всё что делает устройство - размещает маячок (световой) при использовании
+/obj/item/beacon_deployer
+ name = "beacon deployer"
+ desc = "Special tool created for fast beacon deploys."
+ icon = 'mods/anomaly/icons/deployer.dmi'
+ icon_state = "beacon_deployer"
+ action_button_name = "Use deployer"
+ w_class = ITEM_SIZE_SMALL
+ matter = list(MATERIAL_STEEL = 2000)
+ var/stored_beacon_amount = 0
+ var/max_beacon_amount = 50
+ ///Отвечает за то, какого цвета будет размещён маячок
+ var/current_beacon_type = "Green"
+
+///Осмот
+/obj/item/beacon_deployer/examine(mob/user, distance, is_adjacent)
+ . = ..()
+ to_chat(user, SPAN_NOTICE("Its [stored_beacon_amount] inside."))
+ to_chat(user, SPAN_GOOD("Use Alt + LBM to swap flag color."))
+ to_chat(user, SPAN_GOOD("User Cntrl + LBM to unload some flags."))
+
+/obj/item/beacon_deployer/AltClick()
+ current_beacon_type = input(usr, "Choose flag color","Choose") as null|anything in list("Green", "Red", "Yellow", "Blue")
+ return TRUE
+
+/obj/item/beacon_deployer/CtrlClick()
+ deploy_beacon(usr, FALSE, 10)
+ return TRUE
+
+
+///Кнопка слева сверху для деплоера
+/obj/item/beacon_deployer/verb/use_deployer()
+ set category = "Object"
+ set name = "Use flag deployer"
+ set src in usr
+
+ if(!usr.incapacitated())
+ check_current_turf(usr)
+ usr.update_action_buttons()
+
+
+/obj/item/beacon_deployer/use_tool(obj/item/item, mob/living/user, list/click_params)
+ . = ..()
+ if(istype(item,/obj/item/stack/flag))
+ reload_deployer(user, item)
+
+///Заряжает в деплоер флаги
+/obj/item/beacon_deployer/proc/reload_deployer(mob/living/user, obj/item/stack/flag/item)
+ if(stored_beacon_amount == max_beacon_amount) //Переполнен
+ to_chat(user, SPAN_NOTICE("Deployer is full."))
+ return
+ //Определяемся, сколько передадим флажков
+ var/transfer_amount = item.amount
+ if(stored_beacon_amount + item.amount > max_beacon_amount)
+ transfer_amount = max_beacon_amount - stored_beacon_amount //Не позволит переполнить запас
+ if(transfer_amount > item.amount)
+ transfer_amount = item.amount //Не позволит взять больше, чем есть в стаке
+ item.use(transfer_amount)
+ stored_beacon_amount += transfer_amount
+ to_chat(user, SPAN_NOTICE("You inserted [transfer_amount] flags in autodeployer."))
+
+/obj/item/beacon_deployer/attack_self(mob/living/user)
+ . = ..()
+ check_current_turf(user)
+
+///Игрок использовал деплоер. Если маяка нет - поставим. Есть - заберём.
+/obj/item/beacon_deployer/proc/check_current_turf(mob/living/user)
+ if(locate(/obj/item/stack/flag) in get_turf(src))
+ for(var/obj/item/stack/flag/picked_flag in get_turf(src))
+ undeploy_beacon(user, picked_flag)
+ else
+ deploy_beacon(user)
+
+///Разобрать флаг и убрать в деплоер
+/obj/item/beacon_deployer/proc/undeploy_beacon(mob/living/user, obj/item/stack/flag/item)
+ if(item.upright)
+ item.knock_down()
+ reload_deployer(user, item)
+
+///Установить флаг из деплоера
+/obj/item/beacon_deployer/proc/deploy_beacon(mob/living/user, deploy = TRUE, deploy_amount = 1)
+ if(stored_beacon_amount <= 0)
+ to_chat(user, SPAN_BAD("Deployer is empty."))
+ return
+ if(deploy_amount > 1)
+ if(deploy_amount > stored_beacon_amount)
+ deploy_amount = stored_beacon_amount
+ var/type
+ if(current_beacon_type == "Green")
+ type = /obj/item/stack/flag/green
+ else if(current_beacon_type == "Red")
+ type = /obj/item/stack/flag/red
+ else if(current_beacon_type == "Blue")
+ type = /obj/item/stack/flag/blue
+ else if(current_beacon_type == "Yellow")
+ type = /obj/item/stack/flag/yellow
+ if(!type)
+ return
+ var/obj/item/stack/flag/spawned_flag = new type(get_turf(src))
+ spawned_flag.amount = deploy_amount
+ stored_beacon_amount -= deploy_amount
+ if(deploy)
+ spawned_flag.set_up()
+ playsound(src, 'sound/items/shuttle_beacon_complete.ogg', 50)
+
+
+
+
+
+
+/obj/item/beacon_deployer/full
+ stored_beacon_amount = 50
diff --git a/mods/anomaly/code/detectors_and_etc/detector.dm b/mods/anomaly/code/detectors_and_etc/detector.dm
index ef6d6150f2841..cca3e9fd7d440 100644
--- a/mods/anomaly/code/detectors_and_etc/detector.dm
+++ b/mods/anomaly/code/detectors_and_etc/detector.dm
@@ -1,30 +1,53 @@
/obj/anomaly
///Шанс, что аномалию найдут детектором при условии что у пользователя максимальный навык науки
var/chance_to_be_detected = 100
+ //Спрайт обнаруженной аномалии. Смотри прок get_detection_icon(). Этот спрайт - стандартный для любых аномок.
+ var/detection_icon_state = "any_anomaly"
+ ///Уровень навыка в науке, требуемый, чтоб персонаж смог понять тип аномалии
+ var/detection_skill_req = SKILL_TRAINED
/obj/item/clothing/gloves/anomaly_detector
name = "anomaly detection device"
- desc = "TEST."
+ desc = "A complex technological device designed taking into account all possible dangers of anomalies."
icon = 'mods/anomaly/icons/detector.dmi'
icon_state = "detector_idle"
+ //Базовое название детектора используемое в коде смена иконок.
+ var/detector_basic_name = "detector"
action_button_name = "Scan anomalies"
var/last_peek_time = 0
- var/peek_delay = 0.2 SECONDS
+ var/peek_delay = 1 SECONDS
var/show_anomalies_delay = 10 SECONDS
var/in_tesla_range = FALSE
var/in_scanning = FALSE
var/last_scan_time = 0
var/result_tesla = FALSE
+ //Некоторые детекторы могут вовсе не замечать некоторые аномалии. Укажите их теги, если потребутеся (Переменная anomaly_tag)
+ var/list/blacklisted_amomalies = list()
+
+/obj/item/clothing/gloves/anomaly_detector/proc/switch_toggle()
+ if(!is_processing)
+ to_chat(usr, SPAN_NOTICE("Вы включили детектор"))
+ START_PROCESSING(SSanom, src)
+ SSanom.processing_ammount++
+ else
+ to_chat(usr, SPAN_NOTICE("Вы выключили детектор"))
+ STOP_PROCESSING(SSanom, src)
+ SSanom.processing_ammount--
-/obj/item/clothing/gloves/anomaly_detector/Initialize()
- . = ..()
- START_PROCESSING(SSanom, src)
/obj/item/clothing/gloves/anomaly_detector/attack_self(mob/living/user)
. = ..()
+ if(!is_processing)
+ to_chat(usr, SPAN_BAD("Сперва включите устройство."))
+ return
try_found_anomalies(user)
+/obj/item/clothing/gloves/anomaly_detector/CtrlClick(mob/user)
+ . = ..()
+ switch_toggle()
+ return TRUE
+
/obj/item/clothing/gloves/anomaly_detector/Process()
check_electrostatic()
update_icon()
@@ -32,28 +55,28 @@
/obj/item/clothing/gloves/anomaly_detector/on_update_icon()
.=..()
if(!in_tesla_range && !in_scanning)
- icon_state = "detector_idle"
+ icon_state = "[detector_basic_name]_idle"
else if(in_tesla_range && !in_scanning)
- icon_state = "detector_idle_and_peak"
+ icon_state = "[detector_basic_name]_idle_and_peak"
else if(!in_tesla_range && in_scanning)
- icon_state = "detector_scanning"
+ icon_state = "[detector_basic_name]_scanning"
else if(in_tesla_range && in_scanning)
- icon_state = "detector_scanning_and_peak"
+ icon_state = "[detector_basic_name]_scanning_and_peak"
-/obj/item/clothing/gloves/anomaly_detector/verb/scan()
+/obj/item/clothing/gloves/anomaly_detector/verb/scan_anomalies()
set category = "Object"
- set name = "Scan anomalies with detector"
+ set name = "Scan anomalies"
set src in usr
if(!usr.incapacitated())
try_found_anomalies(usr)
usr.update_action_buttons()
-
/obj/item/clothing/gloves/anomaly_detector/proc/check_electrostatic()
- if(world.time - last_scan_time >= peek_delay )
- last_peek_time = world.time
+ if(world.time - last_peek_time < peek_delay )
+ return
+ last_peek_time = world.time
var/turf/cur_turf = get_turf(src)
//Проверяем, турф на котором мы находимся находится в зоне поражения?
if(LAZYLEN(cur_turf.list_of_in_range_anomalies))
@@ -70,20 +93,21 @@
/obj/item/clothing/gloves/anomaly_detector/examine(mob/user, distance, is_adjacent)
. = ..()
- to_chat(user, SPAN_GOOD("Use LBM in anomaly scan mode for search anomalies, or use action button."))
+ to_chat(user, SPAN_GOOD("Жмите ЛКМ когда включен, для сканирования, или жмите на кнопку слева сверху."))
+ to_chat(user, SPAN_GOOD("Жмите Контрол + ЛКМ чтоб включить/выключить устройство."))
///Пользователь проводит поиск при помощи сканера
/obj/item/clothing/gloves/anomaly_detector/proc/try_found_anomalies(mob/living/user)
if((user.r_hand != src && user.l_hand !=src) && (wearer && wearer.gloves != src) )
- to_chat(user, SPAN_BAD("You cant reach device."))
+ to_chat(user, SPAN_BAD("Не дотягиваюсь до детектора."))
return
if(!user.skill_check(SKILL_SCIENCE, SKILL_BASIC))
- to_chat(user, SPAN_BAD("I dont know how use this function of this device."))
+ to_chat(user, SPAN_BAD("Понятия не имею как им пользоваться."))
return
//Мы проверили, есть ли у пользователя базовый навык НАУКИ.
// Снижаем 1.2 секунды сканирования за каждый пункт науки у персонажа
var/user_science_lvl = user.get_skill_value(SKILL_SCIENCE)
- var/time_to_scan = (10 - (1.2 * user_science_lvl)) SECONDS
+ var/time_to_scan = (20 - (2 * user_science_lvl)) SECONDS
var/scan_radius = (4 + user_science_lvl) //макс радиус - 9 "квадратов"
in_scanning = TRUE
update_icon()
@@ -101,11 +125,18 @@
//Список разрешённых для показа игроку аномалий
var/list/allowed_anomalies = list()
for(var/obj/anomaly/choosed_anomaly in objs)
- var/chance_to_find = (user_science_lvl * 20) - (100 - choosed_anomaly.chance_to_be_detected)
- if(prob(chance_to_find))
- LAZYADD(allowed_anomalies, choosed_anomaly)
- var/flick_time = (1 + (user_science_lvl * 2))SECONDS
- show_anomalies(user, flick_time, allowed_anomalies)
+ //Если аномалия в блэклисте детектора - игнорируем аномалию
+ if(choosed_anomaly.anomaly_tag in blacklisted_amomalies)
+ continue
+ if(!choosed_anomaly.is_helper) //Вспомогательные части аномалий нас не интересуют
+ var/chance_to_find = (user_science_lvl * 20) - (100 - choosed_anomaly.chance_to_be_detected)
+ if(prob(chance_to_find))
+ LAZYADD(allowed_anomalies, choosed_anomaly) //Добавляем саму аномалию
+ //Если у неё есть вспомогательные части - добавляем её вспомогательные части
+ if(choosed_anomaly.multitile)
+ for(var/obj/anomaly/choosed_part in choosed_anomaly.list_of_parts)
+ LAZYADD(allowed_anomalies, choosed_part)
+ show_anomalies(user, time_to_scan, allowed_anomalies)
if(LAZYLEN(allowed_anomalies))
flick("detector_detected_anomalies", src)
usr.update_action_buttons()
@@ -115,29 +146,29 @@
usr.update_action_buttons()
-/proc/show_anomalies(mob/viewer, flick_time, allowed_anomalies)
+
+///Показывает игроку аномалии, которые он обнаружил детектером
+/proc/show_anomalies(mob/living/viewer, flick_time, allowed_anomalies)
if(!ismob(viewer) || !viewer.client)
return
- var/list/t_ray_images = list()
+ var/user_science_lvl = viewer.get_skill_value(SKILL_SCIENCE)
+ var/list/list_of_showed_anomalies = list()
for(var/obj/anomaly/in_turf_atom in allowed_anomalies)
var/turf/T = get_turf(in_turf_atom)
- var/image/I = image(icon = 'mods/anomaly/icons/effects.dmi',loc = T,icon_state = "none")
- var/mutable_appearance/MA = new(in_turf_atom)
- MA.alpha = 255
- MA.dir = in_turf_atom.dir
- MA.plane = FLOAT_PLANE
- I.layer = HUD_ABOVE_ITEM_LAYER
- I.appearance = MA
- t_ray_images += I
+ var/image/I
+ if(user_science_lvl >= in_turf_atom.detection_skill_req)
+ I = image(icon = 'mods/anomaly/icons/detection_icon.dmi',loc = T, icon_state = in_turf_atom.get_detection_icon())
+ else
+ I = image(icon = 'mods/anomaly/icons/detection_icon.dmi',loc = T, icon_state = in_turf_atom.detection_icon_state)
+ I.layer = EFFECTS_ABOVE_LIGHTING_PLANE
+ list_of_showed_anomalies += I
- for(var/image/choosed_image in t_ray_images)
- choosed_image.icon_state = "none"
- if(length(t_ray_images))
- flick_overlay(t_ray_images, list(viewer.client), flick_time)
+ if(length(list_of_showed_anomalies))
+ flick_overlay(list_of_showed_anomalies, list(viewer.client), flick_time)
/obj/item/paper/sierra/exploration
name = "new dangers"
- info = "
NSV Sierra
Новые опасности
Одна из последних экспедиций вернулась с новой информацией, и ранениями. Согласно последнему отчёту, экспедиционный отряд наткнулся на некую аномальную активность на одной из планет. Научно исследовательский отдел выделил вашему отряду дополнительное снаряжение и модифицировал сканеры Саcпаровой, добавив им АЛЬТЕРНАТИВНЫЙ режим. Советуем проявлять огромную осторожность при работе на планетах. Удачи.
This paper has been stamped by the Research&Development department."
+ info = "
NSV Sierra
Новые опасности
Одна из последних экспедиций вернулась с новой информацией, и ранениями. Согласно последнему отчёту, экспедиционный отряд наткнулся на некую аномальную активность на одной из планет. Научно исследовательский отдел выделил вашему отряду дополнительное снаряжение в виде маячков, коллекторов аномальных образований, детектора аномальной активности и раздатчика флагов. Советуем проявлять огромную осторожность при работе на планетах. Удачи.
\ No newline at end of file
+
diff --git a/nano/templates/hardsuit.tmpl b/nano/templates/hardsuit.tmpl
index e1c1e14e71de4..4fa2a206091f7 100644
--- a/nano/templates/hardsuit.tmpl
+++ b/nano/templates/hardsuit.tmpl
@@ -1,11 +1,11 @@
-